[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / leaFixup32.mir
blob23f3d7616966877a188c3c8a6587b9c12dec6694
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 ADD32ri8 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   ;test1mov1add_ebp_32: 2 operands LEA32r that can be replaced with 1 add 1 mov instructions
52   ; where the base is rbp/r13/ebp register
53   define i32 @test1mov1add_ebp_32() {
54     ret i32 0
55   }
57   ;testleaadd_ebp_index_32: 3 operands LEA32r that can be replaced with 1 lea 1 add instructions
58   ; where the base and the index are ebp register and there is offset
59   define i32 @testleaadd_ebp_index_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 = ADD32ri8 $eax, -5, implicit-def $eflags
113     ; CHECK: RETQ $eax
114     $eax = LEA32r killed $eax, 1, killed $ebp, -5, $noreg
115     RETQ $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 = ADD32ri8 $ebp, -5, implicit-def $eflags
151     ; CHECK: RETQ $ebp
152     $ebp = LEA32r killed $ebp, 1, killed $eax, -5, $noreg
153     RETQ $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: RETQ $ebp
189     $ebp = LEA32r killed $ebp, 1, killed $eax, 0, $noreg
190     RETQ $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 = ADD32ri8 $ebx, -5, implicit-def $eflags
227     ; CHECK: RETQ $ebx
228     $ebx = LEA32r killed $eax, 1, killed $ebp, -5, $noreg
229     RETQ $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 = ADD32ri8 $ebx, -5, implicit-def $eflags
266     ; CHECK: RETQ $ebx
267     $ebx = LEA32r killed $ebp, 1, killed $eax, -5, $noreg
268     RETQ $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: RETQ $ebx
305     $ebx = LEA32r killed $ebp, 1, killed $eax, 0, $noreg
306     RETQ $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: RETQ $eax
343     $eax = LEA32r killed $eax, 1, killed $ebp, 129, $noreg
344     RETQ $eax
348 name:            test1mov1add_ebp_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: test1mov1add_ebp_32
378     ; CHECK: liveins: $eax, $ebp, $ebx
379     ; CHECK: $ebx = MOV32rr $ebp
380     ; CHECK: $ebx = ADD32rr $ebx, $ebp, implicit-def $eflags
381     ; CHECK: $ebx = LEA32r killed $ebp, 1, $ebp, 0, $noreg
382     ; CHECK: RETQ $ebx
383     $ebx = LEA32r killed $ebp, 1, $ebp, 0, $noreg
384     RETQ $ebx
388 name:            testleaadd_ebp_index_32
389 alignment:       16
390 exposesReturnsTwice: false
391 legalized:       false
392 regBankSelected: false
393 selected:        false
394 tracksRegLiveness: true
395 liveins:
396   - { reg: '$ebx' }
397   - { reg: '$ebp' }
398 frameInfo:
399   isFrameAddressTaken: false
400   isReturnAddressTaken: false
401   hasStackMap:     false
402   hasPatchPoint:   false
403   stackSize:       0
404   offsetAdjustment: 0
405   maxAlignment:    0
406   adjustsStack:    false
407   hasCalls:        false
408   maxCallFrameSize: 0
409   hasOpaqueSPAdjustment: false
410   hasVAStart:      false
411   hasMustTailInVarArgFunc: false
412 body:             |
413   bb.0 (%ir-block.0):
414     liveins: $eax, $ebp, $ebx
416     ; CHECK-LABEL: name: testleaadd_ebp_index_32
417     ; CHECK: liveins: $eax, $ebp, $ebx
418     ; CHECK: $ebx = LEA32r $noreg, 1, $ebp, 5, $noreg
419     ; CHECK: $ebx = ADD32rr $ebx, $ebp, implicit-def $eflags
420     ; CHECK: RETQ $ebx
421     $ebx = LEA32r $ebp, 1, $ebp, 5, $noreg
422     RETQ $ebx
426 name:            testleaadd_ebp_index2_32
427 alignment:       16
428 exposesReturnsTwice: false
429 legalized:       false
430 regBankSelected: false
431 selected:        false
432 tracksRegLiveness: true
433 liveins:
434   - { reg: '$ebx' }
435   - { reg: '$ebp' }
436 frameInfo:
437   isFrameAddressTaken: false
438   isReturnAddressTaken: false
439   hasStackMap:     false
440   hasPatchPoint:   false
441   stackSize:       0
442   offsetAdjustment: 0
443   maxAlignment:    0
444   adjustsStack:    false
445   hasCalls:        false
446   maxCallFrameSize: 0
447   hasOpaqueSPAdjustment: false
448   hasVAStart:      false
449   hasMustTailInVarArgFunc: false
450 body:             |
451   bb.0 (%ir-block.0):
452     liveins: $eax, $ebp, $ebx
454     ; CHECK-LABEL: name: testleaadd_ebp_index2_32
455     ; CHECK: liveins: $eax, $ebp, $ebx
456     ; CHECK: $ebx = LEA32r $noreg, 4, $ebp, 5, $noreg
457     ; CHECK: $ebx = ADD32rr $ebx, $ebp, implicit-def $eflags
458     ; CHECK: RETQ $ebx
459     $ebx = LEA32r $ebp, 4, $ebp, 5, $noreg
460     RETQ $ebx
464 name:            test_skip_opt_32
465 alignment:       16
466 exposesReturnsTwice: false
467 legalized:       false
468 regBankSelected: false
469 selected:        false
470 tracksRegLiveness: true
471 liveins:
472   - { reg: '$ebx' }
473   - { reg: '$ebp' }
474 frameInfo:
475   isFrameAddressTaken: false
476   isReturnAddressTaken: false
477   hasStackMap:     false
478   hasPatchPoint:   false
479   stackSize:       0
480   offsetAdjustment: 0
481   maxAlignment:    0
482   adjustsStack:    false
483   hasCalls:        false
484   maxCallFrameSize: 0
485   hasOpaqueSPAdjustment: false
486   hasVAStart:      false
487   hasMustTailInVarArgFunc: false
488 body:             |
489   bb.0 (%ir-block.0):
490     liveins: $eax, $ebp, $ebx
492     ; CHECK-LABEL: name: test_skip_opt_32
493     ; CHECK: liveins: $eax, $ebp, $ebx
494     ; CHECK: $ebp = LEA32r killed $ebp, 4, killed $ebp, 0, $noreg
495     ; CHECK: RETQ $ebp
496     $ebp = LEA32r killed $ebp, 4, killed $ebp, 0, $noreg
497     RETQ $ebp
501 name:            test_skip_eflags_32
502 alignment:       16
503 exposesReturnsTwice: false
504 legalized:       false
505 regBankSelected: false
506 selected:        false
507 tracksRegLiveness: true
508 liveins:
509   - { reg: '$ebp' }
510   - { reg: '$eax' }
511 frameInfo:
512   isFrameAddressTaken: false
513   isReturnAddressTaken: false
514   hasStackMap:     false
515   hasPatchPoint:   false
516   stackSize:       0
517   offsetAdjustment: 0
518   maxAlignment:    0
519   adjustsStack:    false
520   hasCalls:        false
521   maxCallFrameSize: 0
522   hasOpaqueSPAdjustment: false
523   hasVAStart:      false
524   hasMustTailInVarArgFunc: false
525 body:             |
526   ; CHECK-LABEL: name: test_skip_eflags_32
527   ; CHECK: bb.0 (%ir-block.0):
528   ; CHECK:   successors: %bb.1(0x80000000)
529   ; CHECK:   liveins: $eax, $ebp, $ebx
530   ; CHECK:   CMP32rr $eax, killed $ebx, implicit-def $eflags
531   ; CHECK:   $ebx = LEA32r killed $eax, 4, killed $eax, 5, $noreg
532   ; CHECK:   JCC_1 %bb.1, 4, implicit $eflags
533   ; CHECK:   RETQ $ebx
534   ; CHECK: bb.1:
535   ; CHECK:   liveins: $eax, $ebp, $ebx
536   ; CHECK:   $ebp = LEA32r killed $ebx, 4, killed $ebx, 0, $noreg
537   ; CHECK:   $ebp = ADD32ri8 $ebp, 5, implicit-def $eflags
538   ; CHECK:   RETQ $ebp
539   bb.0 (%ir-block.0):
540     liveins: $eax, $ebp, $ebx
542     CMP32rr   $eax, killed $ebx, implicit-def $eflags
543     $ebx = LEA32r killed $eax, 4, killed $eax, 5, $noreg
544     JCC_1 %bb.1, 4, implicit $eflags
545     RETQ $ebx
546   bb.1:
547     liveins: $eax, $ebp, $ebx
548     $ebp = LEA32r killed $ebx, 4, killed $ebx, 5, $noreg
549     RETQ $ebp