Skip to content

Commit a2a4e5a

Browse files
committed
[Test] Opportunity for sinking to unreachable in InstCombine
1 parent 525a591 commit a2a4e5a

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -instcombine -S < %s | FileCheck %s
3+
; RUN: opt -passes=instcombine -S < %s | FileCheck %s
4+
5+
declare void @use(i32 %x)
6+
7+
define void @test_01(i32 %x, i32 %y) {
8+
; CHECK-LABEL: @test_01(
9+
; CHECK-NEXT: entry:
10+
; CHECK-NEXT: [[C2:%.*]] = icmp slt i32 [[X:%.*]], [[Y:%.*]]
11+
; CHECK-NEXT: br i1 [[C2]], label [[EXIT:%.*]], label [[UNREACHED:%.*]]
12+
; CHECK: unreached:
13+
; CHECK-NEXT: [[C1:%.*]] = icmp ne i32 [[X]], [[Y]]
14+
; CHECK-NEXT: [[COMPARATOR:%.*]] = zext i1 [[C1]] to i32
15+
; CHECK-NEXT: call void @use(i32 [[COMPARATOR]])
16+
; CHECK-NEXT: unreachable
17+
; CHECK: exit:
18+
; CHECK-NEXT: ret void
19+
;
20+
entry:
21+
%c1 = icmp eq i32 %x, %y
22+
%c2 = icmp slt i32 %x, %y
23+
%signed = select i1 %c2, i32 -1, i32 1
24+
%comparator = select i1 %c1, i32 0, i32 %signed
25+
br i1 %c2, label %exit, label %unreached
26+
27+
unreached:
28+
call void @use(i32 %comparator)
29+
unreachable
30+
31+
exit:
32+
ret void
33+
}
34+
35+
36+
; TODO: %comparator and %signed can be sunk down to unreachable just as in
37+
; test above.
38+
define void @test_02(i32 %x, i32 %y) {
39+
; CHECK-LABEL: @test_02(
40+
; CHECK-NEXT: entry:
41+
; CHECK-NEXT: [[C1:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]]
42+
; CHECK-NEXT: [[C2:%.*]] = icmp slt i32 [[X]], [[Y]]
43+
; CHECK-NEXT: [[SIGNED:%.*]] = select i1 [[C2]], i32 -1, i32 1
44+
; CHECK-NEXT: [[COMPARATOR:%.*]] = select i1 [[C1]], i32 0, i32 [[SIGNED]]
45+
; CHECK-NEXT: br i1 [[C2]], label [[EXIT:%.*]], label [[MEDIUM:%.*]]
46+
; CHECK: medium:
47+
; CHECK-NEXT: [[C3:%.*]] = icmp sgt i32 [[X]], [[Y]]
48+
; CHECK-NEXT: br i1 [[C3]], label [[EXIT]], label [[UNREACHED:%.*]]
49+
; CHECK: unreached:
50+
; CHECK-NEXT: call void @use(i32 [[COMPARATOR]])
51+
; CHECK-NEXT: unreachable
52+
; CHECK: exit:
53+
; CHECK-NEXT: ret void
54+
;
55+
entry:
56+
%c1 = icmp eq i32 %x, %y
57+
%c2 = icmp slt i32 %x, %y
58+
%signed = select i1 %c2, i32 -1, i32 1
59+
%comparator = select i1 %c1, i32 0, i32 %signed
60+
br i1 %c2, label %exit, label %medium
61+
62+
medium:
63+
%c3 = icmp sgt i32 %x, %y
64+
br i1 %c3, label %exit, label %unreached
65+
66+
unreached:
67+
call void @use(i32 %comparator)
68+
unreachable
69+
70+
exit:
71+
ret void
72+
}

0 commit comments

Comments
 (0)