Skip to content

Commit 5a1020b

Browse files
committed
[InstSimplify] Add test for disjoint or miscompile (NFC)
The absorption case is already handled correctly, but the idempentence case is not.
1 parent 289fe74 commit 5a1020b

File tree

2 files changed

+72
-9
lines changed

2 files changed

+72
-9
lines changed

llvm/test/Transforms/InstCombine/select.ll

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1919,9 +1919,9 @@ define i32 @select_dominating_cond_inverted_multiple_duplicating_preds(i1 %cond,
19191919
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_FALSE:%.*]], label [[IF_TRUE:%.*]]
19201920
; CHECK: if.true:
19211921
; CHECK-NEXT: switch i32 [[COND2:%.*]], label [[SWITCH_CASE_1:%.*]] [
1922-
; CHECK-NEXT: i32 1, label [[MERGE:%.*]]
1923-
; CHECK-NEXT: i32 2, label [[MERGE]]
1924-
; CHECK-NEXT: i32 3, label [[MERGE]]
1922+
; CHECK-NEXT: i32 1, label [[MERGE:%.*]]
1923+
; CHECK-NEXT: i32 2, label [[MERGE]]
1924+
; CHECK-NEXT: i32 3, label [[MERGE]]
19251925
; CHECK-NEXT: ]
19261926
; CHECK: switch.case.1:
19271927
; CHECK-NEXT: br label [[MERGE]]
@@ -2172,13 +2172,13 @@ define i32 @test_invoke_neg(i32 %x, i32 %y) nounwind uwtable ssp personality ptr
21722172
; CHECK-LABEL: @test_invoke_neg(
21732173
; CHECK-NEXT: entry:
21742174
; CHECK-NEXT: [[COND:%.*]] = invoke i1 @foo()
2175-
; CHECK-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
2175+
; CHECK-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
21762176
; CHECK: invoke.cont:
21772177
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 [[X:%.*]], i32 [[Y:%.*]]
21782178
; CHECK-NEXT: ret i32 [[SEL]]
21792179
; CHECK: lpad:
21802180
; CHECK-NEXT: [[LP:%.*]] = landingpad { i1, i32 }
2181-
; CHECK-NEXT: filter [0 x i1] zeroinitializer
2181+
; CHECK-NEXT: filter [0 x i1] zeroinitializer
21822182
; CHECK-NEXT: unreachable
21832183
;
21842184
entry:
@@ -2205,14 +2205,14 @@ define i32 @test_invoke_2_neg(i1 %cond, i32 %x, i32 %y) nounwind uwtable ssp per
22052205
; CHECK-NEXT: br label [[MERGE:%.*]]
22062206
; CHECK: if.false:
22072207
; CHECK-NEXT: [[RESULT:%.*]] = invoke i32 @bar()
2208-
; CHECK-NEXT: to label [[MERGE]] unwind label [[LPAD:%.*]]
2208+
; CHECK-NEXT: to label [[MERGE]] unwind label [[LPAD:%.*]]
22092209
; CHECK: merge:
22102210
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0, [[IF_TRUE]] ], [ [[RESULT]], [[IF_FALSE]] ]
22112211
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 1, i32 [[PHI]]
22122212
; CHECK-NEXT: ret i32 [[SEL]]
22132213
; CHECK: lpad:
22142214
; CHECK-NEXT: [[LP:%.*]] = landingpad { i1, i32 }
2215-
; CHECK-NEXT: filter [0 x i1] zeroinitializer
2215+
; CHECK-NEXT: filter [0 x i1] zeroinitializer
22162216
; CHECK-NEXT: unreachable
22172217
;
22182218
entry:
@@ -2242,8 +2242,8 @@ define i32 @select_phi_same_condition_switch(i1 %cond, i32 %x, i32 %y) {
22422242
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
22432243
; CHECK: if.true:
22442244
; CHECK-NEXT: switch i32 [[X:%.*]], label [[EXIT:%.*]] [
2245-
; CHECK-NEXT: i32 1, label [[MERGE:%.*]]
2246-
; CHECK-NEXT: i32 2, label [[MERGE]]
2245+
; CHECK-NEXT: i32 1, label [[MERGE:%.*]]
2246+
; CHECK-NEXT: i32 2, label [[MERGE]]
22472247
; CHECK-NEXT: ]
22482248
; CHECK: exit:
22492249
; CHECK-NEXT: ret i32 0
@@ -2903,6 +2903,31 @@ define ptr @select_replacement_gep_inbounds(ptr %base, i64 %offset) {
29032903
ret ptr %sel
29042904
}
29052905

2906+
define i8 @replace_false_op_eq_shl_or_disjoint(i8 %x) {
2907+
; CHECK-LABEL: @replace_false_op_eq_shl_or_disjoint(
2908+
; CHECK-NEXT: [[SHL:%.*]] = shl i8 [[X:%.*]], 3
2909+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[SHL]], [[X]]
2910+
; CHECK-NEXT: ret i8 [[OR]]
2911+
;
2912+
%eq0 = icmp eq i8 %x, -1
2913+
%shl = shl i8 %x, 3
2914+
%or = or disjoint i8 %x, %shl
2915+
%sel = select i1 %eq0, i8 -1, i8 %or
2916+
ret i8 %sel
2917+
}
2918+
2919+
; FIXME: This is a miscompile.
2920+
define i8 @select_or_disjoint_eq(i8 %x, i8 %y) {
2921+
; CHECK-LABEL: @select_or_disjoint_eq(
2922+
; CHECK-NEXT: [[OR:%.*]] = or disjoint i8 [[X:%.*]], [[Y:%.*]]
2923+
; CHECK-NEXT: ret i8 [[OR]]
2924+
;
2925+
%cmp = icmp eq i8 %x, %y
2926+
%or = or disjoint i8 %x, %y
2927+
%sel = select i1 %cmp, i8 %x, i8 %or
2928+
ret i8 %sel
2929+
}
2930+
29062931
define <2 x i1> @partial_true_undef_condval(<2 x i1> %x) {
29072932
; CHECK-LABEL: @partial_true_undef_condval(
29082933
; CHECK-NEXT: ret <2 x i1> <i1 true, i1 poison>

llvm/test/Transforms/InstSimplify/select.ll

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1429,6 +1429,21 @@ define i8 @replace_false_op_eq_shl_or(i8 %x) {
14291429
ret i8 %sel
14301430
}
14311431

1432+
define i8 @replace_false_op_eq_shl_or_disjoint(i8 %x) {
1433+
; CHECK-LABEL: @replace_false_op_eq_shl_or_disjoint(
1434+
; CHECK-NEXT: [[EQ0:%.*]] = icmp eq i8 [[X:%.*]], -1
1435+
; CHECK-NEXT: [[SHL:%.*]] = shl i8 [[X]], 3
1436+
; CHECK-NEXT: [[OR:%.*]] = or disjoint i8 [[X]], [[SHL]]
1437+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[EQ0]], i8 -1, i8 [[OR]]
1438+
; CHECK-NEXT: ret i8 [[SEL]]
1439+
;
1440+
%eq0 = icmp eq i8 %x, -1
1441+
%shl = shl i8 %x, 3
1442+
%or = or disjoint i8 %x, %shl
1443+
%sel = select i1 %eq0, i8 -1, i8 %or
1444+
ret i8 %sel
1445+
}
1446+
14321447
; negative test - wrong cmp predicate
14331448

14341449
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) {
16981713
%5 = select i1 %3, i8 0, i8 %4
16991714
ret i8 %5
17001715
}
1716+
1717+
define i8 @select_or_eq(i8 %x, i8 %y) {
1718+
; CHECK-LABEL: @select_or_eq(
1719+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[X:%.*]], [[Y:%.*]]
1720+
; CHECK-NEXT: ret i8 [[OR]]
1721+
;
1722+
%cmp = icmp eq i8 %x, %y
1723+
%or = or i8 %x, %y
1724+
%sel = select i1 %cmp, i8 %x, i8 %or
1725+
ret i8 %sel
1726+
}
1727+
1728+
; FIXME: This is a miscompile.
1729+
define i8 @select_or_disjoint_eq(i8 %x, i8 %y) {
1730+
; CHECK-LABEL: @select_or_disjoint_eq(
1731+
; CHECK-NEXT: [[OR:%.*]] = or disjoint i8 [[X:%.*]], [[Y:%.*]]
1732+
; CHECK-NEXT: ret i8 [[OR]]
1733+
;
1734+
%cmp = icmp eq i8 %x, %y
1735+
%or = or disjoint i8 %x, %y
1736+
%sel = select i1 %cmp, i8 %x, i8 %or
1737+
ret i8 %sel
1738+
}

0 commit comments

Comments
 (0)