summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2010-11-14 13:30:18 +0000
committerDuncan Sands <baldrick@free.fr>2010-11-14 13:30:18 +0000
commit4581ddc123deac8c5a6f586be77c6fbd50e86597 (patch)
tree0ca28b30769118c600ae5a85879809f1360fd102 /llvm
parent1d27f01210590b2e0e510aad39ac1006cd6f7e3d (diff)
downloadbcm5719-llvm-4581ddc123deac8c5a6f586be77c6fbd50e86597.tar.gz
bcm5719-llvm-4581ddc123deac8c5a6f586be77c6fbd50e86597.zip
Teach InstructionSimplify about phi nodes. I chose to have it simply
offload the work to hasConstantValue rather than do something more complicated (such handling mutually recursive phis) because (1) it is not clear it is worth it; and (2) if it is worth it, maybe such logic would be better placed in hasConstantValue. Adjust some GVN tests which are now cleaned up much further (eg: all phi nodes are removed). llvm-svn: 119043
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Analysis/InstructionSimplify.cpp2
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp5
-rw-r--r--llvm/test/Transforms/GVN/2007-07-26-InterlockingLoops.ll29
-rw-r--r--llvm/test/Transforms/GVN/2010-03-31-RedundantPHIs.ll10
4 files changed, 24 insertions, 22 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index b3e817a7506..210399d7291 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -699,6 +699,8 @@ Value *llvm::SimplifyInstruction(Instruction *I, const TargetData *TD) {
SmallVector<Value*, 8> Ops(I->op_begin(), I->op_end());
return SimplifyGEPInst(&Ops[0], Ops.size(), TD);
}
+ case Instruction::PHI:
+ return cast<PHINode>(I)->hasConstantValue();
}
}
diff --git a/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp b/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp
index f7fc62f9dc4..736473db1d5 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "InstCombine.h"
+#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/Target/TargetData.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/STLExtras.h"
@@ -731,8 +732,8 @@ Instruction *InstCombiner::SliceUpIllegalIntegerPHI(PHINode &FirstPhi) {
Instruction *InstCombiner::visitPHINode(PHINode &PN) {
// If LCSSA is around, don't mess with Phi nodes
if (MustPreserveLCSSA) return 0;
-
- if (Value *V = PN.hasConstantValue())
+
+ if (Value *V = SimplifyInstruction(&PN, TD))
return ReplaceInstUsesWith(PN, V);
// If all PHI operands are the same operation, pull them through the PHI,
diff --git a/llvm/test/Transforms/GVN/2007-07-26-InterlockingLoops.ll b/llvm/test/Transforms/GVN/2007-07-26-InterlockingLoops.ll
index 13d1bd1b7ef..14cb91b5316 100644
--- a/llvm/test/Transforms/GVN/2007-07-26-InterlockingLoops.ll
+++ b/llvm/test/Transforms/GVN/2007-07-26-InterlockingLoops.ll
@@ -1,30 +1,33 @@
-; RUN: opt < %s -basicaa -gvn -S | grep {tmp17625.* = phi i32. }
-; RUN: opt < %s -basicaa -gvn -S | grep {tmp17631.* = phi i32. }
+; RUN: opt < %s -basicaa -gvn -S | FileCheck %s
-@last = external global [65 x i32*] ; <[65 x i32*]*> [#uses=1]
+@last = external global [65 x i32*]
define i32 @NextRootMove(i32 %wtm) {
-cond_next95: ; preds = %cond_true85, %cond_true79, %cond_true73, %bb68
- %tmp17618 = load i32** getelementptr ([65 x i32*]* @last, i32 0, i32 1), align 4 ; <i32*> [#uses=0]
+entry:
+ %tmp17618 = load i32** getelementptr ([65 x i32*]* @last, i32 0, i32 1), align 4
+; CHECK: entry:
+; CHECK-NEXT: %tmp17618 = load
+; CHECK-NOT: load
+; CHECK-NOT: phi
br label %cond_true116
-cond_true116: ; preds = %cond_true111
+cond_true116:
br i1 false, label %cond_true128, label %cond_true145
-cond_true128: ; preds = %cond_true121
- %tmp17625 = load i32** getelementptr ([65 x i32*]* @last, i32 0, i32 1), align 4 ; <i32*> [#uses=0]
+cond_true128:
+ %tmp17625 = load i32** getelementptr ([65 x i32*]* @last, i32 0, i32 1), align 4
br i1 false, label %bb98.backedge, label %return.loopexit
-bb98.backedge: ; preds = %bb171, %cond_true145, %cond_true128
+bb98.backedge:
br label %cond_true116
-cond_true145: ; preds = %cond_false
- %tmp17631 = load i32** getelementptr ([65 x i32*]* @last, i32 0, i32 1), align 4 ; <i32*> [#uses=0]
+cond_true145:
+ %tmp17631 = load i32** getelementptr ([65 x i32*]* @last, i32 0, i32 1), align 4
br i1 false, label %bb98.backedge, label %return.loopexit
-return.loopexit: ; preds = %bb171, %cond_true145, %cond_true128
+return.loopexit:
br label %return
-return: ; preds = %return.loopexit, %cond_next95, %cond_true85
+return:
ret i32 0
}
diff --git a/llvm/test/Transforms/GVN/2010-03-31-RedundantPHIs.ll b/llvm/test/Transforms/GVN/2010-03-31-RedundantPHIs.ll
index c408daa58da..d6e1c6b76d0 100644
--- a/llvm/test/Transforms/GVN/2010-03-31-RedundantPHIs.ll
+++ b/llvm/test/Transforms/GVN/2010-03-31-RedundantPHIs.ll
@@ -1,5 +1,8 @@
; RUN: opt < %s -basicaa -gvn -S | FileCheck %s
+; CHECK-NOT: load
+; CHECK-NOT: phi
+
define i8* @cat(i8* %s1, ...) nounwind {
entry:
br i1 undef, label %bb, label %bb3
@@ -29,18 +32,11 @@ bb10: ; preds = %bb8
br label %bb11
bb11: ; preds = %bb10, %bb9
-; CHECK: bb11:
-; CHECK: phi
-; CHECK-NOT: phi
br label %bb12
bb12: ; preds = %bb11, %bb6
-; CHECK: bb12:
-; CHECK: phi
-; CHECK-NOT: phi
br i1 undef, label %bb8, label %bb13
bb13: ; preds = %bb12
-; CHECK: bb13:
ret i8* undef
}
OpenPOWER on IntegriCloud