AllocaInst can't return a null pointer. Fixes missed optimization
authorNick Lewycky <nicholas@mxc.ca>
Sun, 22 Oct 2006 19:53:27 +0000 (19:53 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Sun, 22 Oct 2006 19:53:27 +0000 (19:53 +0000)
opportunity pointed out by Andrew Lewycky.

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

lib/Transforms/Scalar/PredicateSimplifier.cpp
test/Transforms/PredicateSimplifier/predsimplify.ll

index 7e59352d32c54b42de437051830da8e2fa879b4c..4d86f6aa46ce1c7b26cf91e2dbe16bd15ec534d5 100644 (file)
@@ -31,6 +31,7 @@
 #define DEBUG_TYPE "predsimplify"
 #include "llvm/Transforms/Scalar.h"
 #include "llvm/Constants.h"
+#include "llvm/DerivedTypes.h"
 #include "llvm/Instructions.h"
 #include "llvm/Pass.h"
 #include "llvm/ADT/Statistic.h"
@@ -446,6 +447,7 @@ namespace {
       void visitBranchInst(BranchInst &BI);
       void visitSwitchInst(SwitchInst &SI);
 
+      void visitAllocaInst(AllocaInst &AI);
       void visitLoadInst(LoadInst &LI);
       void visitStoreInst(StoreInst &SI);
       void visitBinaryOperator(BinaryOperator &BO);
@@ -712,6 +714,10 @@ void PredicateSimplifier::Forwards::visitSwitchInst(SwitchInst &SI) {
   }
 }
 
+void PredicateSimplifier::Forwards::visitAllocaInst(AllocaInst &AI) {
+  KP.addNotEqual(Constant::getNullValue(AI.getType()), &AI);
+}
+
 void PredicateSimplifier::Forwards::visitLoadInst(LoadInst &LI) {
   Value *Ptr = LI.getPointerOperand();
   KP.addNotEqual(Constant::getNullValue(Ptr->getType()), Ptr);
index 89d5d4ce4982b4c00b00367826f7512e3c5763d8..af6cd155a8e09b3664b43e34bb9c7577c72065ba 100644 (file)
@@ -1,5 +1,5 @@
 ; RUN: llvm-as < %s | opt -predsimplify -instcombine -simplifycfg | llvm-dis | grep -v declare | not grep fail &&
-; RUN: llvm-as < %s | opt -predsimplify -instcombine -simplifycfg | llvm-dis | grep -v declare | grep pass | wc -l | grep 3
+; RUN: llvm-as < %s | opt -predsimplify -instcombine -simplifycfg | llvm-dis | grep -v declare | grep -c pass | grep 4
 
 void %test1(int %x) {
 entry:
@@ -149,6 +149,21 @@ return:
   ret void
 }
 
+void %test10()  {
+entry:
+  %A = alloca int
+  %B = seteq int* %A, null
+  br bool %B, label %cond_true, label %cond_false
+
+cond_true:
+  call void (...)* %fail ( )
+  ret void
+
+cond_false:
+  call void (...)* %pass ( )
+  ret void
+}
+
 void %switch1(int %x) {
 entry:
   %A = seteq int %x, 10