]> granicus.if.org Git - clang/commitdiff
Revert r193994 and part of r193995
authorJustin Bogner <mail@justinbogner.com>
Fri, 22 Nov 2013 10:20:43 +0000 (10:20 +0000)
committerJustin Bogner <mail@justinbogner.com>
Fri, 22 Nov 2013 10:20:43 +0000 (10:20 +0000)
Not long ago I made the CodeGen of for loops simplify the condition at
-O0 in the same way we do for if and conditionals. Unfortunately this
ties how loops and simple conditions work together too tightly, which
makes features such as instrumentation based PGO awkward.

Ultimately, we should find a more general way to simplify the logic in
a given condition, but for now we'll just avoid using EmitBranchOnBool
for loops, like we already do for while and do loops.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@195438 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGStmt.cpp
test/CodeGen/branch-on-bool.c

index 1d91e926865588c797534183dbba47f47ab64616..8325dddbb8af9cccb0ab91890c79e1207766c227 100644 (file)
@@ -657,7 +657,8 @@ void CodeGenFunction::EmitForStmt(const ForStmt &S) {
 
     // C99 6.8.5p2/p4: The first substatement is executed if the expression
     // compares unequal to 0.  The condition must be a scalar type.
-    EmitBranchOnBoolExpr(S.getCond(), ForBody, ExitBlock);
+    llvm::Value *BoolCondVal = EvaluateExprAsBool(S.getCond());
+    Builder.CreateCondBr(BoolCondVal, ForBody, ExitBlock);
 
     if (ExitBlock != LoopExit.getBlock()) {
       EmitBlock(ExitBlock);
@@ -737,7 +738,8 @@ void CodeGenFunction::EmitCXXForRangeStmt(const CXXForRangeStmt &S) {
 
   // The body is executed if the expression, contextually converted
   // to bool, is true.
-  EmitBranchOnBoolExpr(S.getCond(), ForBody, ExitBlock);
+  llvm::Value *BoolCondVal = EvaluateExprAsBool(S.getCond());
+  Builder.CreateCondBr(BoolCondVal, ForBody, ExitBlock);
 
   if (ExitBlock != LoopExit.getBlock()) {
     EmitBlock(ExitBlock);
index 78dae1b1fd78c7b22e38c21b570d7023f97fc380..98a3845fba2846419bfa1c801f7e875421e38f7b 100644 (file)
@@ -12,11 +12,3 @@ void fold_if(int a, int b) {
   else
     bar();
 }
-
-void fold_for(int a, int b) {
-  // CHECK: define {{.*}} @fold_for(
-  // CHECK-NOT: = phi
-  // CHECK: }
-  for (int i = 0; a && i < b; ++i) foo();
-  for (int i = 0; a || i < b; ++i) bar();
-}