diff options
author | Duncan Sands <baldrick@free.fr> | 2010-11-14 13:30:18 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2010-11-14 13:30:18 +0000 |
commit | cd6636c737a82949ad13db2d0d918af6424fb78b (patch) | |
tree | d3a7b6371ca1c32f8ca737e1dfb5625b7af8b6e5 | |
parent | c0362d5c6e0066c741bce056a65d8b4c026de19f (diff) |
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).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119043 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Analysis/InstructionSimplify.cpp | 2 | ||||
-rw-r--r-- | lib/Transforms/InstCombine/InstCombinePHI.cpp | 5 | ||||
-rw-r--r-- | test/Transforms/GVN/2007-07-26-InterlockingLoops.ll | 29 | ||||
-rw-r--r-- | test/Transforms/GVN/2010-03-31-RedundantPHIs.ll | 10 |
4 files changed, 24 insertions, 22 deletions
diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index b3e817a750..210399d729 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/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/lib/Transforms/InstCombine/InstCombinePHI.cpp b/lib/Transforms/InstCombine/InstCombinePHI.cpp index f7fc62f9dc..736473db1d 100644 --- a/lib/Transforms/InstCombine/InstCombinePHI.cpp +++ b/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/test/Transforms/GVN/2007-07-26-InterlockingLoops.ll b/test/Transforms/GVN/2007-07-26-InterlockingLoops.ll index 13d1bd1b7e..14cb91b531 100644 --- a/test/Transforms/GVN/2007-07-26-InterlockingLoops.ll +++ b/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/test/Transforms/GVN/2010-03-31-RedundantPHIs.ll b/test/Transforms/GVN/2010-03-31-RedundantPHIs.ll index c408daa58d..d6e1c6b76d 100644 --- a/test/Transforms/GVN/2010-03-31-RedundantPHIs.ll +++ b/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 } |