From 552008946530e01efdad15044e1f621883d14a3a Mon Sep 17 00:00:00 2001 From: Duncan Sands Date: Mon, 15 Nov 2010 17:52:45 +0000 Subject: [PATCH] Teach InstructionSimplify the trick of skipping incoming phi values that are equal to the phi itself. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119161 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/InstructionSimplify.cpp | 13 +++++++++---- test/Transforms/InstCombine/phi.ll | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index 282e0d31bed..a8288bf67a9 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -142,9 +142,12 @@ static Value *ThreadBinOpOverPHI(unsigned Opcode, Value *LHS, Value *RHS, // Evaluate the BinOp on the incoming phi values. Value *CommonValue = 0; for (unsigned i = 0, e = PI->getNumIncomingValues(); i != e; ++i) { + Value *Incoming = PI->getIncomingValue(i); + // If the incoming value is the phi node itself, it can be safely skipped. + if (Incoming == PI) continue; Value *V = PI == LHS ? - SimplifyBinOp(Opcode, PI->getIncomingValue(i), RHS, TD, MaxRecurse) : - SimplifyBinOp(Opcode, LHS, PI->getIncomingValue(i), TD, MaxRecurse); + SimplifyBinOp(Opcode, Incoming, RHS, TD, MaxRecurse) : + SimplifyBinOp(Opcode, LHS, Incoming, TD, MaxRecurse); // If the operation failed to simplify, or simplified to a different value // to previously, then give up. if (!V || (CommonValue && V != CommonValue)) @@ -172,8 +175,10 @@ static Value *ThreadCmpOverPHI(CmpInst::Predicate Pred, Value *LHS, Value *RHS, // Evaluate the BinOp on the incoming phi values. Value *CommonValue = 0; for (unsigned i = 0, e = PI->getNumIncomingValues(); i != e; ++i) { - Value *V = SimplifyCmpInst(Pred, PI->getIncomingValue(i), RHS, TD, - MaxRecurse); + Value *Incoming = PI->getIncomingValue(i); + // If the incoming value is the phi node itself, it can be safely skipped. + if (Incoming == PI) continue; + Value *V = SimplifyCmpInst(Pred, Incoming, RHS, TD, MaxRecurse); // If the operation failed to simplify, or simplified to a different value // to previously, then give up. if (!V || (CommonValue && V != CommonValue)) diff --git a/test/Transforms/InstCombine/phi.ll b/test/Transforms/InstCombine/phi.ll index 1181aefdb38..c3e034fb5c1 100644 --- a/test/Transforms/InstCombine/phi.ll +++ b/test/Transforms/InstCombine/phi.ll @@ -469,3 +469,22 @@ ret: ; CHECK: @test20 ; CHECK: ret i1 false } + +define i1 @test21(i1 %c1, i1 %c2) { + %a = alloca i32 + %b = alloca i32 + %c = alloca i32 + br i1 %c1, label %true, label %false +true: + br label %loop +false: + br label %loop +loop: + %p = phi i32* [ %a, %true ], [ %b, %false ], [ %p, %loop ] + %r = icmp eq i32* %p, %c + br i1 %c2, label %ret, label %loop +ret: + ret i1 %r +; CHECK: @test21 +; CHECK: ret i1 false +}