[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / leaFixup32.mir
blob67339715e7a2b8875c15f519317fca1480f764ca
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -run-pass x86-fixup-LEAs -mtriple=i386 -verify-machineinstrs -mcpu=corei7-avx -o - %s | FileCheck %s
3 --- |
4   ; ModuleID = 'test/CodeGen/X86/fixup-lea.ll'
5   source_filename = "test/CodeGen/X86/fixup-lea.ll"
6   target datalayout = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"
7   target triple = "i386"
8   ;generated using: llc -stop-after x86-pad-short-functions fixup-lea.ll > leaFinxup32.mir
10   ;test2add_32: 3 operands LEA32r that can be replaced with 2 add instructions
11   ; where ADD32ri is chosen
12   define i32 @test2add_32() {
13     ret i32 0
14   }
16   ;test2add_ebp_32: 3 operands LEA32r that can be replaced with 2 add instructions
17   ; where the base is rbp/r13/ebp register
18   define i32 @test2add_ebp_32() {
19     ret i32 0
20   }
22   ;test1add_ebp_32: 2 operands LEA32r where base register is ebp and can be replaced
23   ; with an add instruction
24   define i32 @test1add_ebp_32() {
25     ret i32 0
26   }
28   ;testleaadd_32: 3 operands LEA32r that can be replaced with 1 lea 1 add instructions
29   define i32 @testleaadd_32() {
30     ret i32 0
31   }
33   ;testleaadd_ebp_32: 3 operands LEA32r that can be replaced with 1 lea 1 add instructions
34   ; where the base is ebp register
35   define i32 @testleaadd_ebp_32() {
36     ret i32 0
37   }
39   ;test1lea_ebp_32: 2 operands LEA32r wher base register is rbp/r13/ebp and can be replaced
40   ; with a lea instruction
41   define i32 @test1lea_ebp_32() {
42     ret i32 0
43   }
45   ;test2addi32_32: 3 operands LEA32r that can be replaced with 2 add instructions where ADD32ri32
46   ; is chosen
47   define i32 @test2addi32_32() {
48     ret i32 0
49   }
51   ;test_leab_ebp_leais_32: 2 operands LEA32r that can be replaced with LEA_IS form
52   ; where the base is rbp/r13/ebp register
53   define i32 @test_leab_ebp_leais_32() {
54     ret i32 0
55   }
57   ;test_leabi_ebp_leais_32: 3 operands LEA32r that can be replaced with LEA_IS form
58   ; where the base and the index are ebp register and there is offset
59   define i32 @test_leabi_ebp_leais_32() {
60     ret i32 0
61   }
63   ;testleaadd_ebp_index2_32: 3 operands LEA32r that can be replaced with 1 lea 1 add instructions
64   ; where the base and the index are ebp register and there is scale
65   define i32 @testleaadd_ebp_index2_32() {
66     ret i32 0
67   }
69   ;test_skip_opt_32: 3 operands LEA32r that can not be replaced with 2 instructions
70   define i32 @test_skip_opt_32() {
71     ret i32 0
72   }
74   ;test_skip_eflags_32: LEA32r that cannot be replaced since its not safe to clobber eflags
75   define i32 @test_skip_eflags_32() {
76     ret i32 0
77   }
79 ...
80 ---
81 name:            test2add_32
82 alignment:       16
83 exposesReturnsTwice: false
84 legalized:       false
85 regBankSelected: false
86 selected:        false
87 tracksRegLiveness: true
88 liveins:
89   - { reg: '$eax' }
90   - { reg: '$ebp' }
91 frameInfo:
92   isFrameAddressTaken: false
93   isReturnAddressTaken: false
94   hasStackMap:     false
95   hasPatchPoint:   false
96   stackSize:       0
97   offsetAdjustment: 0
98   maxAlignment:    0
99   adjustsStack:    false
100   hasCalls:        false
101   maxCallFrameSize: 0
102   hasOpaqueSPAdjustment: false
103   hasVAStart:      false
104   hasMustTailInVarArgFunc: false
105 body:             |
106   bb.0 (%ir-block.0):
107     liveins: $eax, $ebp
109     ; CHECK-LABEL: name: test2add_32
110     ; CHECK: liveins: $eax, $ebp
111     ; CHECK: $eax = ADD32rr $eax, $ebp, implicit-def $eflags
112     ; CHECK: $eax = ADD32ri $eax, -5, implicit-def $eflags
113     ; CHECK: RET64 $eax
114     $eax = LEA32r killed $eax, 1, killed $ebp, -5, $noreg
115     RET64 $eax
119 name:            test2add_ebp_32
120 alignment:       16
121 exposesReturnsTwice: false
122 legalized:       false
123 regBankSelected: false
124 selected:        false
125 tracksRegLiveness: true
126 liveins:
127   - { reg: '$eax' }
128   - { reg: '$ebp' }
129 frameInfo:
130   isFrameAddressTaken: false
131   isReturnAddressTaken: false
132   hasStackMap:     false
133   hasPatchPoint:   false
134   stackSize:       0
135   offsetAdjustment: 0
136   maxAlignment:    0
137   adjustsStack:    false
138   hasCalls:        false
139   maxCallFrameSize: 0
140   hasOpaqueSPAdjustment: false
141   hasVAStart:      false
142   hasMustTailInVarArgFunc: false
143 body:             |
144   bb.0 (%ir-block.0):
145     liveins: $eax, $ebp
147     ; CHECK-LABEL: name: test2add_ebp_32
148     ; CHECK: liveins: $eax, $ebp
149     ; CHECK: $ebp = ADD32rr $ebp, $eax, implicit-def $eflags
150     ; CHECK: $ebp = ADD32ri $ebp, -5, implicit-def $eflags
151     ; CHECK: RET64 $ebp
152     $ebp = LEA32r killed $ebp, 1, killed $eax, -5, $noreg
153     RET64 $ebp
157 name:            test1add_ebp_32
158 alignment:       16
159 exposesReturnsTwice: false
160 legalized:       false
161 regBankSelected: false
162 selected:        false
163 tracksRegLiveness: true
164 liveins:
165   - { reg: '$eax' }
166   - { reg: '$ebp' }
167 frameInfo:
168   isFrameAddressTaken: false
169   isReturnAddressTaken: false
170   hasStackMap:     false
171   hasPatchPoint:   false
172   stackSize:       0
173   offsetAdjustment: 0
174   maxAlignment:    0
175   adjustsStack:    false
176   hasCalls:        false
177   maxCallFrameSize: 0
178   hasOpaqueSPAdjustment: false
179   hasVAStart:      false
180   hasMustTailInVarArgFunc: false
181 body:             |
182   bb.0 (%ir-block.0):
183     liveins: $eax, $ebp
185     ; CHECK-LABEL: name: test1add_ebp_32
186     ; CHECK: liveins: $eax, $ebp
187     ; CHECK: $ebp = ADD32rr $ebp, $eax, implicit-def $eflags
188     ; CHECK: RET64 $ebp
189     $ebp = LEA32r killed $ebp, 1, killed $eax, 0, $noreg
190     RET64 $ebp
194 name:            testleaadd_32
195 alignment:       16
196 exposesReturnsTwice: false
197 legalized:       false
198 regBankSelected: false
199 selected:        false
200 tracksRegLiveness: true
201 liveins:
202   - { reg: '$eax' }
203   - { reg: '$ebp' }
204   - { reg: '$ebx' }
205 frameInfo:
206   isFrameAddressTaken: false
207   isReturnAddressTaken: false
208   hasStackMap:     false
209   hasPatchPoint:   false
210   stackSize:       0
211   offsetAdjustment: 0
212   maxAlignment:    0
213   adjustsStack:    false
214   hasCalls:        false
215   maxCallFrameSize: 0
216   hasOpaqueSPAdjustment: false
217   hasVAStart:      false
218   hasMustTailInVarArgFunc: false
219 body:             |
220   bb.0 (%ir-block.0):
221     liveins: $eax, $ebp, $esi
223     ; CHECK-LABEL: name: testleaadd_32
224     ; CHECK: liveins: $eax, $ebp, $esi
225     ; CHECK: $ebx = LEA32r killed $eax, 1, killed $ebp, 0, $noreg
226     ; CHECK: $ebx = ADD32ri $ebx, -5, implicit-def $eflags
227     ; CHECK: RET64 $ebx
228     $ebx = LEA32r killed $eax, 1, killed $ebp, -5, $noreg
229     RET64 $ebx
233 name:            testleaadd_ebp_32
234 alignment:       16
235 exposesReturnsTwice: false
236 legalized:       false
237 regBankSelected: false
238 selected:        false
239 tracksRegLiveness: true
240 liveins:
241   - { reg: '$eax' }
242   - { reg: '$ebp' }
243   - { reg: '$ebx' }
244 frameInfo:
245   isFrameAddressTaken: false
246   isReturnAddressTaken: false
247   hasStackMap:     false
248   hasPatchPoint:   false
249   stackSize:       0
250   offsetAdjustment: 0
251   maxAlignment:    0
252   adjustsStack:    false
253   hasCalls:        false
254   maxCallFrameSize: 0
255   hasOpaqueSPAdjustment: false
256   hasVAStart:      false
257   hasMustTailInVarArgFunc: false
258 body:             |
259   bb.0 (%ir-block.0):
260     liveins: $eax, $ebp
262     ; CHECK-LABEL: name: testleaadd_ebp_32
263     ; CHECK: liveins: $eax, $ebp
264     ; CHECK: $ebx = LEA32r killed $eax, 1, killed $ebp, 0, $noreg
265     ; CHECK: $ebx = ADD32ri $ebx, -5, implicit-def $eflags
266     ; CHECK: RET64 $ebx
267     $ebx = LEA32r killed $ebp, 1, killed $eax, -5, $noreg
268     RET64 $ebx
272 name:            test1lea_ebp_32
273 alignment:       16
274 exposesReturnsTwice: false
275 legalized:       false
276 regBankSelected: false
277 selected:        false
278 tracksRegLiveness: true
279 liveins:
280   - { reg: '$eax' }
281   - { reg: '$ebp' }
282   - { reg: '$ebx' }
283 frameInfo:
284   isFrameAddressTaken: false
285   isReturnAddressTaken: false
286   hasStackMap:     false
287   hasPatchPoint:   false
288   stackSize:       0
289   offsetAdjustment: 0
290   maxAlignment:    0
291   adjustsStack:    false
292   hasCalls:        false
293   maxCallFrameSize: 0
294   hasOpaqueSPAdjustment: false
295   hasVAStart:      false
296   hasMustTailInVarArgFunc: false
297 body:             |
298   bb.0 (%ir-block.0):
299     liveins: $eax, $ebp
301     ; CHECK-LABEL: name: test1lea_ebp_32
302     ; CHECK: liveins: $eax, $ebp
303     ; CHECK: $ebx = LEA32r killed $eax, 1, killed $ebp, 0, $noreg
304     ; CHECK: RET64 $ebx
305     $ebx = LEA32r killed $ebp, 1, killed $eax, 0, $noreg
306     RET64 $ebx
310 name:            test2addi32_32
311 alignment:       16
312 exposesReturnsTwice: false
313 legalized:       false
314 regBankSelected: false
315 selected:        false
316 tracksRegLiveness: true
317 liveins:
318   - { reg: '$eax' }
319   - { reg: '$ebp' }
320 frameInfo:
321   isFrameAddressTaken: false
322   isReturnAddressTaken: false
323   hasStackMap:     false
324   hasPatchPoint:   false
325   stackSize:       0
326   offsetAdjustment: 0
327   maxAlignment:    0
328   adjustsStack:    false
329   hasCalls:        false
330   maxCallFrameSize: 0
331   hasOpaqueSPAdjustment: false
332   hasVAStart:      false
333   hasMustTailInVarArgFunc: false
334 body:             |
335   bb.0 (%ir-block.0):
336     liveins: $eax, $ebp
338     ; CHECK-LABEL: name: test2addi32_32
339     ; CHECK: liveins: $eax, $ebp
340     ; CHECK: $eax = ADD32rr $eax, $ebp, implicit-def $eflags
341     ; CHECK: $eax = ADD32ri $eax, 129, implicit-def $eflags
342     ; CHECK: RET64 $eax
343     $eax = LEA32r killed $eax, 1, killed $ebp, 129, $noreg
344     RET64 $eax
348 name:            test_leab_ebp_leais_32
349 alignment:       16
350 exposesReturnsTwice: false
351 legalized:       false
352 regBankSelected: false
353 selected:        false
354 tracksRegLiveness: true
355 liveins:
356   - { reg: '$eax' }
357   - { reg: '$ebx' }
358   - { reg: '$ebp' }
359 frameInfo:
360   isFrameAddressTaken: false
361   isReturnAddressTaken: false
362   hasStackMap:     false
363   hasPatchPoint:   false
364   stackSize:       0
365   offsetAdjustment: 0
366   maxAlignment:    0
367   adjustsStack:    false
368   hasCalls:        false
369   maxCallFrameSize: 0
370   hasOpaqueSPAdjustment: false
371   hasVAStart:      false
372   hasMustTailInVarArgFunc: false
373 body:             |
374   bb.0 (%ir-block.0):
375     liveins: $eax, $ebp, $ebx
377     ; CHECK-LABEL: name: test_leab_ebp_leais_32
378     ; CHECK: liveins: $eax, $ebp, $ebx
379     ; CHECK: $ebx = LEA32r $noreg, 2, $ebp, 0, $noreg
380     ; CHECK: RET64 $ebx
381     $ebx = LEA32r killed $ebp, 1, $ebp, 0, $noreg
382     RET64 $ebx
386 name:            test_leabi_ebp_leais_32
387 alignment:       16
388 exposesReturnsTwice: false
389 legalized:       false
390 regBankSelected: false
391 selected:        false
392 tracksRegLiveness: true
393 liveins:
394   - { reg: '$ebx' }
395   - { reg: '$ebp' }
396 frameInfo:
397   isFrameAddressTaken: false
398   isReturnAddressTaken: false
399   hasStackMap:     false
400   hasPatchPoint:   false
401   stackSize:       0
402   offsetAdjustment: 0
403   maxAlignment:    0
404   adjustsStack:    false
405   hasCalls:        false
406   maxCallFrameSize: 0
407   hasOpaqueSPAdjustment: false
408   hasVAStart:      false
409   hasMustTailInVarArgFunc: false
410 body:             |
411   bb.0 (%ir-block.0):
412     liveins: $eax, $ebp, $ebx
414     ; CHECK-LABEL: name: test_leabi_ebp_leais_32
415     ; CHECK: liveins: $eax, $ebp, $ebx
416     ; CHECK: $ebx = LEA32r $noreg, 2, $ebp, 5, $noreg
417     ; CHECK: RET64 $ebx
418     $ebx = LEA32r $ebp, 1, $ebp, 5, $noreg
419     RET64 $ebx
423 name:            testleaadd_ebp_index2_32
424 alignment:       16
425 exposesReturnsTwice: false
426 legalized:       false
427 regBankSelected: false
428 selected:        false
429 tracksRegLiveness: true
430 liveins:
431   - { reg: '$ebx' }
432   - { reg: '$ebp' }
433 frameInfo:
434   isFrameAddressTaken: false
435   isReturnAddressTaken: false
436   hasStackMap:     false
437   hasPatchPoint:   false
438   stackSize:       0
439   offsetAdjustment: 0
440   maxAlignment:    0
441   adjustsStack:    false
442   hasCalls:        false
443   maxCallFrameSize: 0
444   hasOpaqueSPAdjustment: false
445   hasVAStart:      false
446   hasMustTailInVarArgFunc: false
447 body:             |
448   bb.0 (%ir-block.0):
449     liveins: $eax, $ebp, $ebx
451     ; CHECK-LABEL: name: testleaadd_ebp_index2_32
452     ; CHECK: liveins: $eax, $ebp, $ebx
453     ; CHECK: $ebx = LEA32r $noreg, 4, $ebp, 5, $noreg
454     ; CHECK: $ebx = ADD32rr $ebx, $ebp, implicit-def $eflags
455     ; CHECK: RET64 $ebx
456     $ebx = LEA32r $ebp, 4, $ebp, 5, $noreg
457     RET64 $ebx
461 name:            test_skip_opt_32
462 alignment:       16
463 exposesReturnsTwice: false
464 legalized:       false
465 regBankSelected: false
466 selected:        false
467 tracksRegLiveness: true
468 liveins:
469   - { reg: '$ebx' }
470   - { reg: '$ebp' }
471 frameInfo:
472   isFrameAddressTaken: false
473   isReturnAddressTaken: false
474   hasStackMap:     false
475   hasPatchPoint:   false
476   stackSize:       0
477   offsetAdjustment: 0
478   maxAlignment:    0
479   adjustsStack:    false
480   hasCalls:        false
481   maxCallFrameSize: 0
482   hasOpaqueSPAdjustment: false
483   hasVAStart:      false
484   hasMustTailInVarArgFunc: false
485 body:             |
486   bb.0 (%ir-block.0):
487     liveins: $eax, $ebp, $ebx
489     ; CHECK-LABEL: name: test_skip_opt_32
490     ; CHECK: liveins: $eax, $ebp, $ebx
491     ; CHECK: $ebp = LEA32r killed $ebp, 4, killed $ebp, 0, $noreg
492     ; CHECK: RET64 $ebp
493     $ebp = LEA32r killed $ebp, 4, killed $ebp, 0, $noreg
494     RET64 $ebp
498 name:            test_skip_eflags_32
499 alignment:       16
500 exposesReturnsTwice: false
501 legalized:       false
502 regBankSelected: false
503 selected:        false
504 tracksRegLiveness: true
505 liveins:
506   - { reg: '$ebp' }
507   - { reg: '$eax' }
508 frameInfo:
509   isFrameAddressTaken: false
510   isReturnAddressTaken: false
511   hasStackMap:     false
512   hasPatchPoint:   false
513   stackSize:       0
514   offsetAdjustment: 0
515   maxAlignment:    0
516   adjustsStack:    false
517   hasCalls:        false
518   maxCallFrameSize: 0
519   hasOpaqueSPAdjustment: false
520   hasVAStart:      false
521   hasMustTailInVarArgFunc: false
522 body:             |
523   ; CHECK-LABEL: name: test_skip_eflags_32
524   ; CHECK: bb.0 (%ir-block.0):
525   ; CHECK:   successors: %bb.1(0x80000000)
526   ; CHECK:   liveins: $eax, $ebp, $ebx
527   ; CHECK:   CMP32rr $eax, killed $ebx, implicit-def $eflags
528   ; CHECK:   $ebx = LEA32r killed $eax, 4, killed $eax, 5, $noreg
529   ; CHECK:   JCC_1 %bb.1, 4, implicit $eflags
530   ; CHECK:   RET64 $ebx
531   ; CHECK: bb.1:
532   ; CHECK:   liveins: $eax, $ebp, $ebx
533   ; CHECK:   $ebp = LEA32r killed $ebx, 4, killed $ebx, 0, $noreg
534   ; CHECK:   $ebp = ADD32ri $ebp, 5, implicit-def $eflags
535   ; CHECK:   RET64 $ebp
536   bb.0 (%ir-block.0):
537     liveins: $eax, $ebp, $ebx
539     CMP32rr   $eax, killed $ebx, implicit-def $eflags
540     $ebx = LEA32r killed $eax, 4, killed $eax, 5, $noreg
541     JCC_1 %bb.1, 4, implicit $eflags
542     RET64 $ebx
543   bb.1:
544     liveins: $eax, $ebp, $ebx
545     $ebp = LEA32r killed $ebx, 4, killed $ebx, 5, $noreg
546     RET64 $ebp