xref: /llvm-project/llvm/test/CodeGen/RISCV/compress-opt-branch.ll (revision 0a6a40d62ed338eb3aa57bfee83d958521542fba)
10e6c1576SIvan Tetyushkin; This test is designed to run 4 times, once with function attribute +c,
20e6c1576SIvan Tetyushkin; once with function attribute -c for eq/ne in icmp
30e6c1576SIvan Tetyushkin; The optimization should appear only with +c, otherwise default isel should be
40e6c1576SIvan Tetyushkin; choosen.
50e6c1576SIvan Tetyushkin;
60e6c1576SIvan Tetyushkin; RUN: llc -mtriple=riscv32 -target-abi ilp32d -mattr=+c,+f,+d -filetype=obj \
7e7e78274SCraig Topper; RUN:   -disable-block-placement < %s \
80e6c1576SIvan Tetyushkin; RUN:   | llvm-objdump -d --triple=riscv32 --mattr=+c,+f,+d -M no-aliases - \
9e7e78274SCraig Topper; RUN:   | FileCheck -check-prefix=RV32IFDC %s
100e6c1576SIvan Tetyushkin;
11*0a6a40d6SCraig Topper; RUN: llc -mtriple=riscv32 -target-abi ilp32d -mattr=+zca,+f,+d -filetype=obj \
12*0a6a40d6SCraig Topper; RUN:   -disable-block-placement < %s \
13*0a6a40d6SCraig Topper; RUN:   | llvm-objdump -d --triple=riscv32 --mattr=+zca,+f,+d -M no-aliases - \
14*0a6a40d6SCraig Topper; RUN:   | FileCheck -check-prefix=RV32IFDC %s
15*0a6a40d6SCraig Topper;
160e6c1576SIvan Tetyushkin; RUN: llc -mtriple=riscv32 -target-abi ilp32d -mattr=-c,+f,+d -filetype=obj \
17e7e78274SCraig Topper; RUN:   -disable-block-placement < %s \
180e6c1576SIvan Tetyushkin; RUN:   | llvm-objdump -d --triple=riscv32 --mattr=-c,+f,+d -M no-aliases - \
19e7e78274SCraig Topper; RUN:   | FileCheck -check-prefix=RV32IFD %s
200e6c1576SIvan Tetyushkin
210e6c1576SIvan Tetyushkin
220e6c1576SIvan Tetyushkin; constant is small and fit in 6 bit (compress imm)
23e7e78274SCraig Topper; RV32IFDC-LABEL: <f_small_pos_eq>:
24c532ba4eSWang Yaduo; RV32IFDC: c.li [[REG:.*]], 0x14
25e7e78274SCraig Topper; RV32IFDC: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
260e6c1576SIvan Tetyushkin; --- no compress extension
27e7e78274SCraig Topper; RV32IFD-LABEL: <f_small_pos_eq>:
28c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, 0x14
29e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
30e7e78274SCraig Topperdefine i32 @f_small_pos_eq(i32 %in0) minsize {
31e7e78274SCraig Topper  %cmp = icmp eq i32 %in0, 20
320e6c1576SIvan Tetyushkin  br i1 %cmp, label %if.then, label %if.else
330e6c1576SIvan Tetyushkinif.then:
340e6c1576SIvan Tetyushkin  %call = shl i32 %in0, 1
350e6c1576SIvan Tetyushkin  br label %if.end
360e6c1576SIvan Tetyushkinif.else:
370e6c1576SIvan Tetyushkin  %call2 = add i32 %in0, 42
380e6c1576SIvan Tetyushkin  br label %if.end
390e6c1576SIvan Tetyushkin
400e6c1576SIvan Tetyushkinif.end:
410e6c1576SIvan Tetyushkin  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
420e6c1576SIvan Tetyushkin  ret i32 %toRet
430e6c1576SIvan Tetyushkin}
440e6c1576SIvan Tetyushkin
450e6c1576SIvan Tetyushkin; constant is small and fit in 6 bit (compress imm)
46e7e78274SCraig Topper; RV32IFDC-LABEL: <f_small_pos_ne>:
47e7e78274SCraig Topper; RV32IFDC: c.li [[REG:.*]], 0x14
48e7e78274SCraig Topper; RV32IFDC: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
49e7e78274SCraig Topper; --- no compress extension
50e7e78274SCraig Topper; RV32IFD-LABEL: <f_small_pos_ne>:
51e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, 0x14
52e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
53e7e78274SCraig Topperdefine i32 @f_small_pos_ne(i32 %in0) minsize {
54e7e78274SCraig Topper  %cmp = icmp ne i32 %in0, 20
55e7e78274SCraig Topper  br i1 %cmp, label %if.then, label %if.else
56e7e78274SCraig Topperif.then:
57e7e78274SCraig Topper  %call = shl i32 %in0, 1
58e7e78274SCraig Topper  br label %if.end
59e7e78274SCraig Topperif.else:
60e7e78274SCraig Topper  %call2 = add i32 %in0, 42
61e7e78274SCraig Topper  br label %if.end
62e7e78274SCraig Topper
63e7e78274SCraig Topperif.end:
64e7e78274SCraig Topper  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
65e7e78274SCraig Topper  ret i32 %toRet
66e7e78274SCraig Topper}
67e7e78274SCraig Topper
68e7e78274SCraig Topper; constant is small and fit in 6 bit (compress imm)
69e7e78274SCraig Topper; RV32IFDC-LABEL: <f_small_neg_eq>:
70c532ba4eSWang Yaduo; RV32IFDC: c.li [[REG:.*]], -0x14
71e7e78274SCraig Topper; RV32IFDC: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
720e6c1576SIvan Tetyushkin; --- no compress extension
73e7e78274SCraig Topper; RV32IFD-LABEL: <f_small_neg_eq>:
74c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, -0x14
75e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
76e7e78274SCraig Topperdefine i32 @f_small_neg_eq(i32 %in0) minsize {
77e7e78274SCraig Topper  %cmp = icmp eq i32 %in0, -20
780e6c1576SIvan Tetyushkin  br i1 %cmp, label %if.then, label %if.else
790e6c1576SIvan Tetyushkinif.then:
800e6c1576SIvan Tetyushkin  %call = shl i32 %in0, 1
810e6c1576SIvan Tetyushkin  br label %if.end
820e6c1576SIvan Tetyushkinif.else:
830e6c1576SIvan Tetyushkin  %call2 = add i32 %in0, 42
840e6c1576SIvan Tetyushkin  br label %if.end
850e6c1576SIvan Tetyushkin
860e6c1576SIvan Tetyushkinif.end:
870e6c1576SIvan Tetyushkin  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
880e6c1576SIvan Tetyushkin  ret i32 %toRet
890e6c1576SIvan Tetyushkin}
900e6c1576SIvan Tetyushkin
910e6c1576SIvan Tetyushkin; constant is small and fit in 6 bit (compress imm)
92e7e78274SCraig Topper; RV32IFDC-LABEL: <f_small_neg_ne>:
93e7e78274SCraig Topper; RV32IFDC: c.li [[REG:.*]], -0x14
94e7e78274SCraig Topper; RV32IFDC: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
95e7e78274SCraig Topper; --- no compress extension
96e7e78274SCraig Topper; RV32IFD-LABEL: <f_small_neg_ne>:
97e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, -0x14
98e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
99e7e78274SCraig Topperdefine i32 @f_small_neg_ne(i32 %in0) minsize {
100e7e78274SCraig Topper  %cmp = icmp ne i32 %in0, -20
101e7e78274SCraig Topper  br i1 %cmp, label %if.then, label %if.else
102e7e78274SCraig Topperif.then:
103e7e78274SCraig Topper  %call = shl i32 %in0, 1
104e7e78274SCraig Topper  br label %if.end
105e7e78274SCraig Topperif.else:
106e7e78274SCraig Topper  %call2 = add i32 %in0, 42
107e7e78274SCraig Topper  br label %if.end
108e7e78274SCraig Topper
109e7e78274SCraig Topperif.end:
110e7e78274SCraig Topper  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
111e7e78274SCraig Topper  ret i32 %toRet
112e7e78274SCraig Topper}
113e7e78274SCraig Topper
114e7e78274SCraig Topper; constant is small and fit in 6 bit (compress imm)
115e7e78274SCraig Topper; RV32IFDC-LABEL: <f_small_edge_pos_eq>:
116c532ba4eSWang Yaduo; RV32IFDC: c.li [[REG:.*]], 0x1f
117e7e78274SCraig Topper; RV32IFDC: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
1180e6c1576SIvan Tetyushkin; --- no compress extension
119e7e78274SCraig Topper; RV32IFD-LABEL: <f_small_edge_pos_eq>:
120c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, 0x1f
121e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
122e7e78274SCraig Topperdefine i32 @f_small_edge_pos_eq(i32 %in0) minsize {
123e7e78274SCraig Topper  %cmp = icmp eq i32 %in0, 31
1240e6c1576SIvan Tetyushkin  br i1 %cmp, label %if.then, label %if.else
1250e6c1576SIvan Tetyushkinif.then:
1260e6c1576SIvan Tetyushkin  %call = shl i32 %in0, 1
1270e6c1576SIvan Tetyushkin  br label %if.end
1280e6c1576SIvan Tetyushkinif.else:
1290e6c1576SIvan Tetyushkin  %call2 = add i32 %in0, 42
1300e6c1576SIvan Tetyushkin  br label %if.end
1310e6c1576SIvan Tetyushkin
1320e6c1576SIvan Tetyushkinif.end:
1330e6c1576SIvan Tetyushkin  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
1340e6c1576SIvan Tetyushkin  ret i32 %toRet
1350e6c1576SIvan Tetyushkin}
1360e6c1576SIvan Tetyushkin
1370e6c1576SIvan Tetyushkin; constant is small and fit in 6 bit (compress imm)
138e7e78274SCraig Topper; RV32IFDC-LABEL: <f_small_edge_pos_ne>:
139e7e78274SCraig Topper; RV32IFDC: c.li [[REG:.*]], 0x1f
140e7e78274SCraig Topper; RV32IFDC: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
141e7e78274SCraig Topper; --- no compress extension
142e7e78274SCraig Topper; RV32IFD-LABEL: <f_small_edge_pos_ne>:
143e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, 0x1f
144e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
145e7e78274SCraig Topperdefine i32 @f_small_edge_pos_ne(i32 %in0) minsize {
146e7e78274SCraig Topper  %cmp = icmp ne i32 %in0, 31
147e7e78274SCraig Topper  br i1 %cmp, label %if.then, label %if.else
148e7e78274SCraig Topperif.then:
149e7e78274SCraig Topper  %call = shl i32 %in0, 1
150e7e78274SCraig Topper  br label %if.end
151e7e78274SCraig Topperif.else:
152e7e78274SCraig Topper  %call2 = add i32 %in0, 42
153e7e78274SCraig Topper  br label %if.end
154e7e78274SCraig Topper
155e7e78274SCraig Topperif.end:
156e7e78274SCraig Topper  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
157e7e78274SCraig Topper  ret i32 %toRet
158e7e78274SCraig Topper}
159e7e78274SCraig Topper
160e7e78274SCraig Topper; constant is small and fit in 6 bit (compress imm)
161e7e78274SCraig Topper; RV32IFDC-LABEL: <f_small_edge_neg_eq>:
162c532ba4eSWang Yaduo; RV32IFDC: c.li [[REG:.*]], -0x20
163e7e78274SCraig Topper; RV32IFDC: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
1640e6c1576SIvan Tetyushkin; --- no compress extension
165e7e78274SCraig Topper; RV32IFD-LABEL: <f_small_edge_neg_eq>:
166c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, -0x20
167e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
168e7e78274SCraig Topperdefine i32 @f_small_edge_neg_eq(i32 %in0) minsize {
169e7e78274SCraig Topper  %cmp = icmp eq i32 %in0, -32
170e7e78274SCraig Topper  br i1 %cmp, label %if.then, label %if.else
171e7e78274SCraig Topperif.then:
172e7e78274SCraig Topper  %call = shl i32 %in0, 1
173e7e78274SCraig Topper  br label %if.end
174e7e78274SCraig Topperif.else:
175e7e78274SCraig Topper  %call2 = add i32 %in0, 42
176e7e78274SCraig Topper  br label %if.end
177e7e78274SCraig Topper
178e7e78274SCraig Topperif.end:
179e7e78274SCraig Topper  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
180e7e78274SCraig Topper  ret i32 %toRet
181e7e78274SCraig Topper}
182e7e78274SCraig Topper
183e7e78274SCraig Topper; constant is small and fit in 6 bit (compress imm)
184e7e78274SCraig Topper; RV32IFDC-LABEL: <f_small_edge_neg_ne>:
185e7e78274SCraig Topper; RV32IFDC: c.li [[REG:.*]], -0x20
186e7e78274SCraig Topper; RV32IFDC: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
187e7e78274SCraig Topper; --- no compress extension
188e7e78274SCraig Topper; RV32IFD-LABEL: <f_small_edge_neg_ne>:
189e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, -0x20
190e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
191e7e78274SCraig Topperdefine i32 @f_small_edge_neg_ne(i32 %in0) minsize {
192e7e78274SCraig Topper  %cmp = icmp ne i32 %in0, -32
1930e6c1576SIvan Tetyushkin  br i1 %cmp, label %if.then, label %if.else
1940e6c1576SIvan Tetyushkinif.then:
1950e6c1576SIvan Tetyushkin  %call = shl i32 %in0, 1
1960e6c1576SIvan Tetyushkin  br label %if.end
1970e6c1576SIvan Tetyushkinif.else:
1980e6c1576SIvan Tetyushkin  %call2 = add i32 %in0, 42
1990e6c1576SIvan Tetyushkin  br label %if.end
2000e6c1576SIvan Tetyushkin
2010e6c1576SIvan Tetyushkinif.end:
2020e6c1576SIvan Tetyushkin  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
2030e6c1576SIvan Tetyushkin  ret i32 %toRet
2040e6c1576SIvan Tetyushkin}
2050e6c1576SIvan Tetyushkin
2060e6c1576SIvan Tetyushkin; constant is medium and not fit in 6 bit (compress imm),
2070e6c1576SIvan Tetyushkin; but fit in 12 bit (imm)
208e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_ledge_pos_eq>:
209c532ba4eSWang Yaduo; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], -0x20
210e7e78274SCraig Topper; RV32IFDC: c.bnez [[MAYZEROREG]], [[PLACE:.*]]
2110e6c1576SIvan Tetyushkin; --- no compress extension
212e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_ledge_pos_eq>:
213c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, 0x20
214e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
215e7e78274SCraig Topperdefine i32 @f_medium_ledge_pos_eq(i32 %in0) minsize {
216e7e78274SCraig Topper  %cmp = icmp eq i32 %in0, 32
2170e6c1576SIvan Tetyushkin  br i1 %cmp, label %if.then, label %if.else
2180e6c1576SIvan Tetyushkinif.then:
2190e6c1576SIvan Tetyushkin  %call = shl i32 %in0, 1
2200e6c1576SIvan Tetyushkin  br label %if.end
2210e6c1576SIvan Tetyushkinif.else:
2220e6c1576SIvan Tetyushkin  %call2 = add i32 %in0, 42
2230e6c1576SIvan Tetyushkin  br label %if.end
2240e6c1576SIvan Tetyushkin
2250e6c1576SIvan Tetyushkinif.end:
2260e6c1576SIvan Tetyushkin  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
2270e6c1576SIvan Tetyushkin  ret i32 %toRet
2280e6c1576SIvan Tetyushkin}
2290e6c1576SIvan Tetyushkin
2300e6c1576SIvan Tetyushkin; constant is medium and not fit in 6 bit (compress imm),
2310e6c1576SIvan Tetyushkin; but fit in 12 bit (imm)
232e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_ledge_pos_ne>:
233e7e78274SCraig Topper; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], -0x20
234e7e78274SCraig Topper; RV32IFDC: c.beqz [[MAYZEROREG]], [[PLACE:.*]]
235e7e78274SCraig Topper; --- no compress extension
236e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_ledge_pos_ne>:
237e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, 0x20
238e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
239e7e78274SCraig Topperdefine i32 @f_medium_ledge_pos_ne(i32 %in0) minsize {
240e7e78274SCraig Topper  %cmp = icmp ne i32 %in0, 32
241e7e78274SCraig Topper  br i1 %cmp, label %if.then, label %if.else
242e7e78274SCraig Topperif.then:
243e7e78274SCraig Topper  %call = shl i32 %in0, 1
244e7e78274SCraig Topper  br label %if.end
245e7e78274SCraig Topperif.else:
246e7e78274SCraig Topper  %call2 = add i32 %in0, 42
247e7e78274SCraig Topper  br label %if.end
248e7e78274SCraig Topper
249e7e78274SCraig Topperif.end:
250e7e78274SCraig Topper  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
251e7e78274SCraig Topper  ret i32 %toRet
252e7e78274SCraig Topper}
253e7e78274SCraig Topper
254e7e78274SCraig Topper; constant is medium and not fit in 6 bit (compress imm),
255e7e78274SCraig Topper; but fit in 12 bit (imm)
256e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_ledge_neg_eq>:
257c532ba4eSWang Yaduo; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], 0x21
258e7e78274SCraig Topper; RV32IFDC: c.bnez [[MAYZEROREG]], [[PLACE:.*]]
2590e6c1576SIvan Tetyushkin; --- no compress extension
260e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_ledge_neg_eq>:
261c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, -0x21
262e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
263e7e78274SCraig Topperdefine i32 @f_medium_ledge_neg_eq(i32 %in0) minsize {
264e7e78274SCraig Topper  %cmp = icmp eq i32 %in0, -33
2650e6c1576SIvan Tetyushkin  br i1 %cmp, label %if.then, label %if.else
2660e6c1576SIvan Tetyushkinif.then:
2670e6c1576SIvan Tetyushkin  %call = shl i32 %in0, 1
2680e6c1576SIvan Tetyushkin  br label %if.end
2690e6c1576SIvan Tetyushkinif.else:
2700e6c1576SIvan Tetyushkin  %call2 = add i32 %in0, 42
2710e6c1576SIvan Tetyushkin  br label %if.end
2720e6c1576SIvan Tetyushkin
2730e6c1576SIvan Tetyushkinif.end:
2740e6c1576SIvan Tetyushkin  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
2750e6c1576SIvan Tetyushkin  ret i32 %toRet
2760e6c1576SIvan Tetyushkin}
2770e6c1576SIvan Tetyushkin
2780e6c1576SIvan Tetyushkin; constant is medium and not fit in 6 bit (compress imm),
2790e6c1576SIvan Tetyushkin; but fit in 12 bit (imm)
280e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_ledge_neg_ne>:
281e7e78274SCraig Topper; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], 0x21
282e7e78274SCraig Topper; RV32IFDC: c.beqz [[MAYZEROREG]], [[PLACE:.*]]
283e7e78274SCraig Topper; --- no compress extension
284e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_ledge_neg_ne>:
285e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, -0x21
286e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
287e7e78274SCraig Topperdefine i32 @f_medium_ledge_neg_ne(i32 %in0) minsize {
288e7e78274SCraig Topper  %cmp = icmp ne i32 %in0, -33
289e7e78274SCraig Topper  br i1 %cmp, label %if.then, label %if.else
290e7e78274SCraig Topperif.then:
291e7e78274SCraig Topper  %call = shl i32 %in0, 1
292e7e78274SCraig Topper  br label %if.end
293e7e78274SCraig Topperif.else:
294e7e78274SCraig Topper  %call2 = add i32 %in0, 42
295e7e78274SCraig Topper  br label %if.end
296e7e78274SCraig Topper
297e7e78274SCraig Topperif.end:
298e7e78274SCraig Topper  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
299e7e78274SCraig Topper  ret i32 %toRet
300e7e78274SCraig Topper}
301e7e78274SCraig Topper
302e7e78274SCraig Topper; constant is medium and not fit in 6 bit (compress imm),
303e7e78274SCraig Topper; but fit in 12 bit (imm)
304e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_pos_eq>:
305c532ba4eSWang Yaduo; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], -0x3f
306e7e78274SCraig Topper; RV32IFDC: c.bnez [[MAYZEROREG]], [[PLACE:.*]]
3070e6c1576SIvan Tetyushkin; --- no compress extension
308e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_pos_eq>:
309c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, 0x3f
310e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
311e7e78274SCraig Topperdefine i32 @f_medium_pos_eq(i32 %in0) minsize {
312e7e78274SCraig Topper  %cmp = icmp eq i32 %in0, 63
3130e6c1576SIvan Tetyushkin  br i1 %cmp, label %if.then, label %if.else
3140e6c1576SIvan Tetyushkinif.then:
3150e6c1576SIvan Tetyushkin  %call = shl i32 %in0, 1
3160e6c1576SIvan Tetyushkin  br label %if.end
3170e6c1576SIvan Tetyushkinif.else:
3180e6c1576SIvan Tetyushkin  %call2 = add i32 %in0, 42
3190e6c1576SIvan Tetyushkin  br label %if.end
3200e6c1576SIvan Tetyushkin
3210e6c1576SIvan Tetyushkinif.end:
3220e6c1576SIvan Tetyushkin  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
3230e6c1576SIvan Tetyushkin  ret i32 %toRet
3240e6c1576SIvan Tetyushkin}
3250e6c1576SIvan Tetyushkin
3260e6c1576SIvan Tetyushkin; constant is medium and not fit in 6 bit (compress imm),
3270e6c1576SIvan Tetyushkin; but fit in 12 bit (imm)
328e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_pos_ne>:
329e7e78274SCraig Topper; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], -0x3f
330e7e78274SCraig Topper; RV32IFDC: c.beqz [[MAYZEROREG]], [[PLACE:.*]]
331e7e78274SCraig Topper; --- no compress extension
332e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_pos_ne>:
333e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, 0x3f
334e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
335e7e78274SCraig Topperdefine i32 @f_medium_pos_ne(i32 %in0) minsize {
336e7e78274SCraig Topper  %cmp = icmp ne i32 %in0, 63
337e7e78274SCraig Topper  br i1 %cmp, label %if.then, label %if.else
338e7e78274SCraig Topperif.then:
339e7e78274SCraig Topper  %call = shl i32 %in0, 1
340e7e78274SCraig Topper  br label %if.end
341e7e78274SCraig Topperif.else:
342e7e78274SCraig Topper  %call2 = add i32 %in0, 42
343e7e78274SCraig Topper  br label %if.end
344e7e78274SCraig Topper
345e7e78274SCraig Topperif.end:
346e7e78274SCraig Topper  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
347e7e78274SCraig Topper  ret i32 %toRet
348e7e78274SCraig Topper}
349e7e78274SCraig Topper
350e7e78274SCraig Topper; constant is medium and not fit in 6 bit (compress imm),
351e7e78274SCraig Topper; but fit in 12 bit (imm)
352e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_neg_eq>:
353c532ba4eSWang Yaduo; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], 0x3f
354e7e78274SCraig Topper; RV32IFDC: c.bnez [[MAYZEROREG]], [[PLACE:.*]]
3550e6c1576SIvan Tetyushkin; --- no compress extension
356e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_neg_eq>:
357c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, -0x3f
358e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
359e7e78274SCraig Topperdefine i32 @f_medium_neg_eq(i32 %in0) minsize {
360e7e78274SCraig Topper  %cmp = icmp eq i32 %in0, -63
3610e6c1576SIvan Tetyushkin  br i1 %cmp, label %if.then, label %if.else
3620e6c1576SIvan Tetyushkinif.then:
3630e6c1576SIvan Tetyushkin  %call = shl i32 %in0, 1
3640e6c1576SIvan Tetyushkin  br label %if.end
3650e6c1576SIvan Tetyushkinif.else:
3660e6c1576SIvan Tetyushkin  %call2 = add i32 %in0, 42
3670e6c1576SIvan Tetyushkin  br label %if.end
3680e6c1576SIvan Tetyushkin
3690e6c1576SIvan Tetyushkinif.end:
3700e6c1576SIvan Tetyushkin  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
3710e6c1576SIvan Tetyushkin  ret i32 %toRet
3720e6c1576SIvan Tetyushkin}
3730e6c1576SIvan Tetyushkin
3740e6c1576SIvan Tetyushkin; constant is medium and not fit in 6 bit (compress imm),
3750e6c1576SIvan Tetyushkin; but fit in 12 bit (imm)
376e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_neg_ne>:
377e7e78274SCraig Topper; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], 0x3f
378e7e78274SCraig Topper; RV32IFDC: c.beqz [[MAYZEROREG]], [[PLACE:.*]]
3790e6c1576SIvan Tetyushkin; --- no compress extension
380e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_neg_ne>:
381e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, -0x3f
382e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
383e7e78274SCraig Topperdefine i32 @f_medium_neg_ne(i32 %in0) minsize {
384e7e78274SCraig Topper  %cmp = icmp ne i32 %in0, -63
385e7e78274SCraig Topper  br i1 %cmp, label %if.then, label %if.else
386e7e78274SCraig Topperif.then:
387e7e78274SCraig Topper  %call = shl i32 %in0, 1
388e7e78274SCraig Topper  br label %if.end
389e7e78274SCraig Topperif.else:
390e7e78274SCraig Topper  %call2 = add i32 %in0, 42
391e7e78274SCraig Topper  br label %if.end
392e7e78274SCraig Topper
393e7e78274SCraig Topperif.end:
394e7e78274SCraig Topper  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
395e7e78274SCraig Topper  ret i32 %toRet
396e7e78274SCraig Topper}
397e7e78274SCraig Topper
398e7e78274SCraig Topper; constant is medium and not fit in 6 bit (compress imm),
399e7e78274SCraig Topper; but fit in 12 bit (imm)
400e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_bedge_pos_eq>:
401e7e78274SCraig Topper; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], -0x7ff
402e7e78274SCraig Topper; RV32IFDC: c.bnez [[MAYZEROREG]], [[PLACE:.*]]
403e7e78274SCraig Topper; --- no compress extension
404e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_bedge_pos_eq>:
405c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, 0x7ff
406e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
407e7e78274SCraig Topperdefine i32 @f_medium_bedge_pos_eq(i32 %in0) minsize {
408e7e78274SCraig Topper  %cmp = icmp eq i32 %in0, 2047
409e7e78274SCraig Topper  br i1 %cmp, label %if.then, label %if.else
410e7e78274SCraig Topperif.then:
411e7e78274SCraig Topper  %call = shl i32 %in0, 1
412e7e78274SCraig Topper  br label %if.end
413e7e78274SCraig Topperif.else:
414e7e78274SCraig Topper  %call2 = add i32 %in0, 42
415e7e78274SCraig Topper  br label %if.end
416e7e78274SCraig Topper
417e7e78274SCraig Topperif.end:
418e7e78274SCraig Topper  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
419e7e78274SCraig Topper  ret i32 %toRet
420e7e78274SCraig Topper}
421e7e78274SCraig Topper
422e7e78274SCraig Topper; constant is medium and not fit in 6 bit (compress imm),
423e7e78274SCraig Topper; but fit in 12 bit (imm)
424e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_bedge_pos_ne>:
425e7e78274SCraig Topper; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], -0x7ff
426e7e78274SCraig Topper; RV32IFDC: c.beqz [[MAYZEROREG]], [[PLACE:.*]]
427e7e78274SCraig Topper; --- no compress extension
428e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_bedge_pos_ne>:
429e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, 0x7ff
430e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
431e7e78274SCraig Topperdefine i32 @f_medium_bedge_pos_ne(i32 %in0) minsize {
432e7e78274SCraig Topper  %cmp = icmp ne i32 %in0, 2047
4330e6c1576SIvan Tetyushkin  br i1 %cmp, label %if.then, label %if.else
4340e6c1576SIvan Tetyushkinif.then:
4350e6c1576SIvan Tetyushkin  %call = shl i32 %in0, 1
4360e6c1576SIvan Tetyushkin  br label %if.end
4370e6c1576SIvan Tetyushkinif.else:
4380e6c1576SIvan Tetyushkin  %call2 = add i32 %in0, 42
4390e6c1576SIvan Tetyushkin  br label %if.end
4400e6c1576SIvan Tetyushkin
4410e6c1576SIvan Tetyushkinif.end:
4420e6c1576SIvan Tetyushkin  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
4430e6c1576SIvan Tetyushkin  ret i32 %toRet
4440e6c1576SIvan Tetyushkin}
4450e6c1576SIvan Tetyushkin
4460e6c1576SIvan Tetyushkin; constant is medium and not fit in 6 bit (compress imm),
4470e6c1576SIvan Tetyushkin; but fit in 12 bit (imm), negative value fit in 12 bit too.
448e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_bedge_neg_eq>:
449c532ba4eSWang Yaduo; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], 0x7ff
450e7e78274SCraig Topper; RV32IFDC: c.bnez [[MAYZEROREG]], [[PLACE:.*]]
4510e6c1576SIvan Tetyushkin; --- no compress extension
452e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_bedge_neg_eq>:
453c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, -0x7ff
454e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
455e7e78274SCraig Topperdefine i32 @f_medium_bedge_neg_eq(i32 %in0) minsize {
456e7e78274SCraig Topper  %cmp = icmp eq i32 %in0, -2047
457e7e78274SCraig Topper  br i1 %cmp, label %if.then, label %if.else
458e7e78274SCraig Topperif.then:
459e7e78274SCraig Topper  %call = shl i32 %in0, 1
460e7e78274SCraig Topper  br label %if.end
461e7e78274SCraig Topperif.else:
462e7e78274SCraig Topper  %call2 = add i32 %in0, 42
463e7e78274SCraig Topper  br label %if.end
464e7e78274SCraig Topper
465e7e78274SCraig Topperif.end:
466e7e78274SCraig Topper  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
467e7e78274SCraig Topper  ret i32 %toRet
468e7e78274SCraig Topper}
469e7e78274SCraig Topper
470e7e78274SCraig Topper; constant is medium and not fit in 6 bit (compress imm),
471e7e78274SCraig Topper; but fit in 12 bit (imm), negative value fit in 12 bit too.
472e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_bedge_neg_ne>:
473e7e78274SCraig Topper; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], 0x7ff
474e7e78274SCraig Topper; RV32IFDC: c.beqz [[MAYZEROREG]], [[PLACE:.*]]
475e7e78274SCraig Topper; --- no compress extension
476e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_bedge_neg_ne>:
477e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, -0x7ff
478e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
479e7e78274SCraig Topperdefine i32 @f_medium_bedge_neg_ne(i32 %in0) minsize {
480e7e78274SCraig Topper  %cmp = icmp ne i32 %in0, -2047
4810e6c1576SIvan Tetyushkin  br i1 %cmp, label %if.then, label %if.else
4820e6c1576SIvan Tetyushkinif.then:
4830e6c1576SIvan Tetyushkin  %call = shl i32 %in0, 1
4840e6c1576SIvan Tetyushkin  br label %if.end
4850e6c1576SIvan Tetyushkinif.else:
4860e6c1576SIvan Tetyushkin  %call2 = add i32 %in0, 42
4870e6c1576SIvan Tetyushkin  br label %if.end
4880e6c1576SIvan Tetyushkin
4890e6c1576SIvan Tetyushkinif.end:
4900e6c1576SIvan Tetyushkin  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
4910e6c1576SIvan Tetyushkin  ret i32 %toRet
4920e6c1576SIvan Tetyushkin}
4930e6c1576SIvan Tetyushkin
4940e6c1576SIvan Tetyushkin; constant is big and do not fit in 12 bit (imm), fit in i32
495e7e78274SCraig Topper; RV32IFDC-LABEL: <f_big_ledge_pos_eq>:
4963c37f926SCraig Topper; RV32IFDC: c.li [[REG:.*]], 0x1
4973c37f926SCraig Topper; RV32IFDC: c.slli [[REG]], 0xb
498e7e78274SCraig Topper; RV32IFDC: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
4990e6c1576SIvan Tetyushkin; --- no compress extension
500e7e78274SCraig Topper; RV32IFD-LABEL: <f_big_ledge_pos_eq>:
5013c37f926SCraig Topper; RV32IFD: addi [[REG1:.*]], zero, 0x1
5023c37f926SCraig Topper; RV32IFD: slli [[REG2:.*]], [[REG1]], 0xb
503e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG2]], [[PLACE:.*]]
504e7e78274SCraig Topperdefine i32 @f_big_ledge_pos_eq(i32 %in0) minsize {
505e7e78274SCraig Topper  %cmp = icmp eq i32 %in0, 2048
5060e6c1576SIvan Tetyushkin  br i1 %cmp, label %if.then, label %if.else
5070e6c1576SIvan Tetyushkinif.then:
5080e6c1576SIvan Tetyushkin  %call = shl i32 %in0, 1
5090e6c1576SIvan Tetyushkin  br label %if.end
5100e6c1576SIvan Tetyushkinif.else:
5110e6c1576SIvan Tetyushkin  %call2 = add i32 %in0, 42
5120e6c1576SIvan Tetyushkin  br label %if.end
5130e6c1576SIvan Tetyushkin
5140e6c1576SIvan Tetyushkinif.end:
5150e6c1576SIvan Tetyushkin  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
5160e6c1576SIvan Tetyushkin  ret i32 %toRet
5170e6c1576SIvan Tetyushkin}
5180e6c1576SIvan Tetyushkin
5190e6c1576SIvan Tetyushkin; constant is big and do not fit in 12 bit (imm), fit in i32
520e7e78274SCraig Topper; RV32IFDC-LABEL: <f_big_ledge_pos_ne>:
521e7e78274SCraig Topper; RV32IFDC: c.li [[REG:.*]], 0x1
522e7e78274SCraig Topper; RV32IFDC: c.slli [[REG]], 0xb
523e7e78274SCraig Topper; RV32IFDC: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
524e7e78274SCraig Topper; --- no compress extension
525e7e78274SCraig Topper; RV32IFD-LABEL: <f_big_ledge_pos_ne>:
526e7e78274SCraig Topper; RV32IFD: addi [[REG1:.*]], zero, 0x1
527e7e78274SCraig Topper; RV32IFD: slli [[REG2:.*]], [[REG1]], 0xb
528e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG2]], [[PLACE:.*]]
529e7e78274SCraig Topperdefine i32 @f_big_ledge_pos_ne(i32 %in0) minsize {
530e7e78274SCraig Topper  %cmp = icmp ne i32 %in0, 2048
531e7e78274SCraig Topper  br i1 %cmp, label %if.then, label %if.else
532e7e78274SCraig Topperif.then:
533e7e78274SCraig Topper  %call = shl i32 %in0, 1
534e7e78274SCraig Topper  br label %if.end
535e7e78274SCraig Topperif.else:
536e7e78274SCraig Topper  %call2 = add i32 %in0, 42
537e7e78274SCraig Topper  br label %if.end
538e7e78274SCraig Topper
539e7e78274SCraig Topperif.end:
540e7e78274SCraig Topper  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
541e7e78274SCraig Topper  ret i32 %toRet
542e7e78274SCraig Topper}
543e7e78274SCraig Topper
544e7e78274SCraig Topper; constant is big and do not fit in 12 bit (imm), fit in i32
545e7e78274SCraig Topper; RV32IFDC-LABEL: <f_big_ledge_neg_eq>:
5463c37f926SCraig Topper; RV32IFDC: c.lui [[REG1:.*]], 0xfffff
5473c37f926SCraig Topper; RV32IFDC: addi [[REG2:.*]], [[REG1]], 0x7ff
548e7e78274SCraig Topper; RV32IFDC: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
5490e6c1576SIvan Tetyushkin; --- no compress extension
550e7e78274SCraig Topper; RV32IFD-LABEL: <f_big_ledge_neg_eq>:
5513c37f926SCraig Topper; RV32IFD: lui [[REG1:.*]], 0xfffff
5523c37f926SCraig Topper; RV32IFD: addi [[REG2:.*]], [[REG1]], 0x7ff
553e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG2]], [[PLACE:.*]]
554e7e78274SCraig Topperdefine i32 @f_big_ledge_neg_eq(i32 %in0) minsize {
555e7e78274SCraig Topper  %cmp = icmp eq i32 %in0, -2049
556e7e78274SCraig Topper  br i1 %cmp, label %if.then, label %if.else
557e7e78274SCraig Topperif.then:
558e7e78274SCraig Topper  %call = shl i32 %in0, 1
559e7e78274SCraig Topper  br label %if.end
560e7e78274SCraig Topperif.else:
561e7e78274SCraig Topper  %call2 = add i32 %in0, 42
562e7e78274SCraig Topper  br label %if.end
563e7e78274SCraig Topper
564e7e78274SCraig Topperif.end:
565e7e78274SCraig Topper  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
566e7e78274SCraig Topper  ret i32 %toRet
567e7e78274SCraig Topper}
568e7e78274SCraig Topper
569e7e78274SCraig Topper; constant is big and do not fit in 12 bit (imm), fit in i32
570e7e78274SCraig Topper; RV32IFDC-LABEL: <f_big_ledge_neg_ne>:
571e7e78274SCraig Topper; RV32IFDC: c.lui [[REG1:.*]], 0xfffff
572e7e78274SCraig Topper; RV32IFDC: addi [[REG2:.*]], [[REG1]], 0x7ff
573e7e78274SCraig Topper; RV32IFDC: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]]
574e7e78274SCraig Topper; --- no compress extension
575e7e78274SCraig Topper; RV32IFD-LABEL: <f_big_ledge_neg_ne>:
576e7e78274SCraig Topper; RV32IFD: lui [[REG1:.*]], 0xfffff
577e7e78274SCraig Topper; RV32IFD: addi [[REG2:.*]], [[REG1]], 0x7ff
578e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG2]], [[PLACE:.*]]
579e7e78274SCraig Topperdefine i32 @f_big_ledge_neg_ne(i32 %in0) minsize {
580e7e78274SCraig Topper  %cmp = icmp ne i32 %in0, -2049
5810e6c1576SIvan Tetyushkin  br i1 %cmp, label %if.then, label %if.else
5820e6c1576SIvan Tetyushkinif.then:
5830e6c1576SIvan Tetyushkin  %call = shl i32 %in0, 1
5840e6c1576SIvan Tetyushkin  br label %if.end
5850e6c1576SIvan Tetyushkinif.else:
5860e6c1576SIvan Tetyushkin  %call2 = add i32 %in0, 42
5870e6c1576SIvan Tetyushkin  br label %if.end
5880e6c1576SIvan Tetyushkin
5890e6c1576SIvan Tetyushkinif.end:
5900e6c1576SIvan Tetyushkin  %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ]
5910e6c1576SIvan Tetyushkin  ret i32 %toRet
5920e6c1576SIvan Tetyushkin}
593