[PATCH] D94366: [Clang] Emit mustprogress for infinite C++ loops

2021-07-05 Thread Florian Hahn via Phabricator via cfe-commits
fhahn requested changes to this revision.
fhahn added a comment.
This revision now requires changes to proceed.

I think this has been addressed by some commits a while ago. Marking as changes 
requested to clear up review queue. Please feel free to update the patch in 
case there’s anything I missed.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D94366/new/

https://reviews.llvm.org/D94366

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D94366: [Clang] Emit mustprogress for infinite C++ loops

2021-01-16 Thread Dávid Bolvanský via Phabricator via cfe-commits
xbolva00 added inline comments.



Comment at: clang/test/CodeGen/attr-mustprogress-1.cpp:32
 //
 void f1() {
   for (; 1;)

Test for (; 42; )?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D94366/new/

https://reviews.llvm.org/D94366

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D94366: [Clang] Emit mustprogress for infinite C++ loops

2021-01-16 Thread Dávid Bolvanský via Phabricator via cfe-commits
xbolva00 added inline comments.



Comment at: clang/lib/CodeGen/CGStmt.cpp:797
   if (llvm::ConstantInt *C = dyn_cast(BoolCondVal)) {
 if (C->isOne()) {
   EmitBoolCondBranch = false;

Anything non-zero?



Comment at: clang/test/CodeGen/attr-mustprogress-1.cpp:118
 void w1() {
   while (1)
 ;

Can you add test for eg. while (42) ?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D94366/new/

https://reviews.llvm.org/D94366

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D94366: [Clang] Emit mustprogress for infinite C++ loops

2021-01-09 Thread Atmn Patel via Phabricator via cfe-commits
atmnpatel updated this revision to Diff 315639.
atmnpatel added a comment.

`while(1)` case was mishandled for C++11 onwards, fixed now.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D94366/new/

https://reviews.llvm.org/D94366

Files:
  clang/lib/CodeGen/CGStmt.cpp
  clang/test/CodeGen/attr-mustprogress-1.cpp

Index: clang/test/CodeGen/attr-mustprogress-1.cpp
===
--- clang/test/CodeGen/attr-mustprogress-1.cpp
+++ clang/test/CodeGen/attr-mustprogress-1.cpp
@@ -7,24 +7,25 @@
 int a = 0;
 int b = 0;
 
-// CHECK: Function Attrs: noinline nounwind optnone
+// CHECK: Function Attrs: noinline nounwind optnone mustprogress
 // CHECK-LABEL: @_Z2f0v(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:br label [[FOR_COND:%.*]]
 // CHECK:   for.cond:
-// CHECK-NOT:br label [[FOR_COND]], !llvm.loop !{{.*}}
+// CHECK-NEXT:br label [[FOR_COND]], [[LOOP2:!llvm.loop !.*]]
+//
 void f0() {
   for (; ;) ;
 }
 
-// CHECK: Function Attrs: noinline nounwind optnone
+// CHECK: Function Attrs: noinline nounwind optnone mustprogress
 // CHECK-LABEL: @_Z2f1v(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:br label [[FOR_COND:%.*]]
 // CHECK:   for.cond:
 // CHECK-NEXT:br i1 true, label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
 // CHECK:   for.body:
-// CHECK-NEXT:br label [[FOR_COND]]
+// CHECK-NEXT:br label [[FOR_COND]], [[LOOP4:!llvm.loop !.*]]
 // CHECK:   for.end:
 // CHECK-NEXT:ret void
 //
@@ -43,7 +44,7 @@
 // CHECK-NEXT:[[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
 // CHECK-NEXT:br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
 // CHECK:   for.body:
-// CHECK-NEXT:br label [[FOR_COND]], [[LOOP2:!llvm.loop !.*]]
+// CHECK-NEXT:br label [[FOR_COND]], [[LOOP5:!llvm.loop !.*]]
 // CHECK:   for.end:
 // CHECK-NEXT:ret void
 //
@@ -52,14 +53,14 @@
 ;
 }
 
-// CHECK: Function Attrs: noinline nounwind optnone
+// CHECK: Function Attrs: noinline nounwind optnone mustprogress
 // CHECK-LABEL: @_Z1Fv(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:br label [[FOR_COND:%.*]]
 // CHECK:   for.cond:
 // CHECK-NEXT:br i1 true, label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
 // CHECK:   for.body:
-// CHECK-NEXT:br label [[FOR_COND]]
+// CHECK-NEXT:br label [[FOR_COND]], [[LOOP6:!llvm.loop !.*]]
 // CHECK:   for.end:
 // CHECK-NEXT:br label [[FOR_COND1:%.*]]
 // CHECK:   for.cond1:
@@ -68,7 +69,7 @@
 // CHECK-NEXT:[[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
 // CHECK-NEXT:br i1 [[CMP]], label [[FOR_BODY2:%.*]], label [[FOR_END3:%.*]]
 // CHECK:   for.body2:
-// CHECK-NEXT:br label [[FOR_COND1]], [[LOOP4:!llvm.loop !.*]]
+// CHECK-NEXT:br label [[FOR_COND1]], [[LOOP7:!llvm.loop !.*]]
 // CHECK:   for.end3:
 // CHECK-NEXT:ret void
 //
@@ -79,7 +80,7 @@
 ;
 }
 
-// CHECK: Function Attrs: noinline nounwind optnone
+// CHECK: Function Attrs: noinline nounwind optnone mustprogress
 // CHECK-LABEL: @_Z2F2v(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:br label [[FOR_COND:%.*]]
@@ -89,13 +90,13 @@
 // CHECK-NEXT:[[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
 // CHECK-NEXT:br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
 // CHECK:   for.body:
-// CHECK-NEXT:br label [[FOR_COND]], [[LOOP5:!llvm.loop !.*]]
+// CHECK-NEXT:br label [[FOR_COND]], [[LOOP8:!llvm.loop !.*]]
 // CHECK:   for.end:
 // CHECK-NEXT:br label [[FOR_COND1:%.*]]
 // CHECK:   for.cond1:
 // CHECK-NEXT:br i1 true, label [[FOR_BODY2:%.*]], label [[FOR_END3:%.*]]
 // CHECK:   for.body2:
-// CHECK-NEXT:br label [[FOR_COND1]]
+// CHECK-NEXT:br label [[FOR_COND1]], [[LOOP9:!llvm.loop !.*]]
 // CHECK:   for.end3:
 // CHECK-NEXT:ret void
 //
@@ -106,12 +107,12 @@
 ;
 }
 
-// CHECK: Function Attrs: noinline nounwind optnone
+// CHECK: Function Attrs: noinline nounwind optnone mustprogress
 // CHECK-LABEL: @_Z2w1v(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:br label [[WHILE_BODY:%.*]]
 // CHECK:   while.body:
-// CHECK-NEXT:br label [[WHILE_BODY]]
+// CHECK-NEXT:br label [[WHILE_BODY]], [[LOOP10:!llvm.loop !.*]]
 //
 void w1() {
   while (1)
@@ -128,7 +129,7 @@
 // CHECK-NEXT:[[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
 // CHECK-NEXT:br i1 [[CMP]], label [[WHILE_BODY:%.*]], label [[WHILE_END:%.*]]
 // CHECK:   while.body:
-// CHECK-NEXT:br label [[WHILE_COND]], [[LOOP6:!llvm.loop !.*]]
+// CHECK-NEXT:br label [[WHILE_COND]], [[LOOP11:!llvm.loop !.*]]
 // CHECK:   while.end:
 // CHECK-NEXT:ret void
 //
@@ -137,7 +138,7 @@
 ;
 }
 
-// CHECK: Function Attrs: noinline nounwind optnone
+// CHECK: Function Attrs: noinline nounwind optnone mustprogress
 // CHECK-LABEL: @_Z1Wv(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:br label [[WHILE_COND:%.*]]
@@ -147,11 +148,11 @@
 // CHECK-NEXT:[[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
 // CHECK-NEXT:   

[PATCH] D94366: [Clang] Emit mustprogress for infinite C++ loops

2021-01-09 Thread Atmn Patel via Phabricator via cfe-commits
atmnpatel created this revision.
atmnpatel added reviewers: fhahn, jdoerfert, xbolva00.
atmnpatel requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Currently, clang does not emit the `mustprogress` loop or function
attribute for loops with non-zero constant conditionals. Based on recent
discussion in D86844  and D86841 
, it seems that it would be preferable to
emit these attributes to adhere more tightly to the C++ standard as gcc
does.

I will be pushing a patch to add `-ffinite-loops` and `-fno-finite-loops` to
clang to provide more control over this momentarily.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D94366

Files:
  clang/lib/CodeGen/CGStmt.cpp
  clang/test/CodeGen/attr-mustprogress-1.cpp

Index: clang/test/CodeGen/attr-mustprogress-1.cpp
===
--- clang/test/CodeGen/attr-mustprogress-1.cpp
+++ clang/test/CodeGen/attr-mustprogress-1.cpp
@@ -7,24 +7,25 @@
 int a = 0;
 int b = 0;
 
-// CHECK: Function Attrs: noinline nounwind optnone
+// CHECK: Function Attrs: noinline nounwind optnone mustprogress
 // CHECK-LABEL: @_Z2f0v(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:br label [[FOR_COND:%.*]]
 // CHECK:   for.cond:
-// CHECK-NOT:br label [[FOR_COND]], !llvm.loop !{{.*}}
+// CHECK-NEXT:br label [[FOR_COND]], [[LOOP2:!llvm.loop !.*]]
+//
 void f0() {
   for (; ;) ;
 }
 
-// CHECK: Function Attrs: noinline nounwind optnone
+// CHECK: Function Attrs: noinline nounwind optnone mustprogress
 // CHECK-LABEL: @_Z2f1v(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:br label [[FOR_COND:%.*]]
 // CHECK:   for.cond:
 // CHECK-NEXT:br i1 true, label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
 // CHECK:   for.body:
-// CHECK-NEXT:br label [[FOR_COND]]
+// CHECK-NEXT:br label [[FOR_COND]], [[LOOP4:!llvm.loop !.*]]
 // CHECK:   for.end:
 // CHECK-NEXT:ret void
 //
@@ -43,7 +44,7 @@
 // CHECK-NEXT:[[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
 // CHECK-NEXT:br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
 // CHECK:   for.body:
-// CHECK-NEXT:br label [[FOR_COND]], [[LOOP2:!llvm.loop !.*]]
+// CHECK-NEXT:br label [[FOR_COND]], [[LOOP5:!llvm.loop !.*]]
 // CHECK:   for.end:
 // CHECK-NEXT:ret void
 //
@@ -52,14 +53,14 @@
 ;
 }
 
-// CHECK: Function Attrs: noinline nounwind optnone
+// CHECK: Function Attrs: noinline nounwind optnone mustprogress
 // CHECK-LABEL: @_Z1Fv(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:br label [[FOR_COND:%.*]]
 // CHECK:   for.cond:
 // CHECK-NEXT:br i1 true, label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
 // CHECK:   for.body:
-// CHECK-NEXT:br label [[FOR_COND]]
+// CHECK-NEXT:br label [[FOR_COND]], [[LOOP6:!llvm.loop !.*]]
 // CHECK:   for.end:
 // CHECK-NEXT:br label [[FOR_COND1:%.*]]
 // CHECK:   for.cond1:
@@ -68,7 +69,7 @@
 // CHECK-NEXT:[[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
 // CHECK-NEXT:br i1 [[CMP]], label [[FOR_BODY2:%.*]], label [[FOR_END3:%.*]]
 // CHECK:   for.body2:
-// CHECK-NEXT:br label [[FOR_COND1]], [[LOOP4:!llvm.loop !.*]]
+// CHECK-NEXT:br label [[FOR_COND1]], [[LOOP7:!llvm.loop !.*]]
 // CHECK:   for.end3:
 // CHECK-NEXT:ret void
 //
@@ -79,7 +80,7 @@
 ;
 }
 
-// CHECK: Function Attrs: noinline nounwind optnone
+// CHECK: Function Attrs: noinline nounwind optnone mustprogress
 // CHECK-LABEL: @_Z2F2v(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:br label [[FOR_COND:%.*]]
@@ -89,13 +90,13 @@
 // CHECK-NEXT:[[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
 // CHECK-NEXT:br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
 // CHECK:   for.body:
-// CHECK-NEXT:br label [[FOR_COND]], [[LOOP5:!llvm.loop !.*]]
+// CHECK-NEXT:br label [[FOR_COND]], [[LOOP8:!llvm.loop !.*]]
 // CHECK:   for.end:
 // CHECK-NEXT:br label [[FOR_COND1:%.*]]
 // CHECK:   for.cond1:
 // CHECK-NEXT:br i1 true, label [[FOR_BODY2:%.*]], label [[FOR_END3:%.*]]
 // CHECK:   for.body2:
-// CHECK-NEXT:br label [[FOR_COND1]]
+// CHECK-NEXT:br label [[FOR_COND1]], [[LOOP9:!llvm.loop !.*]]
 // CHECK:   for.end3:
 // CHECK-NEXT:ret void
 //
@@ -106,7 +107,7 @@
 ;
 }
 
-// CHECK: Function Attrs: noinline nounwind optnone
+// CHECK: Function Attrs: noinline nounwind optnone mustprogress
 // CHECK-LABEL: @_Z2w1v(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:br label [[WHILE_BODY:%.*]]
@@ -128,7 +129,7 @@
 // CHECK-NEXT:[[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
 // CHECK-NEXT:br i1 [[CMP]], label [[WHILE_BODY:%.*]], label [[WHILE_END:%.*]]
 // CHECK:   while.body:
-// CHECK-NEXT:br label [[WHILE_COND]], [[LOOP6:!llvm.loop !.*]]
+// CHECK-NEXT:br label [[WHILE_COND]], [[LOOP10:!llvm.loop !.*]]
 // CHECK:   while.end:
 // CHECK-NEXT:ret void
 //
@@ -137,7 +138,7 @@
 ;
 }