diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index b4f3b87e184..9729629b167 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -3660,6 +3660,7 @@ static Value *simplifySelectWithICmpCond(Value *CondVal, Value *TrueVal, // FIXME: This code is nearly duplicated in InstCombine. Using/refactoring // decomposeBitTestICmp() might help. + // FIXME this should support ICMP_SLE/SGE forms as well if (ICmpInst::isEquality(Pred) && match(CmpRHS, m_Zero())) { Value *X; const APInt *Y; diff --git a/test/Transforms/InstSimplify/select.ll b/test/Transforms/InstSimplify/select.ll index cb2502cf63c..f81dd3f261d 100644 --- a/test/Transforms/InstSimplify/select.ll +++ b/test/Transforms/InstSimplify/select.ll @@ -46,6 +46,21 @@ define i32 @test4(i32 %X) { ret i32 %cond } +; Same as above, but the compare isn't canonical +; TODO: we should be able to simplify this +define i32 @test4noncanon(i32 %X) { +; CHECK-LABEL: @test4noncanon( +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[X:%.*]], -1 +; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], -2147483648 +; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[X]], i32 [[OR]] +; CHECK-NEXT: ret i32 [[COND]] +; + %cmp = icmp sle i32 %X, -1 + %or = or i32 %X, -2147483648 + %cond = select i1 %cmp, i32 %X, i32 %or + ret i32 %cond +} + define i32 @test5(i32 %X) { ; CHECK-LABEL: @test5( ; CHECK-NEXT: ret i32 %X @@ -98,6 +113,21 @@ define i32 @test9(i32 %X) { ret i32 %cond } +; Same as above, but the compare isn't canonical +; TODO: we should be able to simplify this +define i32 @test9noncanon(i32 %X) { +; CHECK-LABEL: @test9noncanon( +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 0 +; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], -2147483648 +; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[OR]], i32 [[X]] +; CHECK-NEXT: ret i32 [[COND]] +; + %cmp = icmp sge i32 %X, 0 + %or = or i32 %X, -2147483648 + %cond = select i1 %cmp, i32 %or, i32 %X + ret i32 %cond +} + define i32 @test10(i32 %X) { ; CHECK-LABEL: @test10( ; CHECK-NEXT: ret i32 %X