From e46e8af4d7f36f7d14acd515c11c61a9bc9deea5 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Sat, 6 Jun 2015 04:56:51 +0000 Subject: [PATCH] [CVP] Don't assume Constants of type i1 can be known to be true or false CVP wants to analyze the condition operand of a select along an edge. It succeeds in getting back a Constant but not a ConstantInt. Instead, it gets a ConstantExpr. It then assumes that the Constant must be equal to false because it isn't equal to true. Instead, perform an additional comparison. This fixes PR23752. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239217 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Scalar/CorrelatedValuePropagation.cpp | 7 +++--- .../CorrelatedValuePropagation/select.ll | 22 +++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp index d1302c6e22f..79624b2e4c4 100644 --- a/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp +++ b/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp @@ -113,10 +113,11 @@ bool CorrelatedValuePropagation::processPHI(PHINode *P) { Value *Condition = SI->getCondition(); if (!Condition->getType()->isVectorTy()) { - if (Constant *C = LVI->getConstantOnEdge(Condition, P->getIncomingBlock(i), BB, P)) { - if (C == ConstantInt::getTrue(Condition->getType())) { + if (Constant *C = LVI->getConstantOnEdge( + Condition, P->getIncomingBlock(i), BB, P)) { + if (C->isOneValue()) { V = SI->getTrueValue(); - } else { + } else if (C->isZeroValue()) { V = SI->getFalseValue(); } // Once LVI learns to handle vector types, we could also add support diff --git a/test/Transforms/CorrelatedValuePropagation/select.ll b/test/Transforms/CorrelatedValuePropagation/select.ll index 5501438f690..d88e3e462a2 100644 --- a/test/Transforms/CorrelatedValuePropagation/select.ll +++ b/test/Transforms/CorrelatedValuePropagation/select.ll @@ -51,3 +51,25 @@ else: ret i8 %b } +@c = global i32 0, align 4 +@b = global i32 0, align 4 + +; CHECK-LABEL: @PR23752( +define i32 @PR23752() { +entry: + br label %for.body + +for.body: + %phi = phi i32 [ 0, %entry ], [ %sel, %for.body ] + %sel = select i1 icmp sgt (i32* @b, i32* @c), i32 %phi, i32 1 + %cmp = icmp ne i32 %sel, 1 + br i1 %cmp, label %for.body, label %if.end + +; CHECK: %[[sel:.*]] = select i1 icmp sgt (i32* @b, i32* @c), i32 0, i32 1 +; CHECK-NEXT: %[[cmp:.*]] = icmp ne i32 %[[sel]], 1 +; CHECK-NEXT: br i1 %[[cmp]] + +if.end: + ret i32 %sel +; CHECK: ret i32 %[[sel]] +} -- 2.34.1