diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-07-01 13:22:02 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-07-01 13:22:02 +0000 | 
| commit | 9df3605dea17e84f8183581f6103bd0c79e2a606 (patch) | |
| tree | 70a2f36ce9eb9bb213603cd7f2f120af53fc176f /test/Transforms/InstCombine/logical-select.ll | |
| parent | 08bbd35a80bf7765fe0d3043f9eb5a2f2786b649 (diff) | |
Diffstat (limited to 'test/Transforms/InstCombine/logical-select.ll')
| -rw-r--r-- | test/Transforms/InstCombine/logical-select.ll | 26 | 
1 files changed, 14 insertions, 12 deletions
diff --git a/test/Transforms/InstCombine/logical-select.ll b/test/Transforms/InstCombine/logical-select.ll index 6c00dec60ed6..4c0223aa6dd1 100644 --- a/test/Transforms/InstCombine/logical-select.ll +++ b/test/Transforms/InstCombine/logical-select.ll @@ -62,19 +62,15 @@ define i32 @poo(i32 %a, i32 %b, i32 %c, i32 %d) {    ret i32 %t3  } -; TODO: For the next 4 tests, are there potential canonicalizations and/or folds for these -; in InstCombine? Independent of that, tests like this that may not show any transforms  -; still have value because they can help identify conflicting canonicalization rules that  -; lead to infinite looping.  -  ; PR32791 - https://bugs.llvm.org//show_bug.cgi?id=32791 -; Fold two selects with inverted predicates and zero operands. +; The 2nd compare/select are canonicalized, so CSE and another round of instcombine or some other pass will fold this. +  define i32 @fold_inverted_icmp_preds(i32 %a, i32 %b, i32 %c, i32 %d) {  ; CHECK-LABEL: @fold_inverted_icmp_preds(  ; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 %a, %b  ; CHECK-NEXT:    [[SEL1:%.*]] = select i1 [[CMP1]], i32 %c, i32 0 -; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i32 %a, %b -; CHECK-NEXT:    [[SEL2:%.*]] = select i1 [[CMP2]], i32 %d, i32 0 +; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 %a, %b +; CHECK-NEXT:    [[SEL2:%.*]] = select i1 [[CMP2]], i32 0, i32 %d  ; CHECK-NEXT:    [[OR:%.*]] = or i32 [[SEL1]], [[SEL2]]  ; CHECK-NEXT:    ret i32 [[OR]]  ; @@ -86,12 +82,14 @@ define i32 @fold_inverted_icmp_preds(i32 %a, i32 %b, i32 %c, i32 %d) {    ret i32 %or  } +; The 2nd compare/select are canonicalized, so CSE and another round of instcombine or some other pass will fold this. +  define i32 @fold_inverted_icmp_preds_reverse(i32 %a, i32 %b, i32 %c, i32 %d) {  ; CHECK-LABEL: @fold_inverted_icmp_preds_reverse(  ; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 %a, %b  ; CHECK-NEXT:    [[SEL1:%.*]] = select i1 [[CMP1]], i32 0, i32 %c -; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i32 %a, %b -; CHECK-NEXT:    [[SEL2:%.*]] = select i1 [[CMP2]], i32 0, i32 %d +; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 %a, %b +; CHECK-NEXT:    [[SEL2:%.*]] = select i1 [[CMP2]], i32 %d, i32 0  ; CHECK-NEXT:    [[OR:%.*]] = or i32 [[SEL1]], [[SEL2]]  ; CHECK-NEXT:    ret i32 [[OR]]  ; @@ -103,6 +101,8 @@ define i32 @fold_inverted_icmp_preds_reverse(i32 %a, i32 %b, i32 %c, i32 %d) {    ret i32 %or  } +; TODO: Should fcmp have the same sort of predicate canonicalization as icmp? +  define i32 @fold_inverted_fcmp_preds(float %a, float %b, i32 %c, i32 %d) {  ; CHECK-LABEL: @fold_inverted_fcmp_preds(  ; CHECK-NEXT:    [[CMP1:%.*]] = fcmp olt float %a, %b @@ -120,10 +120,12 @@ define i32 @fold_inverted_fcmp_preds(float %a, float %b, i32 %c, i32 %d) {    ret i32 %or  } +; The 2nd compare/select are canonicalized, so CSE and another round of instcombine or some other pass will fold this. +  define <2 x i32> @fold_inverted_icmp_vector_preds(<2 x i32> %a, <2 x i32> %b, <2 x i32> %c, <2 x i32> %d) {  ; CHECK-LABEL: @fold_inverted_icmp_vector_preds( -; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne <2 x i32> %a, %b -; CHECK-NEXT:    [[SEL1:%.*]] = select <2 x i1> [[CMP1]], <2 x i32> %c, <2 x i32> zeroinitializer +; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq <2 x i32> %a, %b +; CHECK-NEXT:    [[SEL1:%.*]] = select <2 x i1> [[CMP1]], <2 x i32> zeroinitializer, <2 x i32> %c  ; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq <2 x i32> %a, %b  ; CHECK-NEXT:    [[SEL2:%.*]] = select <2 x i1> [[CMP2]], <2 x i32> %d, <2 x i32> zeroinitializer  ; CHECK-NEXT:    [[OR:%.*]] = or <2 x i32> [[SEL1]], [[SEL2]]  | 
