OSDN Git Service

[InstSimplify] Add test cases that show that simplifySelectWithICmpCond doesn't work...
authorCraig Topper <craig.topper@intel.com>
Thu, 10 Aug 2017 01:02:02 +0000 (01:02 +0000)
committerCraig Topper <craig.topper@intel.com>
Thu, 10 Aug 2017 01:02:02 +0000 (01:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@310542 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/InstructionSimplify.cpp
test/Transforms/InstSimplify/select.ll

index b4f3b87..9729629 100644 (file)
@@ -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;
index cb2502c..f81dd3f 100644 (file)
@@ -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