[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / leaFixup32.mir
blob6d57cf2d97764c29201e190a4d823cfc9099c6cc
1 # RUN: llc -run-pass x86-fixup-LEAs -mtriple=i386 -verify-machineinstrs -mcpu=corei7-avx -o - %s | FileCheck %s
2 --- |
3   ; ModuleID = 'test/CodeGen/X86/fixup-lea.ll'
4   source_filename = "test/CodeGen/X86/fixup-lea.ll"
5   target datalayout = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"
6   target triple = "i386"
7   ;generated using: llc -stop-after x86-pad-short-functions fixup-lea.ll > leaFinxup32.mir
9   ;test2add_32: 3 operands LEA32r that can be replaced with 2 add instructions
10   ; where ADD32ri8 is chosen
11   define i32 @test2add_32() {
12     ret i32 0
13   }
15   ;test2add_ebp_32: 3 operands LEA32r that can be replaced with 2 add instructions
16   ; where the base is rbp/r13/ebp register
17   define i32 @test2add_ebp_32() {
18     ret i32 0
19   }
21   ;test1add_ebp_32: 2 operands LEA32r where base register is ebp and can be replaced
22   ; with an add instruction
23   define i32 @test1add_ebp_32() {
24     ret i32 0
25   }
27   ;testleaadd_32: 3 operands LEA32r that can be replaced with 1 lea 1 add instructions
28   define i32 @testleaadd_32() {
29     ret i32 0
30   }
32   ;testleaadd_ebp_32: 3 operands LEA32r that can be replaced with 1 lea 1 add instructions
33   ; where the base is ebp register
34   define i32 @testleaadd_ebp_32() {
35     ret i32 0
36   }
38   ;test1lea_ebp_32: 2 operands LEA32r wher base register is rbp/r13/ebp and can be replaced
39   ; with a lea instruction
40   define i32 @test1lea_ebp_32() {
41     ret i32 0
42   }
44   ;test2addi32_32: 3 operands LEA32r that can be replaced with 2 add instructions where ADD32ri32
45   ; is chosen
46   define i32 @test2addi32_32() {
47     ret i32 0
48   }
50   ;test1mov1add_ebp_32: 2 operands LEA32r that can be replaced with 1 add 1 mov instructions
51   ; where the base is rbp/r13/ebp register
52   define i32 @test1mov1add_ebp_32() {
53     ret i32 0
54   }
56   ;testleaadd_ebp_index_32: 3 operands LEA32r that can be replaced with 1 lea 1 add instructions
57   ; where the base and the index are ebp register and there is offset
58   define i32 @testleaadd_ebp_index_32() {
59     ret i32 0
60   }
62   ;testleaadd_ebp_index2_32: 3 operands LEA32r that can be replaced with 1 lea 1 add instructions
63   ; where the base and the index are ebp register and there is scale
64   define i32 @testleaadd_ebp_index2_32() {
65     ret i32 0
66   }
67   
68   ;test_skip_opt_32: 3 operands LEA32r that can not be replaced with 2 instructions
69   define i32 @test_skip_opt_32() {
70     ret i32 0
71   }
73   ;test_skip_eflags_32: LEA32r that cannot be replaced since its not safe to clobber eflags
74   define i32 @test_skip_eflags_32() {
75     ret i32 0
76   }
78 ...
79 ---
80 name:            test2add_32
81 alignment:       4
82 exposesReturnsTwice: false
83 legalized:       false
84 regBankSelected: false
85 selected:        false
86 tracksRegLiveness: true
87 liveins:         
88   - { reg: '$eax' }
89   - { reg: '$ebp' }
90 frameInfo:       
91   isFrameAddressTaken: false
92   isReturnAddressTaken: false
93   hasStackMap:     false
94   hasPatchPoint:   false
95   stackSize:       0
96   offsetAdjustment: 0
97   maxAlignment:    0
98   adjustsStack:    false
99   hasCalls:        false
100   maxCallFrameSize: 0
101   hasOpaqueSPAdjustment: false
102   hasVAStart:      false
103   hasMustTailInVarArgFunc: false
104 body:             |
105   bb.0 (%ir-block.0):
106     liveins: $eax, $ebp
107     ; CHECK: $eax = ADD32rr $eax, killed $ebp
108     ; CHECK: $eax = ADD32ri8 $eax, -5
110     $eax = LEA32r killed $eax, 1, killed $ebp, -5, $noreg
111     RETQ $eax
115 name:            test2add_ebp_32
116 alignment:       4
117 exposesReturnsTwice: false
118 legalized:       false
119 regBankSelected: false
120 selected:        false
121 tracksRegLiveness: true
122 liveins:         
123   - { reg: '$eax' }
124   - { reg: '$ebp' }
125 frameInfo:       
126   isFrameAddressTaken: false
127   isReturnAddressTaken: false
128   hasStackMap:     false
129   hasPatchPoint:   false
130   stackSize:       0
131   offsetAdjustment: 0
132   maxAlignment:    0
133   adjustsStack:    false
134   hasCalls:        false
135   maxCallFrameSize: 0
136   hasOpaqueSPAdjustment: false
137   hasVAStart:      false
138   hasMustTailInVarArgFunc: false
139 body:             |
140   bb.0 (%ir-block.0):
141     liveins: $eax, $ebp
142     ; CHECK: $ebp = ADD32rr $ebp, killed $eax
143     ; CHECK: $ebp = ADD32ri8 $ebp, -5
145     $ebp = LEA32r killed $ebp, 1, killed $eax, -5, $noreg
146     RETQ $ebp
150 name:            test1add_ebp_32
151 alignment:       4
152 exposesReturnsTwice: false
153 legalized:       false
154 regBankSelected: false
155 selected:        false
156 tracksRegLiveness: true
157 liveins:         
158   - { reg: '$eax' }
159   - { reg: '$ebp' }
160 frameInfo:       
161   isFrameAddressTaken: false
162   isReturnAddressTaken: false
163   hasStackMap:     false
164   hasPatchPoint:   false
165   stackSize:       0
166   offsetAdjustment: 0
167   maxAlignment:    0
168   adjustsStack:    false
169   hasCalls:        false
170   maxCallFrameSize: 0
171   hasOpaqueSPAdjustment: false
172   hasVAStart:      false
173   hasMustTailInVarArgFunc: false
174 body:             |
175   bb.0 (%ir-block.0):
176     liveins: $eax, $ebp
177     ; CHECK: $ebp = ADD32rr $ebp, $eax
179     $ebp = LEA32r killed $ebp, 1, killed $eax, 0, $noreg
180     RETQ $ebp
184 name:            testleaadd_32
185 alignment:       4
186 exposesReturnsTwice: false
187 legalized:       false
188 regBankSelected: false
189 selected:        false
190 tracksRegLiveness: true
191 liveins:         
192   - { reg: '$eax' }
193   - { reg: '$ebp' }
194   - { reg: '$ebx' }
195 frameInfo:       
196   isFrameAddressTaken: false
197   isReturnAddressTaken: false
198   hasStackMap:     false
199   hasPatchPoint:   false
200   stackSize:       0
201   offsetAdjustment: 0
202   maxAlignment:    0
203   adjustsStack:    false
204   hasCalls:        false
205   maxCallFrameSize: 0
206   hasOpaqueSPAdjustment: false
207   hasVAStart:      false
208   hasMustTailInVarArgFunc: false
209 body:             |
210   bb.0 (%ir-block.0):
211     liveins: $eax, $ebp, $esi
212     ; CHECK: $ebx = LEA32r killed $eax, 1, killed $ebp, 0
213     ; CHECK: $ebx = ADD32ri8 $ebx, -5
215     $ebx = LEA32r killed $eax, 1, killed $ebp, -5, $noreg
216     RETQ $ebx
220 name:            testleaadd_ebp_32
221 alignment:       4
222 exposesReturnsTwice: false
223 legalized:       false
224 regBankSelected: false
225 selected:        false
226 tracksRegLiveness: true
227 liveins:         
228   - { reg: '$eax' }
229   - { reg: '$ebp' }
230   - { reg: '$ebx' }
231 frameInfo:       
232   isFrameAddressTaken: false
233   isReturnAddressTaken: false
234   hasStackMap:     false
235   hasPatchPoint:   false
236   stackSize:       0
237   offsetAdjustment: 0
238   maxAlignment:    0
239   adjustsStack:    false
240   hasCalls:        false
241   maxCallFrameSize: 0
242   hasOpaqueSPAdjustment: false
243   hasVAStart:      false
244   hasMustTailInVarArgFunc: false
245 body:             |
246   bb.0 (%ir-block.0):
247     liveins: $eax, $ebp
248     ; CHECK: $ebx = LEA32r killed $eax, 1, killed $ebp, 0, $noreg
249     ; CHECK: $ebx = ADD32ri8  $ebx, -5
251     $ebx = LEA32r killed $ebp, 1, killed $eax, -5, $noreg
252     RETQ $ebx
256 name:            test1lea_ebp_32
257 alignment:       4
258 exposesReturnsTwice: false
259 legalized:       false
260 regBankSelected: false
261 selected:        false
262 tracksRegLiveness: true
263 liveins:         
264   - { reg: '$eax' }
265   - { reg: '$ebp' }
266   - { reg: '$ebx' }
267 frameInfo:       
268   isFrameAddressTaken: false
269   isReturnAddressTaken: false
270   hasStackMap:     false
271   hasPatchPoint:   false
272   stackSize:       0
273   offsetAdjustment: 0
274   maxAlignment:    0
275   adjustsStack:    false
276   hasCalls:        false
277   maxCallFrameSize: 0
278   hasOpaqueSPAdjustment: false
279   hasVAStart:      false
280   hasMustTailInVarArgFunc: false
281 body:             |
282   bb.0 (%ir-block.0):
283     liveins: $eax, $ebp
284     ; CHECK: $ebx = LEA32r killed $eax, 1, killed $ebp, 0, $noreg
286     $ebx = LEA32r killed $ebp, 1, killed $eax, 0, $noreg
287     RETQ $ebx
291 name:            test2addi32_32
292 alignment:       4
293 exposesReturnsTwice: false
294 legalized:       false
295 regBankSelected: false
296 selected:        false
297 tracksRegLiveness: true
298 liveins:         
299   - { reg: '$eax' }
300   - { reg: '$ebp' }
301 frameInfo:       
302   isFrameAddressTaken: false
303   isReturnAddressTaken: false
304   hasStackMap:     false
305   hasPatchPoint:   false
306   stackSize:       0
307   offsetAdjustment: 0
308   maxAlignment:    0
309   adjustsStack:    false
310   hasCalls:        false
311   maxCallFrameSize: 0
312   hasOpaqueSPAdjustment: false
313   hasVAStart:      false
314   hasMustTailInVarArgFunc: false
315 body:             |
316   bb.0 (%ir-block.0):
317     liveins: $eax, $ebp
318     ; CHECK: $eax = ADD32rr $eax, killed $ebp
319     ; CHECK: $eax = ADD32ri $eax, 129
321     $eax = LEA32r killed $eax, 1, killed $ebp, 129, $noreg
322     RETQ $eax
326 name:            test1mov1add_ebp_32
327 alignment:       4
328 exposesReturnsTwice: false
329 legalized:       false
330 regBankSelected: false
331 selected:        false
332 tracksRegLiveness: true
333 liveins:         
334   - { reg: '$eax' }
335   - { reg: '$ebx' }
336   - { reg: '$ebp' }
337 frameInfo:       
338   isFrameAddressTaken: false
339   isReturnAddressTaken: false
340   hasStackMap:     false
341   hasPatchPoint:   false
342   stackSize:       0
343   offsetAdjustment: 0
344   maxAlignment:    0
345   adjustsStack:    false
346   hasCalls:        false
347   maxCallFrameSize: 0
348   hasOpaqueSPAdjustment: false
349   hasVAStart:      false
350   hasMustTailInVarArgFunc: false
351 body:             |
352   bb.0 (%ir-block.0):
353     liveins: $eax, $ebp, $ebx
354     ; CHECK: $ebx = MOV32rr  $ebp
355     ; CHECK: $ebx = ADD32rr $ebx, $ebp
357     $ebx = LEA32r killed $ebp, 1, $ebp, 0, $noreg
358     RETQ $ebx
362 name:            testleaadd_ebp_index_32
363 alignment:       4
364 exposesReturnsTwice: false
365 legalized:       false
366 regBankSelected: false
367 selected:        false
368 tracksRegLiveness: true
369 liveins:         
370   - { reg: '$ebx' }
371   - { reg: '$ebp' }
372 frameInfo:       
373   isFrameAddressTaken: false
374   isReturnAddressTaken: false
375   hasStackMap:     false
376   hasPatchPoint:   false
377   stackSize:       0
378   offsetAdjustment: 0
379   maxAlignment:    0
380   adjustsStack:    false
381   hasCalls:        false
382   maxCallFrameSize: 0
383   hasOpaqueSPAdjustment: false
384   hasVAStart:      false
385   hasMustTailInVarArgFunc: false
386 body:             |
387   bb.0 (%ir-block.0):
388     liveins: $eax, $ebp, $ebx
389     ; CHECK: $ebx = LEA32r $noreg, 1, $ebp, 5, $noreg
390     ; CHECK: $ebx = ADD32rr $ebx, $ebp
392     $ebx = LEA32r $ebp, 1, $ebp, 5, $noreg
393     RETQ $ebx
397 name:            testleaadd_ebp_index2_32
398 alignment:       4
399 exposesReturnsTwice: false
400 legalized:       false
401 regBankSelected: false
402 selected:        false
403 tracksRegLiveness: true
404 liveins:         
405   - { reg: '$ebx' }
406   - { reg: '$ebp' }
407 frameInfo:       
408   isFrameAddressTaken: false
409   isReturnAddressTaken: false
410   hasStackMap:     false
411   hasPatchPoint:   false
412   stackSize:       0
413   offsetAdjustment: 0
414   maxAlignment:    0
415   adjustsStack:    false
416   hasCalls:        false
417   maxCallFrameSize: 0
418   hasOpaqueSPAdjustment: false
419   hasVAStart:      false
420   hasMustTailInVarArgFunc: false
421 body:             |
422   bb.0 (%ir-block.0):
423     liveins: $eax, $ebp, $ebx
424     ; CHECK: $ebx = LEA32r $noreg, 4, $ebp, 5, $noreg
425     ; CHECK: $ebx = ADD32rr $ebx, $ebp
427     $ebx = LEA32r $ebp, 4, $ebp, 5, $noreg
428     RETQ $ebx
432 name:            test_skip_opt_32
433 alignment:       4
434 exposesReturnsTwice: false
435 legalized:       false
436 regBankSelected: false
437 selected:        false
438 tracksRegLiveness: true
439 liveins:         
440   - { reg: '$ebx' }
441   - { reg: '$ebp' }
442 frameInfo:       
443   isFrameAddressTaken: false
444   isReturnAddressTaken: false
445   hasStackMap:     false
446   hasPatchPoint:   false
447   stackSize:       0
448   offsetAdjustment: 0
449   maxAlignment:    0
450   adjustsStack:    false
451   hasCalls:        false
452   maxCallFrameSize: 0
453   hasOpaqueSPAdjustment: false
454   hasVAStart:      false
455   hasMustTailInVarArgFunc: false
456 body:             |
457   bb.0 (%ir-block.0):
458     liveins: $eax, $ebp, $ebx
459     ; CHECK: $ebp = LEA32r killed $ebp, 4, killed $ebp, 0, $noreg
461     $ebp = LEA32r killed $ebp, 4, killed $ebp, 0, $noreg
462     RETQ $ebp
466 name:            test_skip_eflags_32
467 alignment:       4
468 exposesReturnsTwice: false
469 legalized:       false
470 regBankSelected: false
471 selected:        false
472 tracksRegLiveness: true
473 liveins:         
474   - { reg: '$ebp' }
475   - { reg: '$eax' }
476 frameInfo:       
477   isFrameAddressTaken: false
478   isReturnAddressTaken: false
479   hasStackMap:     false
480   hasPatchPoint:   false
481   stackSize:       0
482   offsetAdjustment: 0
483   maxAlignment:    0
484   adjustsStack:    false
485   hasCalls:        false
486   maxCallFrameSize: 0
487   hasOpaqueSPAdjustment: false
488   hasVAStart:      false
489   hasMustTailInVarArgFunc: false
490 body:             |
491   bb.0 (%ir-block.0):
492     liveins: $eax, $ebp, $ebx
493     ; CHECK: $ebx = LEA32r killed $eax, 4, killed $eax, 5, $noreg
494     ; CHECK: $ebp = LEA32r killed $ebx, 4, killed $ebx, 0, $noreg
495     ; CHECK: $ebp = ADD32ri8 $ebp, 5
496    
497     CMP32rr   $eax, killed $ebx, implicit-def $eflags
498     $ebx = LEA32r killed $eax, 4, killed $eax, 5, $noreg
499     JCC_1 %bb.1, 4, implicit $eflags
500     RETQ $ebx
501   bb.1:
502     liveins: $eax, $ebp, $ebx
503     $ebp = LEA32r killed $ebx, 4, killed $ebx, 5, $noreg
504     RETQ $ebp