[cfe-commits] r76522 - in /cfe/trunk: lib/Analysis/CFG.cpp test/Analysis/dead-stores.c
Mike Stump
mrs at apple.com
Mon Jul 20 17:38:57 PDT 2009
Author: mrs
Date: Mon Jul 20 19:38:52 2009
New Revision: 76522
URL: http://llvm.org/viewvc/llvm-project?rev=76522&view=rev
Log:
Wire up CFG improvements for while when the condition is known.
Modified:
cfe/trunk/lib/Analysis/CFG.cpp
cfe/trunk/test/Analysis/dead-stores.c
Modified: cfe/trunk/lib/Analysis/CFG.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFG.cpp?rev=76522&r1=76521&r2=76522&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/CFG.cpp (original)
+++ cfe/trunk/lib/Analysis/CFG.cpp Mon Jul 20 19:38:52 2009
@@ -701,7 +701,7 @@
}
CFGBlock* CFGBuilder::VisitIfStmt(IfStmt* I) {
- // See if this is a known constant first.
+ // See if this is a known constant.
bool KnownTrue = false;
bool KnownFalse = false;
Expr::EvalResult Result;
@@ -1102,6 +1102,18 @@
// "while" is a control-flow statement. Thus we stop processing the current
// block.
+ // See if this is a known constant.
+ bool KnownTrue = false;
+ bool KnownFalse = false;
+ Expr::EvalResult Result;
+ if (W->getCond()->Evaluate(Result, *Context)
+ && Result.Val.isInt()) {
+ if (Result.Val.getInt().getBoolValue())
+ KnownTrue = true;
+ else
+ KnownFalse = true;
+ }
+
CFGBlock* LoopSuccessor = NULL;
if (Block) {
@@ -1170,13 +1182,21 @@
return 0;
}
- // Add the loop body entry as a successor to the condition.
- ExitConditionBlock->addSuccessor(BodyBlock);
+ if (KnownFalse)
+ ExitConditionBlock->addSuccessor(0);
+ else {
+ // Add the loop body entry as a successor to the condition.
+ ExitConditionBlock->addSuccessor(BodyBlock);
+ }
}
- // Link up the condition block with the code that follows the loop. (the
- // false branch).
- ExitConditionBlock->addSuccessor(LoopSuccessor);
+ if (KnownTrue)
+ ExitConditionBlock->addSuccessor(0);
+ else {
+ // Link up the condition block with the code that follows the loop. (the
+ // false branch).
+ ExitConditionBlock->addSuccessor(LoopSuccessor);
+ }
// There can be no more statements in the condition block since we loop back
// to this block. NULL out Block to force lazy creation of another block.
Modified: cfe/trunk/test/Analysis/dead-stores.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/dead-stores.c?rev=76522&r1=76521&r2=76522&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/dead-stores.c (original)
+++ cfe/trunk/test/Analysis/dead-stores.c Mon Jul 20 19:38:52 2009
@@ -199,6 +199,8 @@
int y8 = 4;
int y9 = 4;
int y10 = 4;
+ int y11 = 4;
+ int y12 = 4;
++x; // expected-warning{{never read}}
++y1;
@@ -211,6 +213,8 @@
++y8;
++y9;
++y10;
+ ++y11;
+ ++y12;
switch (j) {
case 1:
@@ -265,5 +269,18 @@
case 9:
(void)(1 || x);
(void)y10;
+ break;
+ case 10:
+ while (1) {
+ (void)y11;
+ }
+ (void)x;
+ break;
+ case 11:
+ while (0) {
+ (void)x;
+ }
+ (void)y12;
+ break;
}
}
More information about the cfe-commits
mailing list