Teach InstructionSimplify about phi nodes. I chose to have it simply
authorDuncan Sands <baldrick@free.fr>
Sun, 14 Nov 2010 13:30:18 +0000 (13:30 +0000)
committerDuncan Sands <baldrick@free.fr>
Sun, 14 Nov 2010 13:30:18 +0000 (13:30 +0000)
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

lib/Analysis/InstructionSimplify.cpp
lib/Transforms/InstCombine/InstCombinePHI.cpp
test/Transforms/GVN/2007-07-26-InterlockingLoops.ll
test/Transforms/GVN/2010-03-31-RedundantPHIs.ll

index b3e817a750623641ce12e182ce4a7a61f04e497a..210399d7291ebb1b3b592eac1d9e3cc9e75c2ec6 100644 (file)
@@ -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();
   }
 }
 
index f7fc62f9dc4fca89ae64d22ee1921edfce16988a..736473db1d584699d4ffd262a6887b5dc49f7e5e 100644 (file)
@@ -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,
index 13d1bd1b7ef0dd1b006cbe4cbc7096086de7c681..14cb91b5316728ac8ea529c45d0964a4c2199ffa 100644 (file)
@@ -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
 }
index c408daa58da17f7a37c28b08b26536c76004a302..d6e1c6b76d0b3d709e61ad44569341832657f27f 100644 (file)
@@ -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
 }