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
This commit is contained in:
Duncan Sands 2010-11-14 13:30:18 +00:00
parent c0362d5c6e
commit cd6636c737
4 changed files with 24 additions and 22 deletions

View 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();
}
}

View 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,

View 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
}

View 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
}