[llvm] 5a1020b - [InstSimplify] Add test for disjoint or miscompile (NFC)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 1 02:45:18 PST 2023
Author: Nikita Popov
Date: 2023-12-01T11:45:09+01:00
New Revision: 5a1020bb0083ebfcf5d8879ba99c21bf214fcb56
URL: https://github.com/llvm/llvm-project/commit/5a1020bb0083ebfcf5d8879ba99c21bf214fcb56
DIFF: https://github.com/llvm/llvm-project/commit/5a1020bb0083ebfcf5d8879ba99c21bf214fcb56.diff
LOG: [InstSimplify] Add test for disjoint or miscompile (NFC)
The absorption case is already handled correctly, but the
idempentence case is not.
Added:
Modified:
llvm/test/Transforms/InstCombine/select.ll
llvm/test/Transforms/InstSimplify/select.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/InstCombine/select.ll b/llvm/test/Transforms/InstCombine/select.ll
index b3764cfb97d407b..f1ccd4747bd1ce1 100644
--- a/llvm/test/Transforms/InstCombine/select.ll
+++ b/llvm/test/Transforms/InstCombine/select.ll
@@ -1919,9 +1919,9 @@ define i32 @select_dominating_cond_inverted_multiple_duplicating_preds(i1 %cond,
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_FALSE:%.*]], label [[IF_TRUE:%.*]]
; CHECK: if.true:
; CHECK-NEXT: switch i32 [[COND2:%.*]], label [[SWITCH_CASE_1:%.*]] [
-; CHECK-NEXT: i32 1, label [[MERGE:%.*]]
-; CHECK-NEXT: i32 2, label [[MERGE]]
-; CHECK-NEXT: i32 3, label [[MERGE]]
+; CHECK-NEXT: i32 1, label [[MERGE:%.*]]
+; CHECK-NEXT: i32 2, label [[MERGE]]
+; CHECK-NEXT: i32 3, label [[MERGE]]
; CHECK-NEXT: ]
; CHECK: switch.case.1:
; CHECK-NEXT: br label [[MERGE]]
@@ -2172,13 +2172,13 @@ define i32 @test_invoke_neg(i32 %x, i32 %y) nounwind uwtable ssp personality ptr
; CHECK-LABEL: @test_invoke_neg(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[COND:%.*]] = invoke i1 @foo()
-; CHECK-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
+; CHECK-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
; CHECK: invoke.cont:
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 [[X:%.*]], i32 [[Y:%.*]]
; CHECK-NEXT: ret i32 [[SEL]]
; CHECK: lpad:
; CHECK-NEXT: [[LP:%.*]] = landingpad { i1, i32 }
-; CHECK-NEXT: filter [0 x i1] zeroinitializer
+; CHECK-NEXT: filter [0 x i1] zeroinitializer
; CHECK-NEXT: unreachable
;
entry:
@@ -2205,14 +2205,14 @@ define i32 @test_invoke_2_neg(i1 %cond, i32 %x, i32 %y) nounwind uwtable ssp per
; CHECK-NEXT: br label [[MERGE:%.*]]
; CHECK: if.false:
; CHECK-NEXT: [[RESULT:%.*]] = invoke i32 @bar()
-; CHECK-NEXT: to label [[MERGE]] unwind label [[LPAD:%.*]]
+; CHECK-NEXT: to label [[MERGE]] unwind label [[LPAD:%.*]]
; CHECK: merge:
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0, [[IF_TRUE]] ], [ [[RESULT]], [[IF_FALSE]] ]
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 1, i32 [[PHI]]
; CHECK-NEXT: ret i32 [[SEL]]
; CHECK: lpad:
; CHECK-NEXT: [[LP:%.*]] = landingpad { i1, i32 }
-; CHECK-NEXT: filter [0 x i1] zeroinitializer
+; CHECK-NEXT: filter [0 x i1] zeroinitializer
; CHECK-NEXT: unreachable
;
entry:
@@ -2242,8 +2242,8 @@ define i32 @select_phi_same_condition_switch(i1 %cond, i32 %x, i32 %y) {
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
; CHECK: if.true:
; CHECK-NEXT: switch i32 [[X:%.*]], label [[EXIT:%.*]] [
-; CHECK-NEXT: i32 1, label [[MERGE:%.*]]
-; CHECK-NEXT: i32 2, label [[MERGE]]
+; CHECK-NEXT: i32 1, label [[MERGE:%.*]]
+; CHECK-NEXT: i32 2, label [[MERGE]]
; CHECK-NEXT: ]
; CHECK: exit:
; CHECK-NEXT: ret i32 0
@@ -2903,6 +2903,31 @@ define ptr @select_replacement_gep_inbounds(ptr %base, i64 %offset) {
ret ptr %sel
}
+define i8 @replace_false_op_eq_shl_or_disjoint(i8 %x) {
+; CHECK-LABEL: @replace_false_op_eq_shl_or_disjoint(
+; CHECK-NEXT: [[SHL:%.*]] = shl i8 [[X:%.*]], 3
+; CHECK-NEXT: [[OR:%.*]] = or i8 [[SHL]], [[X]]
+; CHECK-NEXT: ret i8 [[OR]]
+;
+ %eq0 = icmp eq i8 %x, -1
+ %shl = shl i8 %x, 3
+ %or = or disjoint i8 %x, %shl
+ %sel = select i1 %eq0, i8 -1, i8 %or
+ ret i8 %sel
+}
+
+; FIXME: This is a miscompile.
+define i8 @select_or_disjoint_eq(i8 %x, i8 %y) {
+; CHECK-LABEL: @select_or_disjoint_eq(
+; CHECK-NEXT: [[OR:%.*]] = or disjoint i8 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: ret i8 [[OR]]
+;
+ %cmp = icmp eq i8 %x, %y
+ %or = or disjoint i8 %x, %y
+ %sel = select i1 %cmp, i8 %x, i8 %or
+ ret i8 %sel
+}
+
define <2 x i1> @partial_true_undef_condval(<2 x i1> %x) {
; CHECK-LABEL: @partial_true_undef_condval(
; CHECK-NEXT: ret <2 x i1> <i1 true, i1 poison>
diff --git a/llvm/test/Transforms/InstSimplify/select.ll b/llvm/test/Transforms/InstSimplify/select.ll
index 16901b888933875..473d8b8b0368084 100644
--- a/llvm/test/Transforms/InstSimplify/select.ll
+++ b/llvm/test/Transforms/InstSimplify/select.ll
@@ -1429,6 +1429,21 @@ define i8 @replace_false_op_eq_shl_or(i8 %x) {
ret i8 %sel
}
+define i8 @replace_false_op_eq_shl_or_disjoint(i8 %x) {
+; CHECK-LABEL: @replace_false_op_eq_shl_or_disjoint(
+; CHECK-NEXT: [[EQ0:%.*]] = icmp eq i8 [[X:%.*]], -1
+; CHECK-NEXT: [[SHL:%.*]] = shl i8 [[X]], 3
+; CHECK-NEXT: [[OR:%.*]] = or disjoint i8 [[X]], [[SHL]]
+; CHECK-NEXT: [[SEL:%.*]] = select i1 [[EQ0]], i8 -1, i8 [[OR]]
+; CHECK-NEXT: ret i8 [[SEL]]
+;
+ %eq0 = icmp eq i8 %x, -1
+ %shl = shl i8 %x, 3
+ %or = or disjoint i8 %x, %shl
+ %sel = select i1 %eq0, i8 -1, i8 %or
+ ret i8 %sel
+}
+
; negative test - wrong cmp predicate
define i8 @replace_false_op_sgt_neg_and(i8 %x) {
@@ -1698,3 +1713,26 @@ define i8 @select_xor_cmp_unmatched_operands(i8 %0, i8 %1, i8 %c) {
%5 = select i1 %3, i8 0, i8 %4
ret i8 %5
}
+
+define i8 @select_or_eq(i8 %x, i8 %y) {
+; CHECK-LABEL: @select_or_eq(
+; CHECK-NEXT: [[OR:%.*]] = or i8 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: ret i8 [[OR]]
+;
+ %cmp = icmp eq i8 %x, %y
+ %or = or i8 %x, %y
+ %sel = select i1 %cmp, i8 %x, i8 %or
+ ret i8 %sel
+}
+
+; FIXME: This is a miscompile.
+define i8 @select_or_disjoint_eq(i8 %x, i8 %y) {
+; CHECK-LABEL: @select_or_disjoint_eq(
+; CHECK-NEXT: [[OR:%.*]] = or disjoint i8 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: ret i8 [[OR]]
+;
+ %cmp = icmp eq i8 %x, %y
+ %or = or disjoint i8 %x, %y
+ %sel = select i1 %cmp, i8 %x, i8 %or
+ ret i8 %sel
+}
More information about the llvm-commits
mailing list