1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -run-pass x86-fixup-LEAs -mtriple=x86_64-gnu-unknown -verify-machineinstrs -mcpu=corei7-avx -o - %s | FileCheck %s
3--- |
4  ; ModuleID = 'lea-2.ll'
5  source_filename = "lea-2.ll"
6  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
7  ;generated using: llc -stop-after x86-pad-short-functions lea-2.ll > leaFinxup64.mir
8
9  ;testleaadd_64_32_1: 3 operands LEA64_32r cannot be replaced with 2 add instructions
10  ; but can be replaced with 1 lea + 1 add
11  define i32 @testleaadd_64_32_1() {
12    ret i32 0
13  }
14
15  ;testleaadd_rbp_64_32_1: 3 operands LEA64_32r cannot be replaced with 2 add instructions
16  ; where the base is rbp/r13/ebp register but it can be replaced with 1 lea + 1 add
17  define i32 @testleaadd_rbp_64_32_1() {
18    ret i32 0
19  }
20
21  ;test1lea_rbp_64_32_1: 2 operands LEA64_32r where base register is rbp/r13/ebp and can not
22  ; be replaced with an add instruction but can be replaced with 1 lea instruction
23  define i32 @test1lea_rbp_64_32_1() {
24    ret i32 0
25  }
26
27  ;test2add_64: 3 operands LEA64r that can be replaced with 2 add instructions
28  define i32 @test2add_64() {
29    ret i32 0
30  }
31
32  ;test2add_rbp_64: 3 operands LEA64r that can be replaced with 2 add instructions
33  ; where the base is rbp/r13/ebp register
34  define i32 @test2add_rbp_64() {
35    ret i32 0
36  }
37
38  ;test1add_rbp_64: 2 operands LEA64r where base register is rbp/r13/ebp and can be replaced
39  ; with an add instruction
40  define i32 @test1add_rbp_64() {
41    ret i32 0
42  }
43
44  ;testleaadd_64_32: 3 operands LEA64_32r that can be replaced with 1 lea 1 add instructions
45  define i32 @testleaadd_64_32() {
46    ret i32 0
47  }
48
49  ;testleaadd_rbp_64_32: 3 operands LEA64_32r that can be replaced with 1 lea 1 add instructions
50  ; where the base is rbp/r13/ebp register
51  define i32 @testleaadd_rbp_64_32() {
52    ret i32 0
53  }
54
55  ;test1lea_rbp_64_32: 2 operands LEA64_32r where base register is rbp/r13/ebp and can be replaced
56  ; with a lea instruction
57  define i32 @test1lea_rbp_64_32() {
58    ret i32 0
59  }
60
61  ;testleaadd_64: 3 operands LEA64r that can be replaced with 1 lea 1 add instructions
62  define i32 @testleaadd_64() {
63    ret i32 0
64  }
65
66  ;testleaadd_rbp_64: 3 operands LEA64r that can be replaced with 1 lea 1 add instructions
67  ; where the base is rbp/r13/ebp register
68  define i32 @testleaadd_rbp_64() {
69    ret i32 0
70  }
71
72  ;test1lea_rbp_64: 2 operands LEA64r wher base register is rbp/r13/ebp and can be replaced
73  ; with a lea instruction
74  define i32 @test1lea_rbp_64() {
75    ret i32 0
76  }
77
78  ;test8: dst = base & scale!=1, can't optimize
79  define i32 @test8() {
80      ret i32 0
81  }
82
83  ;testleaaddi32_64_32: 3 operands LEA64_32r that can be replaced with 1 lea + 1 add instructions where
84  ; ADD64ri32 is chosen
85  define i32 @testleaaddi32_64_32() {
86    ret i32 0
87  }
88
89  ;test1mov1add_rbp_64_32: 2 operands LEA64_32r cannot be replaced with 1 add 1 mov instructions
90  ; where the base is rbp/r13/ebp register
91  define i32 @test1mov1add_rbp_64_32() {
92    ret i32 0
93  }
94
95  ;testleaadd_rbp_index_64_32: 3 operands LEA64_32r that cannot replaced with 1 lea 1 add instructions
96  ; where the base and the index are ebp register and there is offset
97  define i32 @testleaadd_rbp_index_64_32() {
98    ret i32 0
99  }
100
101  ;testleaadd_rbp_index2_64_32: 3 operands LEA64_32r that cannot replaced with 1 lea 1 add instructions
102  ; where the base and the index are ebp register and there is scale
103  define i32 @testleaadd_rbp_index2_64_32() {
104    ret i32 0
105  }
106
107  ;test2addi32_64: 3 operands LEA64r that can be replaced with 2 add instructions where ADD64ri32
108  ; is chosen
109  define i32 @test2addi32_64() {
110    ret i32 0
111  }
112
113  ;test1mov1add_rbp_64: 2 operands LEA64r that can be replaced with 1 add 1 mov instructions
114  ; where the base is rbp/r13/ebp register
115  define i32 @test1mov1add_rbp_64() {
116    ret i32 0
117  }
118
119  ;testleaadd_rbp_index_64: 3 operands LEA64r that can be replaced with 1 lea 1 add instructions
120  ; where the base and the index are ebp register and there is offset
121  define i32 @testleaadd_rbp_index_64() {
122    ret i32 0
123  }
124
125  ;testleaadd_rbp_index2_64: 3 operands LEA64r that can be replaced with 1 lea 1 add instructions
126  ; where the base and the index are ebp register and there is scale
127  define i32 @testleaadd_rbp_index2_64() {
128    ret i32 0
129  }
130
131  ;test_skip_opt_64: 3 operands LEA64r that can not be replaced with 2 instructions
132  define i32 @test_skip_opt_64() {
133    ret i32 0
134  }
135
136  ;test_skip_eflags_64: LEA64r that cannot be replaced since its not safe to clobber eflags
137  define i32 @test_skip_eflags_64() {
138    ret i32 0
139  }
140
141  ;test_skip_opt_64_32: 3 operands LEA64_32r that can not be replaced with 2 instructions
142  define i32 @test_skip_opt_64_32() {
143    ret i32 0
144  }
145
146  ;test_skip_eflags_64_32: LEA64_32r that cannot be replaced since its not safe to clobber eflags
147  define i32 @test_skip_eflags_64_32() {
148    ret i32 0
149  }
150
151  define i32 @pr43758() {
152    ret i32 0
153  }
154
155
156...
157---
158name:            testleaadd_64_32_1
159alignment:       16
160exposesReturnsTwice: false
161legalized:       false
162regBankSelected: false
163selected:        false
164tracksRegLiveness: true
165liveins:
166  - { reg: '$rax' }
167  - { reg: '$rbp' }
168frameInfo:
169  isFrameAddressTaken: false
170  isReturnAddressTaken: false
171  hasStackMap:     false
172  hasPatchPoint:   false
173  stackSize:       0
174  offsetAdjustment: 0
175  maxAlignment:    0
176  adjustsStack:    false
177  hasCalls:        false
178  maxCallFrameSize: 0
179  hasOpaqueSPAdjustment: false
180  hasVAStart:      false
181  hasMustTailInVarArgFunc: false
182body:             |
183  bb.0 (%ir-block.0):
184    liveins: $rax, $rbp
185
186    ; CHECK-LABEL: name: testleaadd_64_32_1
187    ; CHECK: liveins: $rax, $rbp
188    ; CHECK: $eax = ADD32rr $eax, $ebp, implicit-def $eflags, implicit $rax, implicit $rbp
189    ; CHECK: $eax = ADD32ri8 $eax, -5, implicit-def $eflags
190    ; CHECK: RETQ $eax
191    $eax = LEA64_32r killed $rax, 1, killed $rbp, -5, $noreg
192    RETQ $eax
193
194...
195---
196name:            testleaadd_rbp_64_32_1
197alignment:       16
198exposesReturnsTwice: false
199legalized:       false
200regBankSelected: false
201selected:        false
202tracksRegLiveness: true
203liveins:
204  - { reg: '$rax' }
205  - { reg: '$rbp' }
206frameInfo:
207  isFrameAddressTaken: false
208  isReturnAddressTaken: false
209  hasStackMap:     false
210  hasPatchPoint:   false
211  stackSize:       0
212  offsetAdjustment: 0
213  maxAlignment:    0
214  adjustsStack:    false
215  hasCalls:        false
216  maxCallFrameSize: 0
217  hasOpaqueSPAdjustment: false
218  hasVAStart:      false
219  hasMustTailInVarArgFunc: false
220body:             |
221  bb.0 (%ir-block.0):
222    liveins: $rax, $rbp
223
224    ; CHECK-LABEL: name: testleaadd_rbp_64_32_1
225    ; CHECK: liveins: $rax, $rbp
226    ; CHECK: $ebp = ADD32rr $ebp, $eax, implicit-def $eflags, implicit $rbp, implicit $rax
227    ; CHECK: $ebp = ADD32ri8 $ebp, -5, implicit-def $eflags
228    ; CHECK: RETQ $ebp
229    $ebp = LEA64_32r killed $rbp, 1, killed $rax, -5, $noreg
230    RETQ $ebp
231
232...
233---
234name:            test1lea_rbp_64_32_1
235alignment:       16
236exposesReturnsTwice: false
237legalized:       false
238regBankSelected: false
239selected:        false
240tracksRegLiveness: true
241liveins:
242  - { reg: '$rax' }
243  - { reg: '$rbp' }
244frameInfo:
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
258body:             |
259  bb.0 (%ir-block.0):
260    liveins: $rax, $rbp
261
262    ; CHECK-LABEL: name: test1lea_rbp_64_32_1
263    ; CHECK: liveins: $rax, $rbp
264    ; CHECK: $ebp = ADD32rr $ebp, $eax, implicit-def $eflags, implicit $rbp, implicit $rax
265    ; CHECK: RETQ $ebp
266    $ebp = LEA64_32r killed $rbp, 1, killed $rax, 0, $noreg
267    RETQ $ebp
268
269...
270---
271name:            test2add_64
272alignment:       16
273exposesReturnsTwice: false
274legalized:       false
275regBankSelected: false
276selected:        false
277tracksRegLiveness: true
278liveins:
279  - { reg: '$rax' }
280  - { reg: '$rbp' }
281frameInfo:
282  isFrameAddressTaken: false
283  isReturnAddressTaken: false
284  hasStackMap:     false
285  hasPatchPoint:   false
286  stackSize:       0
287  offsetAdjustment: 0
288  maxAlignment:    0
289  adjustsStack:    false
290  hasCalls:        false
291  maxCallFrameSize: 0
292  hasOpaqueSPAdjustment: false
293  hasVAStart:      false
294  hasMustTailInVarArgFunc: false
295body:             |
296  bb.0 (%ir-block.0):
297    liveins: $rax, $rbp
298
299    ; CHECK-LABEL: name: test2add_64
300    ; CHECK: liveins: $rax, $rbp
301    ; CHECK: $rax = ADD64rr $rax, $rbp, implicit-def $eflags
302    ; CHECK: $rax = ADD64ri8 $rax, -5, implicit-def $eflags
303    ; CHECK: RETQ $eax
304    $rax = LEA64r killed $rax, 1, killed $rbp, -5, $noreg
305    RETQ $eax
306
307...
308---
309name:            test2add_rbp_64
310alignment:       16
311exposesReturnsTwice: false
312legalized:       false
313regBankSelected: false
314selected:        false
315tracksRegLiveness: true
316liveins:
317  - { reg: '$rax' }
318  - { reg: '$rbp' }
319frameInfo:
320  isFrameAddressTaken: false
321  isReturnAddressTaken: false
322  hasStackMap:     false
323  hasPatchPoint:   false
324  stackSize:       0
325  offsetAdjustment: 0
326  maxAlignment:    0
327  adjustsStack:    false
328  hasCalls:        false
329  maxCallFrameSize: 0
330  hasOpaqueSPAdjustment: false
331  hasVAStart:      false
332  hasMustTailInVarArgFunc: false
333body:             |
334  bb.0 (%ir-block.0):
335    liveins: $rax, $rbp
336
337    ; CHECK-LABEL: name: test2add_rbp_64
338    ; CHECK: liveins: $rax, $rbp
339    ; CHECK: $rbp = ADD64rr $rbp, $rax, implicit-def $eflags
340    ; CHECK: $rbp = ADD64ri8 $rbp, -5, implicit-def $eflags
341    ; CHECK: RETQ $ebp
342    $rbp = LEA64r killed $rbp, 1, killed $rax, -5, $noreg
343    RETQ $ebp
344
345...
346---
347name:            test1add_rbp_64
348alignment:       16
349exposesReturnsTwice: false
350legalized:       false
351regBankSelected: false
352selected:        false
353tracksRegLiveness: true
354liveins:
355  - { reg: '$rax' }
356  - { reg: '$rbp' }
357frameInfo:
358  isFrameAddressTaken: false
359  isReturnAddressTaken: false
360  hasStackMap:     false
361  hasPatchPoint:   false
362  stackSize:       0
363  offsetAdjustment: 0
364  maxAlignment:    0
365  adjustsStack:    false
366  hasCalls:        false
367  maxCallFrameSize: 0
368  hasOpaqueSPAdjustment: false
369  hasVAStart:      false
370  hasMustTailInVarArgFunc: false
371body:             |
372  bb.0 (%ir-block.0):
373    liveins: $rax, $rbp
374
375    ; CHECK-LABEL: name: test1add_rbp_64
376    ; CHECK: liveins: $rax, $rbp
377    ; CHECK: $rbp = ADD64rr $rbp, $rax, implicit-def $eflags
378    ; CHECK: RETQ $ebp
379    $rbp = LEA64r killed $rbp, 1, killed $rax, 0, $noreg
380    RETQ $ebp
381
382...
383---
384name:            testleaadd_64_32
385alignment:       16
386exposesReturnsTwice: false
387legalized:       false
388regBankSelected: false
389selected:        false
390tracksRegLiveness: true
391liveins:
392  - { reg: '$rax' }
393  - { reg: '$rbp' }
394  - { reg: '$rbx' }
395frameInfo:
396  isFrameAddressTaken: false
397  isReturnAddressTaken: false
398  hasStackMap:     false
399  hasPatchPoint:   false
400  stackSize:       0
401  offsetAdjustment: 0
402  maxAlignment:    0
403  adjustsStack:    false
404  hasCalls:        false
405  maxCallFrameSize: 0
406  hasOpaqueSPAdjustment: false
407  hasVAStart:      false
408  hasMustTailInVarArgFunc: false
409body:             |
410  bb.0 (%ir-block.0):
411    liveins: $rax, $rbp
412
413    ; CHECK-LABEL: name: testleaadd_64_32
414    ; CHECK: liveins: $rax, $rbp
415    ; CHECK: $ebx = LEA64_32r killed $rax, 1, killed $rbp, 0, $noreg
416    ; CHECK: $ebx = ADD32ri8 $ebx, -5, implicit-def $eflags
417    ; CHECK: RETQ $ebx
418    $ebx = LEA64_32r killed $rax, 1, killed $rbp, -5, $noreg
419    RETQ $ebx
420
421...
422---
423name:            testleaadd_rbp_64_32
424alignment:       16
425exposesReturnsTwice: false
426legalized:       false
427regBankSelected: false
428selected:        false
429tracksRegLiveness: true
430liveins:
431  - { reg: '$rax' }
432  - { reg: '$rbp' }
433  - { reg: '$rbx' }
434frameInfo:
435  isFrameAddressTaken: false
436  isReturnAddressTaken: false
437  hasStackMap:     false
438  hasPatchPoint:   false
439  stackSize:       0
440  offsetAdjustment: 0
441  maxAlignment:    0
442  adjustsStack:    false
443  hasCalls:        false
444  maxCallFrameSize: 0
445  hasOpaqueSPAdjustment: false
446  hasVAStart:      false
447  hasMustTailInVarArgFunc: false
448body:             |
449  bb.0 (%ir-block.0):
450    liveins: $rax, $rbp
451
452    ; CHECK-LABEL: name: testleaadd_rbp_64_32
453    ; CHECK: liveins: $rax, $rbp
454    ; CHECK: $ebx = LEA64_32r killed $rax, 1, killed $rbp, 0, $noreg
455    ; CHECK: $ebx = ADD32ri8 $ebx, -5, implicit-def $eflags
456    ; CHECK: RETQ $ebx
457    $ebx = LEA64_32r killed $rbp, 1, killed $rax, -5, $noreg
458    RETQ $ebx
459
460...
461---
462name:            test1lea_rbp_64_32
463alignment:       16
464exposesReturnsTwice: false
465legalized:       false
466regBankSelected: false
467selected:        false
468tracksRegLiveness: true
469liveins:
470  - { reg: '$rax' }
471  - { reg: '$rbp' }
472  - { reg: '$rbx' }
473frameInfo:
474  isFrameAddressTaken: false
475  isReturnAddressTaken: false
476  hasStackMap:     false
477  hasPatchPoint:   false
478  stackSize:       0
479  offsetAdjustment: 0
480  maxAlignment:    0
481  adjustsStack:    false
482  hasCalls:        false
483  maxCallFrameSize: 0
484  hasOpaqueSPAdjustment: false
485  hasVAStart:      false
486  hasMustTailInVarArgFunc: false
487body:             |
488  bb.0 (%ir-block.0):
489    liveins: $rax, $rbp
490
491    ; CHECK-LABEL: name: test1lea_rbp_64_32
492    ; CHECK: liveins: $rax, $rbp
493    ; CHECK: $ebx = LEA64_32r killed $rax, 1, killed $rbp, 0, $noreg
494    ; CHECK: RETQ $ebx
495    $ebx = LEA64_32r killed $rbp, 1, killed $rax, 0, $noreg
496    RETQ $ebx
497
498...
499---
500name:            testleaadd_64
501alignment:       16
502exposesReturnsTwice: false
503legalized:       false
504regBankSelected: false
505selected:        false
506tracksRegLiveness: true
507liveins:
508  - { reg: '$rax' }
509  - { reg: '$rbp' }
510  - { reg: '$rbx' }
511frameInfo:
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
525body:             |
526  bb.0 (%ir-block.0):
527    liveins: $rax, $rbp
528
529    ; CHECK-LABEL: name: testleaadd_64
530    ; CHECK: liveins: $rax, $rbp
531    ; CHECK: $rbx = LEA64r killed $rax, 1, killed $rbp, 0, $noreg
532    ; CHECK: $rbx = ADD64ri8 $rbx, -5, implicit-def $eflags
533    ; CHECK: RETQ $ebx
534    $rbx = LEA64r killed $rax, 1, killed $rbp, -5, $noreg
535    RETQ $ebx
536
537...
538---
539name:            testleaadd_rbp_64
540alignment:       16
541exposesReturnsTwice: false
542legalized:       false
543regBankSelected: false
544selected:        false
545tracksRegLiveness: true
546liveins:
547  - { reg: '$rax' }
548  - { reg: '$rbp' }
549  - { reg: '$rbx' }
550frameInfo:
551  isFrameAddressTaken: false
552  isReturnAddressTaken: false
553  hasStackMap:     false
554  hasPatchPoint:   false
555  stackSize:       0
556  offsetAdjustment: 0
557  maxAlignment:    0
558  adjustsStack:    false
559  hasCalls:        false
560  maxCallFrameSize: 0
561  hasOpaqueSPAdjustment: false
562  hasVAStart:      false
563  hasMustTailInVarArgFunc: false
564body:             |
565  bb.0 (%ir-block.0):
566    liveins: $rax, $rbp
567
568    ; CHECK-LABEL: name: testleaadd_rbp_64
569    ; CHECK: liveins: $rax, $rbp
570    ; CHECK: $rbx = LEA64r killed $rax, 1, killed $rbp, 0, $noreg
571    ; CHECK: $rbx = ADD64ri8 $rbx, -5, implicit-def $eflags
572    ; CHECK: RETQ $ebx
573    $rbx = LEA64r killed $rbp, 1, killed $rax, -5, $noreg
574    RETQ $ebx
575
576...
577---
578name:            test1lea_rbp_64
579alignment:       16
580exposesReturnsTwice: false
581legalized:       false
582regBankSelected: false
583selected:        false
584tracksRegLiveness: true
585liveins:
586  - { reg: '$rax' }
587  - { reg: '$rbp' }
588  - { reg: '$rbx' }
589frameInfo:
590  isFrameAddressTaken: false
591  isReturnAddressTaken: false
592  hasStackMap:     false
593  hasPatchPoint:   false
594  stackSize:       0
595  offsetAdjustment: 0
596  maxAlignment:    0
597  adjustsStack:    false
598  hasCalls:        false
599  maxCallFrameSize: 0
600  hasOpaqueSPAdjustment: false
601  hasVAStart:      false
602  hasMustTailInVarArgFunc: false
603body:             |
604  bb.0 (%ir-block.0):
605    liveins: $rax, $rbp
606
607    ; CHECK-LABEL: name: test1lea_rbp_64
608    ; CHECK: liveins: $rax, $rbp
609    ; CHECK: $rbx = LEA64r killed $rax, 1, killed $rbp, 0, $noreg
610    ; CHECK: RETQ $ebx
611    $rbx = LEA64r killed $rbp, 1, killed $rax, 0, $noreg
612    RETQ $ebx
613
614...
615---
616name:            test8
617alignment:       16
618exposesReturnsTwice: false
619legalized:       false
620regBankSelected: false
621selected:        false
622tracksRegLiveness: true
623liveins:
624  - { reg: '$rdi' }
625  - { reg: '$rbp' }
626frameInfo:
627  isFrameAddressTaken: false
628  isReturnAddressTaken: false
629  hasStackMap:     false
630  hasPatchPoint:   false
631  stackSize:       0
632  offsetAdjustment: 0
633  maxAlignment:    0
634  adjustsStack:    false
635  hasCalls:        false
636  maxCallFrameSize: 0
637  hasOpaqueSPAdjustment: false
638  hasVAStart:      false
639  hasMustTailInVarArgFunc: false
640body:             |
641  bb.0 (%ir-block.0):
642    liveins: $rdi, $rbp
643    ; CHECK-LABEL: name: test8
644    ; CHECK: liveins: $rdi, $rbp
645    ; CHECK: $rbp = KILL $rbp, implicit-def $rbp
646    ; CHECK: $r13 = KILL $rdi, implicit-def $r13
647    ; CHECK: $r12 = LEA64r $noreg, 2, killed $r13, 5, $noreg
648    ; CHECK: $r12 = ADD64rr $r12, killed $rbp, implicit-def $eflags
649    ; CHECK: RETQ $r12
650    $rbp = KILL $rbp, implicit-def $rbp
651    $r13 = KILL $rdi, implicit-def $r13
652    $r12 = LEA64r killed $rbp, 2, killed $r13, 5, $noreg
653    RETQ $r12
654
655...
656---
657name:            testleaaddi32_64_32
658alignment:       16
659exposesReturnsTwice: false
660legalized:       false
661regBankSelected: false
662selected:        false
663tracksRegLiveness: true
664liveins:
665  - { reg: '$rax' }
666  - { reg: '$rbp' }
667frameInfo:
668  isFrameAddressTaken: false
669  isReturnAddressTaken: false
670  hasStackMap:     false
671  hasPatchPoint:   false
672  stackSize:       0
673  offsetAdjustment: 0
674  maxAlignment:    0
675  adjustsStack:    false
676  hasCalls:        false
677  maxCallFrameSize: 0
678  hasOpaqueSPAdjustment: false
679  hasVAStart:      false
680  hasMustTailInVarArgFunc: false
681body:             |
682  bb.0 (%ir-block.0):
683    liveins: $rax, $rbp
684
685    ; CHECK-LABEL: name: testleaaddi32_64_32
686    ; CHECK: liveins: $rax, $rbp
687    ; CHECK: $eax = ADD32rr $eax, $ebp, implicit-def $eflags, implicit $rax, implicit $rbp
688    ; CHECK: $eax = ADD32ri $eax, 129, implicit-def $eflags
689    ; CHECK: RETQ $eax
690    $eax = LEA64_32r killed $rax, 1, killed $rbp, 129, $noreg
691    RETQ $eax
692
693...
694---
695name:            test1mov1add_rbp_64_32
696alignment:       16
697exposesReturnsTwice: false
698legalized:       false
699regBankSelected: false
700selected:        false
701tracksRegLiveness: true
702liveins:
703  - { reg: '$rax' }
704  - { reg: '$rbp' }
705frameInfo:
706  isFrameAddressTaken: false
707  isReturnAddressTaken: false
708  hasStackMap:     false
709  hasPatchPoint:   false
710  stackSize:       0
711  offsetAdjustment: 0
712  maxAlignment:    0
713  adjustsStack:    false
714  hasCalls:        false
715  maxCallFrameSize: 0
716  hasOpaqueSPAdjustment: false
717  hasVAStart:      false
718  hasMustTailInVarArgFunc: false
719body:             |
720  bb.0 (%ir-block.0):
721    liveins: $rax, $rbp, $rbx
722
723    ; CHECK-LABEL: name: test1mov1add_rbp_64_32
724    ; CHECK: liveins: $rax, $rbp, $rbx
725    ; CHECK: $ebx = LEA64_32r killed $rbp, 1, killed $rbp, 0, $noreg
726    ; CHECK: RETQ $ebx
727    $ebx = LEA64_32r killed $rbp, 1, killed $rbp, 0, $noreg
728    RETQ $ebx
729
730...
731---
732name:            testleaadd_rbp_index_64_32
733alignment:       16
734exposesReturnsTwice: false
735legalized:       false
736regBankSelected: false
737selected:        false
738tracksRegLiveness: true
739liveins:
740  - { reg: '$rbx' }
741  - { reg: '$rbp' }
742frameInfo:
743  isFrameAddressTaken: false
744  isReturnAddressTaken: false
745  hasStackMap:     false
746  hasPatchPoint:   false
747  stackSize:       0
748  offsetAdjustment: 0
749  maxAlignment:    0
750  adjustsStack:    false
751  hasCalls:        false
752  maxCallFrameSize: 0
753  hasOpaqueSPAdjustment: false
754  hasVAStart:      false
755  hasMustTailInVarArgFunc: false
756body:             |
757  bb.0 (%ir-block.0):
758    liveins: $rax, $rbp, $rbx
759
760    ; CHECK-LABEL: name: testleaadd_rbp_index_64_32
761    ; CHECK: liveins: $rax, $rbp, $rbx
762    ; CHECK: $ebx = LEA64_32r killed $rbp, 1, killed $rbp, 5, $noreg
763    ; CHECK: RETQ $ebx
764    $ebx = LEA64_32r killed $rbp, 1, killed $rbp, 5, $noreg
765    RETQ $ebx
766
767...
768---
769name:            testleaadd_rbp_index2_64_32
770alignment:       16
771exposesReturnsTwice: false
772legalized:       false
773regBankSelected: false
774selected:        false
775tracksRegLiveness: true
776liveins:
777  - { reg: '$rbx' }
778  - { reg: '$rbp' }
779frameInfo:
780  isFrameAddressTaken: false
781  isReturnAddressTaken: false
782  hasStackMap:     false
783  hasPatchPoint:   false
784  stackSize:       0
785  offsetAdjustment: 0
786  maxAlignment:    0
787  adjustsStack:    false
788  hasCalls:        false
789  maxCallFrameSize: 0
790  hasOpaqueSPAdjustment: false
791  hasVAStart:      false
792  hasMustTailInVarArgFunc: false
793body:             |
794  bb.0 (%ir-block.0):
795    liveins: $eax, $ebp, $ebx
796
797    ; CHECK-LABEL: name: testleaadd_rbp_index2_64_32
798    ; CHECK: liveins: $eax, $ebp, $ebx
799    ; CHECK: $ebx = LEA64_32r killed $rbp, 4, killed $rbp, 5, $noreg
800    ; CHECK: RETQ $ebx
801    $ebx = LEA64_32r killed $rbp, 4, killed $rbp, 5, $noreg
802    RETQ $ebx
803
804...
805---
806name:            test2addi32_64
807alignment:       16
808exposesReturnsTwice: false
809legalized:       false
810regBankSelected: false
811selected:        false
812tracksRegLiveness: true
813liveins:
814  - { reg: '$rax' }
815  - { reg: '$rbp' }
816frameInfo:
817  isFrameAddressTaken: false
818  isReturnAddressTaken: false
819  hasStackMap:     false
820  hasPatchPoint:   false
821  stackSize:       0
822  offsetAdjustment: 0
823  maxAlignment:    0
824  adjustsStack:    false
825  hasCalls:        false
826  maxCallFrameSize: 0
827  hasOpaqueSPAdjustment: false
828  hasVAStart:      false
829  hasMustTailInVarArgFunc: false
830body:             |
831  bb.0 (%ir-block.0):
832    liveins: $rax, $rbp
833
834    ; CHECK-LABEL: name: test2addi32_64
835    ; CHECK: liveins: $rax, $rbp
836    ; CHECK: $rax = ADD64rr $rax, $rbp, implicit-def $eflags
837    ; CHECK: $rax = ADD64ri32 $rax, 129, implicit-def $eflags
838    ; CHECK: RETQ $eax
839    $rax = LEA64r killed $rax, 1, killed $rbp, 129, $noreg
840    RETQ $eax
841
842...
843---
844name:            test1mov1add_rbp_64
845alignment:       16
846exposesReturnsTwice: false
847legalized:       false
848regBankSelected: false
849selected:        false
850tracksRegLiveness: true
851liveins:
852  - { reg: '$rax' }
853  - { reg: '$rbp' }
854frameInfo:
855  isFrameAddressTaken: false
856  isReturnAddressTaken: false
857  hasStackMap:     false
858  hasPatchPoint:   false
859  stackSize:       0
860  offsetAdjustment: 0
861  maxAlignment:    0
862  adjustsStack:    false
863  hasCalls:        false
864  maxCallFrameSize: 0
865  hasOpaqueSPAdjustment: false
866  hasVAStart:      false
867  hasMustTailInVarArgFunc: false
868body:             |
869  bb.0 (%ir-block.0):
870    liveins: $rax, $rbp, $rbx
871
872    ; CHECK-LABEL: name: test1mov1add_rbp_64
873    ; CHECK: liveins: $rax, $rbp, $rbx
874    ; CHECK: $rbx = MOV64rr $rbp
875    ; CHECK: $rbx = ADD64rr $rbx, $rbp, implicit-def $eflags
876    ; CHECK: $rbx = LEA64r killed $rbp, 1, $rbp, 0, $noreg
877    ; CHECK: RETQ $ebx
878    $rbx = LEA64r killed $rbp, 1, $rbp, 0, $noreg
879    RETQ $ebx
880
881...
882---
883name:            testleaadd_rbp_index_64
884alignment:       16
885exposesReturnsTwice: false
886legalized:       false
887regBankSelected: false
888selected:        false
889tracksRegLiveness: true
890liveins:
891  - { reg: '$rbx' }
892  - { reg: '$rbp' }
893frameInfo:
894  isFrameAddressTaken: false
895  isReturnAddressTaken: false
896  hasStackMap:     false
897  hasPatchPoint:   false
898  stackSize:       0
899  offsetAdjustment: 0
900  maxAlignment:    0
901  adjustsStack:    false
902  hasCalls:        false
903  maxCallFrameSize: 0
904  hasOpaqueSPAdjustment: false
905  hasVAStart:      false
906  hasMustTailInVarArgFunc: false
907body:             |
908  bb.0 (%ir-block.0):
909    liveins: $rax, $rbp, $rbx
910
911    ; CHECK-LABEL: name: testleaadd_rbp_index_64
912    ; CHECK: liveins: $rax, $rbp, $rbx
913    ; CHECK: $rbx = LEA64r $noreg, 1, $rbp, 5, $noreg
914    ; CHECK: $rbx = ADD64rr $rbx, $rbp, implicit-def $eflags
915    ; CHECK: RETQ $ebx
916    $rbx = LEA64r $rbp, 1, $rbp, 5, $noreg
917    RETQ $ebx
918
919...
920---
921name:            testleaadd_rbp_index2_64
922alignment:       16
923exposesReturnsTwice: false
924legalized:       false
925regBankSelected: false
926selected:        false
927tracksRegLiveness: true
928liveins:
929  - { reg: '$rbx' }
930  - { reg: '$rbp' }
931frameInfo:
932  isFrameAddressTaken: false
933  isReturnAddressTaken: false
934  hasStackMap:     false
935  hasPatchPoint:   false
936  stackSize:       0
937  offsetAdjustment: 0
938  maxAlignment:    0
939  adjustsStack:    false
940  hasCalls:        false
941  maxCallFrameSize: 0
942  hasOpaqueSPAdjustment: false
943  hasVAStart:      false
944  hasMustTailInVarArgFunc: false
945body:             |
946  bb.0 (%ir-block.0):
947    liveins: $rax, $rbp, $rbx
948
949    ; CHECK-LABEL: name: testleaadd_rbp_index2_64
950    ; CHECK: liveins: $rax, $rbp, $rbx
951    ; CHECK: $rbx = LEA64r $noreg, 4, $rbp, 5, $noreg
952    ; CHECK: $rbx = ADD64rr $rbx, $rbp, implicit-def $eflags
953    ; CHECK: RETQ $ebx
954    $rbx = LEA64r $rbp, 4,  $rbp, 5, $noreg
955    RETQ $ebx
956
957...
958---
959name:            test_skip_opt_64
960alignment:       16
961exposesReturnsTwice: false
962legalized:       false
963regBankSelected: false
964selected:        false
965tracksRegLiveness: true
966liveins:
967  - { reg: '$rbx' }
968  - { reg: '$rbp' }
969frameInfo:
970  isFrameAddressTaken: false
971  isReturnAddressTaken: false
972  hasStackMap:     false
973  hasPatchPoint:   false
974  stackSize:       0
975  offsetAdjustment: 0
976  maxAlignment:    0
977  adjustsStack:    false
978  hasCalls:        false
979  maxCallFrameSize: 0
980  hasOpaqueSPAdjustment: false
981  hasVAStart:      false
982  hasMustTailInVarArgFunc: false
983body:             |
984  bb.0 (%ir-block.0):
985    liveins: $rax, $rbp, $rbx
986
987    ; CHECK-LABEL: name: test_skip_opt_64
988    ; CHECK: liveins: $rax, $rbp, $rbx
989    ; CHECK: $rbp = LEA64r killed $rbp, 4, killed $rbp, 0, $noreg
990    ; CHECK: RETQ $ebp
991    $rbp = LEA64r killed $rbp, 4, killed $rbp, 0, $noreg
992    RETQ $ebp
993
994...
995---
996name:            test_skip_eflags_64
997alignment:       16
998exposesReturnsTwice: false
999legalized:       false
1000regBankSelected: false
1001selected:        false
1002tracksRegLiveness: true
1003liveins:
1004  - { reg: '$rbp' }
1005  - { reg: '$rax' }
1006frameInfo:
1007  isFrameAddressTaken: false
1008  isReturnAddressTaken: false
1009  hasStackMap:     false
1010  hasPatchPoint:   false
1011  stackSize:       0
1012  offsetAdjustment: 0
1013  maxAlignment:    0
1014  adjustsStack:    false
1015  hasCalls:        false
1016  maxCallFrameSize: 0
1017  hasOpaqueSPAdjustment: false
1018  hasVAStart:      false
1019  hasMustTailInVarArgFunc: false
1020body:             |
1021  ; CHECK-LABEL: name: test_skip_eflags_64
1022  ; CHECK: bb.0 (%ir-block.0):
1023  ; CHECK:   successors: %bb.1(0x80000000)
1024  ; CHECK:   liveins: $rax, $rbp, $rbx
1025  ; CHECK:   CMP64rr $rax, killed $rbx, implicit-def $eflags
1026  ; CHECK:   $rbx = LEA64r killed $rax, 4, killed $rax, 5, $noreg
1027  ; CHECK:   JCC_1 %bb.1, 4, implicit $eflags
1028  ; CHECK:   RETQ $ebx
1029  ; CHECK: bb.1:
1030  ; CHECK:   liveins: $rax, $rbp, $rbx
1031  ; CHECK:   $rbp = LEA64r killed $rbx, 4, killed $rbx, 0, $noreg
1032  ; CHECK:   $rbp = ADD64ri8 $rbp, 5, implicit-def $eflags
1033  ; CHECK:   RETQ $ebp
1034  bb.0 (%ir-block.0):
1035    liveins: $rax, $rbp, $rbx
1036
1037    CMP64rr   $rax, killed $rbx, implicit-def $eflags
1038    $rbx = LEA64r killed $rax, 4, killed $rax, 5, $noreg
1039    JCC_1 %bb.1, 4, implicit $eflags
1040    RETQ $ebx
1041  bb.1:
1042    liveins: $rax, $rbp, $rbx
1043    $rbp = LEA64r killed $rbx, 4, killed $rbx, 5, $noreg
1044    RETQ $ebp
1045
1046...
1047---
1048name:            test_skip_opt_64_32
1049alignment:       16
1050exposesReturnsTwice: false
1051legalized:       false
1052regBankSelected: false
1053selected:        false
1054tracksRegLiveness: true
1055liveins:
1056  - { reg: '$rbx' }
1057  - { reg: '$rbp' }
1058frameInfo:
1059  isFrameAddressTaken: false
1060  isReturnAddressTaken: false
1061  hasStackMap:     false
1062  hasPatchPoint:   false
1063  stackSize:       0
1064  offsetAdjustment: 0
1065  maxAlignment:    0
1066  adjustsStack:    false
1067  hasCalls:        false
1068  maxCallFrameSize: 0
1069  hasOpaqueSPAdjustment: false
1070  hasVAStart:      false
1071  hasMustTailInVarArgFunc: false
1072body:             |
1073  bb.0 (%ir-block.0):
1074    liveins: $rax, $rbp, $rbx
1075
1076    ; CHECK-LABEL: name: test_skip_opt_64_32
1077    ; CHECK: liveins: $rax, $rbp, $rbx
1078    ; CHECK: $ebp = LEA64_32r killed $rbp, 4, killed $rbp, 0, $noreg
1079    ; CHECK: RETQ $ebp
1080    $ebp = LEA64_32r killed $rbp, 4, killed $rbp, 0, $noreg
1081    RETQ $ebp
1082
1083...
1084---
1085name:            test_skip_eflags_64_32
1086alignment:       16
1087exposesReturnsTwice: false
1088legalized:       false
1089regBankSelected: false
1090selected:        false
1091tracksRegLiveness: true
1092liveins:
1093  - { reg: '$rbp' }
1094  - { reg: '$rax' }
1095frameInfo:
1096  isFrameAddressTaken: false
1097  isReturnAddressTaken: false
1098  hasStackMap:     false
1099  hasPatchPoint:   false
1100  stackSize:       0
1101  offsetAdjustment: 0
1102  maxAlignment:    0
1103  adjustsStack:    false
1104  hasCalls:        false
1105  maxCallFrameSize: 0
1106  hasOpaqueSPAdjustment: false
1107  hasVAStart:      false
1108  hasMustTailInVarArgFunc: false
1109body:             |
1110  ; CHECK-LABEL: name: test_skip_eflags_64_32
1111  ; CHECK: bb.0 (%ir-block.0):
1112  ; CHECK:   successors: %bb.1(0x80000000)
1113  ; CHECK:   liveins: $rax, $rbp, $rbx
1114  ; CHECK:   CMP64rr $rax, killed $rbx, implicit-def $eflags
1115  ; CHECK:   $ebx = LEA64_32r killed $rax, 4, killed $rax, 5, $noreg
1116  ; CHECK:   JCC_1 %bb.1, 4, implicit $eflags
1117  ; CHECK:   RETQ $ebx
1118  ; CHECK: bb.1:
1119  ; CHECK:   liveins: $rax, $rbp, $rbx
1120  ; CHECK:   $ebp = LEA64_32r killed $rbx, 4, killed $rbx, 0, $noreg
1121  ; CHECK:   $ebp = ADD32ri8 $ebp, 5, implicit-def $eflags
1122  ; CHECK:   RETQ $ebp
1123  bb.0 (%ir-block.0):
1124    liveins: $rax, $rbp, $rbx
1125
1126    CMP64rr   $rax, killed $rbx, implicit-def $eflags
1127    $ebx = LEA64_32r killed $rax, 4, killed $rax, 5, $noreg
1128    JCC_1 %bb.1, 4, implicit $eflags
1129    RETQ $ebx
1130  bb.1:
1131    liveins: $rax, $rbp, $rbx
1132    $ebp = LEA64_32r killed $rbx, 4, killed $rbx, 5, $noreg
1133    RETQ $ebp
1134
1135...
1136---
1137name:            pr43758
1138alignment:       16
1139exposesReturnsTwice: false
1140legalized:       false
1141regBankSelected: false
1142selected:        false
1143tracksRegLiveness: true
1144liveins:
1145  - { reg: '$rax' }
1146  - { reg: '$rbp' }
1147frameInfo:
1148  isFrameAddressTaken: false
1149  isReturnAddressTaken: false
1150  hasStackMap:     false
1151  hasPatchPoint:   false
1152  stackSize:       0
1153  offsetAdjustment: 0
1154  maxAlignment:    0
1155  adjustsStack:    false
1156  hasCalls:        false
1157  maxCallFrameSize: 0
1158  hasOpaqueSPAdjustment: false
1159  hasVAStart:      false
1160  hasMustTailInVarArgFunc: false
1161body:             |
1162  bb.0 (%ir-block.0):
1163    liveins: $rax, $rbp
1164
1165    ; CHECK-LABEL: name: pr43758
1166    ; CHECK: liveins: $rax, $rbp
1167    ; CHECK: DBG_VALUE 0, $noreg
1168    ; CHECK: NOOP
1169    ; CHECK: NOOP
1170    ; CHECK: NOOP
1171    ; CHECK: NOOP
1172    ; CHECK: $ebp = LEA64_32r killed $rbp, 1, killed $rax, 0, $noreg
1173    ; CHECK: NOOP
1174    ; CHECK: NOOP
1175    ; CHECK: NOOP
1176    ; CHECK: NOOP
1177    ; CHECK: RETQ $ebp
1178    DBG_VALUE 0, $noreg
1179    NOOP
1180    NOOP
1181    NOOP
1182    NOOP
1183    $ebp = LEA64_32r killed $rbp, 1, killed $rax, 0, $noreg
1184    NOOP
1185    NOOP
1186    NOOP
1187    NOOP
1188    RETQ $ebp
1189
1190...
1191...
1192
1193
1194
1195