jdoerfert added a comment. In D86844#2484679 <https://reviews.llvm.org/D86844#2484679>, @xbolva00 wrote:
> In D86844#2484639 <https://reviews.llvm.org/D86844#2484639>, @atmnpatel wrote: > >> In D86844#2484568 <https://reviews.llvm.org/D86844#2484568>, @fhahn wrote: >> >>> In D86844#2481922 <https://reviews.llvm.org/D86844#2481922>, @xbolva00 >>> wrote: >>> >>>> int a, b; >>>> >>>> int f(void) { >>>> while (1) { >>>> if (a != b) return 1; >>>> } >>>> return 0; >>>> } >>>> >>>> int g(int a, int b) { >>>> while (1) { >>>> if (a != b) return 1; >>>> } >>>> return 0; >>>> } >>>> >>>> LLVM does not catch these cases; gcc does. >>>> >>>> https://godbolt.org/z/jW7son >>> >>> Looks like `must progress` does not get added? If it gets added to the IR >>> the loops get removed: https://godbolt.org/z/77v17P >> >> I might be misunderstanding the standard here but since 1 is a non-zero >> constant expression, it can't be assumed to terminate by the implementation >> right? The relevant section from C11 at least is "An iteration statement >> whose controlling expression is not a constant expression that performs >> [explanation of what it deems as progress] may be assumed by the >> implementation to terminate" (C11 6.8.5 p6). I think these cases fall >> outside of the scope of this particular change ... > > For C yes, but are there such rules for C++? GCC in c++ mode does not check > for non-zero constant expr and happily performs this optimization. @xbolva00 want to provide a follow up patch then :) ? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D86844/new/ https://reviews.llvm.org/D86844 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits