[llvm] 5bc5c01 - [CVP] Add tests for select form of and/or (NFC)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Sat Dec 26 12:48:42 PST 2020


Author: Nikita Popov
Date: 2020-12-26T21:48:24+01:00
New Revision: 5bc5c016c4bf81af010e3c4e74ec800b203caaf5

URL: https://github.com/llvm/llvm-project/commit/5bc5c016c4bf81af010e3c4e74ec800b203caaf5
DIFF: https://github.com/llvm/llvm-project/commit/5bc5c016c4bf81af010e3c4e74ec800b203caaf5.diff

LOG: [CVP] Add tests for select form of and/or (NFC)

This tests their handling inside LVI. See D93065 for wider context.

Added: 
    

Modified: 
    llvm/test/Transforms/CorrelatedValuePropagation/basic.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll b/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll
index 0c41bb6270f9..e4748e71baa5 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll
@@ -1061,6 +1061,204 @@ exit2:
   ret i1 %cmp2
 }
 
+define void @select_and(i32 %a, i1* %p) {
+; CHECK-LABEL: @select_and(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[A:%.*]], -10
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[A]], 10
+; CHECK-NEXT:    [[AND:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 false
+; CHECK-NEXT:    br i1 [[AND]], label [[GUARD:%.*]], label [[EXIT:%.*]]
+; CHECK:       guard:
+; CHECK-NEXT:    [[C1:%.*]] = icmp sgt i32 [[A]], 20
+; CHECK-NEXT:    store i1 [[C1]], i1* [[P:%.*]], align 1
+; CHECK-NEXT:    [[C2:%.*]] = icmp slt i32 [[A]], -20
+; CHECK-NEXT:    store i1 [[C2]], i1* [[P]], align 1
+; CHECK-NEXT:    br label [[EXIT]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %cmp1 = icmp sgt i32 %a, -10
+  %cmp2 = icmp slt i32 %a, 10
+  %and = select i1 %cmp1, i1 %cmp2, i1 false
+  br i1 %and, label %guard, label %exit
+
+guard:
+  %c1 = icmp sgt i32 %a, 20
+  store i1 %c1, i1* %p
+  %c2 = icmp slt i32 %a, -20
+  store i1 %c2, i1* %p
+  br label %exit
+
+exit:
+  ret void
+}
+
+define void @select_and_wrong_const(i32 %a, i1* %p) {
+; CHECK-LABEL: @select_and_wrong_const(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[A:%.*]], -10
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[A]], 10
+; CHECK-NEXT:    [[AND:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 true
+; CHECK-NEXT:    br i1 [[AND]], label [[GUARD:%.*]], label [[EXIT:%.*]]
+; CHECK:       guard:
+; CHECK-NEXT:    [[C1:%.*]] = icmp sgt i32 [[A]], 20
+; CHECK-NEXT:    store i1 [[C1]], i1* [[P:%.*]], align 1
+; CHECK-NEXT:    [[C2:%.*]] = icmp slt i32 [[A]], -20
+; CHECK-NEXT:    store i1 [[C2]], i1* [[P]], align 1
+; CHECK-NEXT:    br label [[EXIT]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %cmp1 = icmp sgt i32 %a, -10
+  %cmp2 = icmp slt i32 %a, 10
+  %and = select i1 %cmp1, i1 %cmp2, i1 true
+  br i1 %and, label %guard, label %exit
+
+guard:
+  %c1 = icmp sgt i32 %a, 20
+  store i1 %c1, i1* %p
+  %c2 = icmp slt i32 %a, -20
+  store i1 %c2, i1* %p
+  br label %exit
+
+exit:
+  ret void
+}
+
+define void @select_and_wrong_operand(i32 %a, i1* %p) {
+; CHECK-LABEL: @select_and_wrong_operand(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[A:%.*]], -10
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[A]], 10
+; CHECK-NEXT:    [[AND:%.*]] = select i1 [[CMP1]], i1 false, i1 [[CMP2]]
+; CHECK-NEXT:    br i1 [[AND]], label [[GUARD:%.*]], label [[EXIT:%.*]]
+; CHECK:       guard:
+; CHECK-NEXT:    [[C1:%.*]] = icmp sgt i32 [[A]], 20
+; CHECK-NEXT:    store i1 [[C1]], i1* [[P:%.*]], align 1
+; CHECK-NEXT:    [[C2:%.*]] = icmp slt i32 [[A]], -20
+; CHECK-NEXT:    store i1 [[C2]], i1* [[P]], align 1
+; CHECK-NEXT:    br label [[EXIT]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %cmp1 = icmp sgt i32 %a, -10
+  %cmp2 = icmp slt i32 %a, 10
+  %and = select i1 %cmp1, i1 false, i1 %cmp2
+  br i1 %and, label %guard, label %exit
+
+guard:
+  %c1 = icmp sgt i32 %a, 20
+  store i1 %c1, i1* %p
+  %c2 = icmp slt i32 %a, -20
+  store i1 %c2, i1* %p
+  br label %exit
+
+exit:
+  ret void
+}
+
+define void @select_or(i32 %a, i1* %p) {
+; CHECK-LABEL: @select_or(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[A:%.*]], -10
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[A]], 10
+; CHECK-NEXT:    [[OR:%.*]] = select i1 [[CMP1]], i1 true, i1 [[CMP2]]
+; CHECK-NEXT:    br i1 [[OR]], label [[EXIT:%.*]], label [[GUARD:%.*]]
+; CHECK:       guard:
+; CHECK-NEXT:    [[C1:%.*]] = icmp sgt i32 [[A]], 20
+; CHECK-NEXT:    store i1 [[C1]], i1* [[P:%.*]], align 1
+; CHECK-NEXT:    [[C2:%.*]] = icmp slt i32 [[A]], -20
+; CHECK-NEXT:    store i1 [[C2]], i1* [[P]], align 1
+; CHECK-NEXT:    br label [[EXIT]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %cmp1 = icmp slt i32 %a, -10
+  %cmp2 = icmp sgt i32 %a, 10
+  %or = select i1 %cmp1, i1 true, i1 %cmp2
+  br i1 %or, label %exit, label %guard
+
+guard:
+  %c1 = icmp sgt i32 %a, 20
+  store i1 %c1, i1* %p
+  %c2 = icmp slt i32 %a, -20
+  store i1 %c2, i1* %p
+  br label %exit
+
+exit:
+  ret void
+}
+
+define void @select_or_wrong_const(i32 %a, i1* %p) {
+; CHECK-LABEL: @select_or_wrong_const(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[A:%.*]], -10
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[A]], 10
+; CHECK-NEXT:    [[OR:%.*]] = select i1 [[CMP1]], i1 false, i1 [[CMP2]]
+; CHECK-NEXT:    br i1 [[OR]], label [[EXIT:%.*]], label [[GUARD:%.*]]
+; CHECK:       guard:
+; CHECK-NEXT:    [[C1:%.*]] = icmp sgt i32 [[A]], 20
+; CHECK-NEXT:    store i1 [[C1]], i1* [[P:%.*]], align 1
+; CHECK-NEXT:    [[C2:%.*]] = icmp slt i32 [[A]], -20
+; CHECK-NEXT:    store i1 [[C2]], i1* [[P]], align 1
+; CHECK-NEXT:    br label [[EXIT]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %cmp1 = icmp slt i32 %a, -10
+  %cmp2 = icmp sgt i32 %a, 10
+  %or = select i1 %cmp1, i1 false, i1 %cmp2
+  br i1 %or, label %exit, label %guard
+
+guard:
+  %c1 = icmp sgt i32 %a, 20
+  store i1 %c1, i1* %p
+  %c2 = icmp slt i32 %a, -20
+  store i1 %c2, i1* %p
+  br label %exit
+
+exit:
+  ret void
+}
+
+define void @select_or_wrong_operand(i32 %a, i1* %p) {
+; CHECK-LABEL: @select_or_wrong_operand(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[A:%.*]], -10
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[A]], 10
+; CHECK-NEXT:    [[OR:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 true
+; CHECK-NEXT:    br i1 [[OR]], label [[EXIT:%.*]], label [[GUARD:%.*]]
+; CHECK:       guard:
+; CHECK-NEXT:    [[C1:%.*]] = icmp sgt i32 [[A]], 20
+; CHECK-NEXT:    store i1 [[C1]], i1* [[P:%.*]], align 1
+; CHECK-NEXT:    [[C2:%.*]] = icmp slt i32 [[A]], -20
+; CHECK-NEXT:    store i1 [[C2]], i1* [[P]], align 1
+; CHECK-NEXT:    br label [[EXIT]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %cmp1 = icmp slt i32 %a, -10
+  %cmp2 = icmp sgt i32 %a, 10
+  %or = select i1 %cmp1, i1 %cmp2, i1 true
+  br i1 %or, label %exit, label %guard
+
+guard:
+  %c1 = icmp sgt i32 %a, 20
+  store i1 %c1, i1* %p
+  %c2 = icmp slt i32 %a, -20
+  store i1 %c2, i1* %p
+  br label %exit
+
+exit:
+  ret void
+}
+
 declare i32 @llvm.uadd.sat.i32(i32, i32)
 declare i32 @llvm.usub.sat.i32(i32, i32)
 declare i32 @llvm.sadd.sat.i32(i32, i32)


        


More information about the llvm-commits mailing list