[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.

llvm-svn: 239217
This commit is contained in:
David Majnemer 2015-06-06 04:56:51 +00:00
parent 743afa0736
commit 1c297e66fb
2 changed files with 26 additions and 3 deletions

View File

@ -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

View File

@ -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]]
}