Skip to content

Commit 76b3ada

Browse files
committed
[AggressiveInstCombine] Add test for shifts from or chains. NFC
1 parent 08b3617 commit 76b3ada

File tree

2 files changed

+199
-0
lines changed

2 files changed

+199
-0
lines changed

llvm/test/Transforms/AggressiveInstCombine/AArch64/or-load.ll

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2480,3 +2480,55 @@ define void @bitcast_gep(ptr %p, ptr %dest) {
24802480
store i32 %trunc, ptr %dest, align 4
24812481
ret void
24822482
}
2483+
2484+
define i1 @loadCombine_4consecutive_rev_icmp0(ptr %p) {
2485+
; LE-LABEL: @loadCombine_4consecutive_rev_icmp0(
2486+
; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 1
2487+
; LE-NEXT: [[C:%.*]] = icmp eq i32 [[L1]], 0
2488+
; LE-NEXT: ret i1 [[C]]
2489+
;
2490+
; BE-LABEL: @loadCombine_4consecutive_rev_icmp0(
2491+
; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1
2492+
; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2
2493+
; BE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3
2494+
; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1
2495+
; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1
2496+
; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1
2497+
; BE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1
2498+
; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32
2499+
; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32
2500+
; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32
2501+
; BE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32
2502+
; BE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 8
2503+
; BE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 16
2504+
; BE-NEXT: [[S4:%.*]] = shl i32 [[E4]], 24
2505+
; BE-NEXT: [[O1:%.*]] = or i32 [[S4]], [[S3]]
2506+
; BE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S2]]
2507+
; BE-NEXT: [[O3:%.*]] = or i32 [[O2]], [[E1]]
2508+
; BE-NEXT: [[C:%.*]] = icmp eq i32 [[O3]], 0
2509+
; BE-NEXT: ret i1 [[C]]
2510+
;
2511+
%p1 = getelementptr i8, ptr %p, i32 1
2512+
%p2 = getelementptr i8, ptr %p, i32 2
2513+
%p3 = getelementptr i8, ptr %p, i32 3
2514+
%l1 = load i8, ptr %p
2515+
%l2 = load i8, ptr %p1
2516+
%l3 = load i8, ptr %p2
2517+
%l4 = load i8, ptr %p3
2518+
2519+
%e1 = zext i8 %l1 to i32
2520+
%e2 = zext i8 %l2 to i32
2521+
%e3 = zext i8 %l3 to i32
2522+
%e4 = zext i8 %l4 to i32
2523+
2524+
%s2 = shl i32 %e2, 8
2525+
%s3 = shl i32 %e3, 16
2526+
%s4 = shl i32 %e4, 24
2527+
2528+
%o1 = or i32 %s4, %s3
2529+
%o2 = or i32 %o1, %s2
2530+
%o3 = or i32 %o2, %e1
2531+
2532+
%c = icmp eq i32 %o3, 0
2533+
ret i1 %c
2534+
}
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=aggressive-instcombine -S | FileCheck %s
3+
4+
define i1 @remove_shift_nuw_ab(i8 %a, i8 %b, i8 %s) {
5+
; CHECK-LABEL: @remove_shift_nuw_ab(
6+
; CHECK-NEXT: [[T:%.*]] = shl nuw i8 [[A:%.*]], [[S:%.*]]
7+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[T]], [[B:%.*]]
8+
; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
9+
; CHECK-NEXT: ret i1 [[IC]]
10+
;
11+
%t = shl nuw i8 %a, %s
12+
%or = or i8 %t, %b
13+
%ic = icmp eq i8 %or, 0
14+
ret i1 %ic
15+
}
16+
17+
define i1 @remove_shift_nuw_ba(i8 %a, i8 %b, i8 %s) {
18+
; CHECK-LABEL: @remove_shift_nuw_ba(
19+
; CHECK-NEXT: [[T:%.*]] = shl nuw i8 [[A:%.*]], [[S:%.*]]
20+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[B:%.*]], [[T]]
21+
; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
22+
; CHECK-NEXT: ret i1 [[IC]]
23+
;
24+
%t = shl nuw i8 %a, %s
25+
%or = or i8 %b, %t
26+
%ic = icmp eq i8 %or, 0
27+
ret i1 %ic
28+
}
29+
30+
define i1 @remove_shift_nsw(i8 %a, i8 %b, i8 %s) {
31+
; CHECK-LABEL: @remove_shift_nsw(
32+
; CHECK-NEXT: [[T:%.*]] = shl nsw i8 [[A:%.*]], [[S:%.*]]
33+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[T]], [[B:%.*]]
34+
; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
35+
; CHECK-NEXT: ret i1 [[IC]]
36+
;
37+
%t = shl nsw i8 %a, %s
38+
%or = or i8 %t, %b
39+
%ic = icmp eq i8 %or, 0
40+
ret i1 %ic
41+
}
42+
43+
define i1 @remove_shift_nuw_ne(i8 %a, i8 %b, i8 %s) {
44+
; CHECK-LABEL: @remove_shift_nuw_ne(
45+
; CHECK-NEXT: [[T:%.*]] = shl nuw i8 [[A:%.*]], [[S:%.*]]
46+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[T]], [[B:%.*]]
47+
; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
48+
; CHECK-NEXT: ret i1 [[IC]]
49+
;
50+
%t = shl nuw i8 %a, %s
51+
%or = or i8 %t, %b
52+
%ic = icmp eq i8 %or, 0
53+
ret i1 %ic
54+
}
55+
56+
define i1 @remove_shift_nsw_ne(i8 %a, i8 %b, i8 %s) {
57+
; CHECK-LABEL: @remove_shift_nsw_ne(
58+
; CHECK-NEXT: [[T:%.*]] = shl nsw i8 [[A:%.*]], [[S:%.*]]
59+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[T]], [[B:%.*]]
60+
; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
61+
; CHECK-NEXT: ret i1 [[IC]]
62+
;
63+
%t = shl nsw i8 %a, %s
64+
%or = or i8 %t, %b
65+
%ic = icmp eq i8 %or, 0
66+
ret i1 %ic
67+
}
68+
69+
define i1 @remove_shift_wraps(i8 %a, i8 %b, i8 %s) {
70+
; CHECK-LABEL: @remove_shift_wraps(
71+
; CHECK-NEXT: [[T:%.*]] = shl i8 [[A:%.*]], [[S:%.*]]
72+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[T]], [[B:%.*]]
73+
; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
74+
; CHECK-NEXT: ret i1 [[IC]]
75+
;
76+
%t = shl i8 %a, %s
77+
%or = or i8 %t, %b
78+
%ic = icmp eq i8 %or, 0
79+
ret i1 %ic
80+
}
81+
82+
define i1 @remove_shift_chain_d(i8 %a, i8 %b, i8 %c, i8 %d, i8 %s) {
83+
; CHECK-LABEL: @remove_shift_chain_d(
84+
; CHECK-NEXT: [[DT:%.*]] = shl nuw i8 [[D:%.*]], [[S:%.*]]
85+
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[A:%.*]], [[B:%.*]]
86+
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[C:%.*]], [[DT]]
87+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[OR1]], [[OR2]]
88+
; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
89+
; CHECK-NEXT: ret i1 [[IC]]
90+
;
91+
%dt = shl nuw i8 %d, %s
92+
%or1 = or i8 %a, %b
93+
%or2 = or i8 %c, %dt
94+
%or = or i8 %or1, %or2
95+
%ic = icmp eq i8 %or, 0
96+
ret i1 %ic
97+
}
98+
99+
define i1 @remove_shift_chain_abcd(i8 %a, i8 %b, i8 %c, i8 %d, i8 %s) {
100+
; CHECK-LABEL: @remove_shift_chain_abcd(
101+
; CHECK-NEXT: [[AT:%.*]] = shl nuw i8 [[A:%.*]], [[S:%.*]]
102+
; CHECK-NEXT: [[BT:%.*]] = shl nuw i8 [[B:%.*]], 2
103+
; CHECK-NEXT: [[CT:%.*]] = shl nuw i8 [[C:%.*]], 1
104+
; CHECK-NEXT: [[DT:%.*]] = shl nuw i8 [[D:%.*]], [[S]]
105+
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AT]], [[BT]]
106+
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[CT]], [[DT]]
107+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[OR1]], [[OR2]]
108+
; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
109+
; CHECK-NEXT: ret i1 [[IC]]
110+
;
111+
%at = shl nuw i8 %a, %s
112+
%bt = shl nuw i8 %b, 2
113+
%ct = shl nuw i8 %c, 1
114+
%dt = shl nuw i8 %d, %s
115+
%or1 = or i8 %at, %bt
116+
%or2 = or i8 %ct, %dt
117+
%or = or i8 %or1, %or2
118+
%ic = icmp eq i8 %or, 0
119+
ret i1 %ic
120+
}
121+
122+
define i1 @remove_shift_chain_abcd_multiuse(i8 %a, i8 %b, i8 %c, i8 %d, i8 %s) {
123+
; CHECK-LABEL: @remove_shift_chain_abcd_multiuse(
124+
; CHECK-NEXT: [[AT:%.*]] = shl nuw i8 [[A:%.*]], [[S:%.*]]
125+
; CHECK-NEXT: [[BT:%.*]] = shl nuw i8 [[B:%.*]], 2
126+
; CHECK-NEXT: [[CT:%.*]] = shl nuw i8 [[C:%.*]], 1
127+
; CHECK-NEXT: [[DT:%.*]] = shl nuw i8 [[D:%.*]], [[S]]
128+
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AT]], [[BT]]
129+
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[CT]], [[DT]]
130+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[OR1]], [[OR2]]
131+
; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
132+
; CHECK-NEXT: call void @use(i8 [[OR]])
133+
; CHECK-NEXT: ret i1 [[IC]]
134+
;
135+
%at = shl nuw i8 %a, %s
136+
%bt = shl nuw i8 %b, 2
137+
%ct = shl nuw i8 %c, 1
138+
%dt = shl nuw i8 %d, %s
139+
%or1 = or i8 %at, %bt
140+
%or2 = or i8 %ct, %dt
141+
%or = or i8 %or1, %or2
142+
%ic = icmp eq i8 %or, 0
143+
call void @use(i8 %or)
144+
ret i1 %ic
145+
}
146+
147+
declare void @use(i8)

0 commit comments

Comments
 (0)