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
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
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() {
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() {
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() {
27 ;test2add_64: 3 operands LEA64r that can be replaced with 2 add instructions
28 define i32 @test2add_64() {
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() {
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() {
44 ;testleaadd_64_32: 3 operands LEA64_32r that can be replaced with 1 lea 1 add instructions
45 define i32 @testleaadd_64_32() {
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() {
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() {
61 ;testleaadd_64: 3 operands LEA64r that can be replaced with 1 lea 1 add instructions
62 define i32 @testleaadd_64() {
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() {
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() {
78 ;test8: dst = base & scale!=1, can't optimize
83 ;testleaaddi32_64_32: 3 operands LEA64_32r that can be replaced with 1 lea + 1 add instructions where
85 define i32 @testleaaddi32_64_32() {
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() {
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() {
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() {
107 ;test2addi32_64: 3 operands LEA64r that can be replaced with 2 add instructions where ADD64ri32
109 define i32 @test2addi32_64() {
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() {
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() {
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() {
131 ;test_skip_opt_64: 3 operands LEA64r that can not be replaced with 2 instructions
132 define i32 @test_skip_opt_64() {
136 ;test_skip_eflags_64: LEA64r that cannot be replaced since its not safe to clobber eflags
137 define i32 @test_skip_eflags_64() {
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() {
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() {
154 name: testleaadd_64_32_1
156 exposesReturnsTwice: false
158 regBankSelected: false
160 tracksRegLiveness: true
165 isFrameAddressTaken: false
166 isReturnAddressTaken: false
175 hasOpaqueSPAdjustment: false
177 hasMustTailInVarArgFunc: false
182 ; CHECK-LABEL: name: testleaadd_64_32_1
183 ; CHECK: liveins: $rax, $rbp
184 ; CHECK: $eax = ADD32rr $eax, $ebp, implicit-def $eflags, implicit $rax, implicit $rbp
185 ; CHECK: $eax = ADD32ri8 $eax, -5, implicit-def $eflags
187 $eax = LEA64_32r killed $rax, 1, killed $rbp, -5, $noreg
192 name: testleaadd_rbp_64_32_1
194 exposesReturnsTwice: false
196 regBankSelected: false
198 tracksRegLiveness: true
203 isFrameAddressTaken: false
204 isReturnAddressTaken: false
213 hasOpaqueSPAdjustment: false
215 hasMustTailInVarArgFunc: false
220 ; CHECK-LABEL: name: testleaadd_rbp_64_32_1
221 ; CHECK: liveins: $rax, $rbp
222 ; CHECK: $ebp = ADD32rr $ebp, $eax, implicit-def $eflags, implicit $rbp, implicit $rax
223 ; CHECK: $ebp = ADD32ri8 $ebp, -5, implicit-def $eflags
225 $ebp = LEA64_32r killed $rbp, 1, killed $rax, -5, $noreg
230 name: test1lea_rbp_64_32_1
232 exposesReturnsTwice: false
234 regBankSelected: false
236 tracksRegLiveness: true
241 isFrameAddressTaken: false
242 isReturnAddressTaken: false
251 hasOpaqueSPAdjustment: false
253 hasMustTailInVarArgFunc: false
258 ; CHECK-LABEL: name: test1lea_rbp_64_32_1
259 ; CHECK: liveins: $rax, $rbp
260 ; CHECK: $ebp = ADD32rr $ebp, $eax, implicit-def $eflags, implicit $rbp, implicit $rax
262 $ebp = LEA64_32r killed $rbp, 1, killed $rax, 0, $noreg
269 exposesReturnsTwice: false
271 regBankSelected: false
273 tracksRegLiveness: true
278 isFrameAddressTaken: false
279 isReturnAddressTaken: false
288 hasOpaqueSPAdjustment: false
290 hasMustTailInVarArgFunc: false
295 ; CHECK-LABEL: name: test2add_64
296 ; CHECK: liveins: $rax, $rbp
297 ; CHECK: $rax = ADD64rr $rax, $rbp, implicit-def $eflags
298 ; CHECK: $rax = ADD64ri8 $rax, -5, implicit-def $eflags
300 $rax = LEA64r killed $rax, 1, killed $rbp, -5, $noreg
305 name: test2add_rbp_64
307 exposesReturnsTwice: false
309 regBankSelected: false
311 tracksRegLiveness: true
316 isFrameAddressTaken: false
317 isReturnAddressTaken: false
326 hasOpaqueSPAdjustment: false
328 hasMustTailInVarArgFunc: false
333 ; CHECK-LABEL: name: test2add_rbp_64
334 ; CHECK: liveins: $rax, $rbp
335 ; CHECK: $rbp = ADD64rr $rbp, $rax, implicit-def $eflags
336 ; CHECK: $rbp = ADD64ri8 $rbp, -5, implicit-def $eflags
338 $rbp = LEA64r killed $rbp, 1, killed $rax, -5, $noreg
343 name: test1add_rbp_64
345 exposesReturnsTwice: false
347 regBankSelected: false
349 tracksRegLiveness: true
354 isFrameAddressTaken: false
355 isReturnAddressTaken: false
364 hasOpaqueSPAdjustment: false
366 hasMustTailInVarArgFunc: false
371 ; CHECK-LABEL: name: test1add_rbp_64
372 ; CHECK: liveins: $rax, $rbp
373 ; CHECK: $rbp = ADD64rr $rbp, $rax, implicit-def $eflags
375 $rbp = LEA64r killed $rbp, 1, killed $rax, 0, $noreg
380 name: testleaadd_64_32
382 exposesReturnsTwice: false
384 regBankSelected: false
386 tracksRegLiveness: true
392 isFrameAddressTaken: false
393 isReturnAddressTaken: false
402 hasOpaqueSPAdjustment: false
404 hasMustTailInVarArgFunc: false
409 ; CHECK-LABEL: name: testleaadd_64_32
410 ; CHECK: liveins: $rax, $rbp
411 ; CHECK: $ebx = LEA64_32r killed $rax, 1, killed $rbp, 0, $noreg
412 ; CHECK: $ebx = ADD32ri8 $ebx, -5, implicit-def $eflags
414 $ebx = LEA64_32r killed $rax, 1, killed $rbp, -5, $noreg
419 name: testleaadd_rbp_64_32
421 exposesReturnsTwice: false
423 regBankSelected: false
425 tracksRegLiveness: true
431 isFrameAddressTaken: false
432 isReturnAddressTaken: false
441 hasOpaqueSPAdjustment: false
443 hasMustTailInVarArgFunc: false
448 ; CHECK-LABEL: name: testleaadd_rbp_64_32
449 ; CHECK: liveins: $rax, $rbp
450 ; CHECK: $ebx = LEA64_32r killed $rax, 1, killed $rbp, 0, $noreg
451 ; CHECK: $ebx = ADD32ri8 $ebx, -5, implicit-def $eflags
453 $ebx = LEA64_32r killed $rbp, 1, killed $rax, -5, $noreg
458 name: test1lea_rbp_64_32
460 exposesReturnsTwice: false
462 regBankSelected: false
464 tracksRegLiveness: true
470 isFrameAddressTaken: false
471 isReturnAddressTaken: false
480 hasOpaqueSPAdjustment: false
482 hasMustTailInVarArgFunc: false
487 ; CHECK-LABEL: name: test1lea_rbp_64_32
488 ; CHECK: liveins: $rax, $rbp
489 ; CHECK: $ebx = LEA64_32r killed $rax, 1, killed $rbp, 0, $noreg
491 $ebx = LEA64_32r killed $rbp, 1, killed $rax, 0, $noreg
498 exposesReturnsTwice: false
500 regBankSelected: false
502 tracksRegLiveness: true
508 isFrameAddressTaken: false
509 isReturnAddressTaken: false
518 hasOpaqueSPAdjustment: false
520 hasMustTailInVarArgFunc: false
525 ; CHECK-LABEL: name: testleaadd_64
526 ; CHECK: liveins: $rax, $rbp
527 ; CHECK: $rbx = LEA64r killed $rax, 1, killed $rbp, 0, $noreg
528 ; CHECK: $rbx = ADD64ri8 $rbx, -5, implicit-def $eflags
530 $rbx = LEA64r killed $rax, 1, killed $rbp, -5, $noreg
535 name: testleaadd_rbp_64
537 exposesReturnsTwice: false
539 regBankSelected: false
541 tracksRegLiveness: true
547 isFrameAddressTaken: false
548 isReturnAddressTaken: false
557 hasOpaqueSPAdjustment: false
559 hasMustTailInVarArgFunc: false
564 ; CHECK-LABEL: name: testleaadd_rbp_64
565 ; CHECK: liveins: $rax, $rbp
566 ; CHECK: $rbx = LEA64r killed $rax, 1, killed $rbp, 0, $noreg
567 ; CHECK: $rbx = ADD64ri8 $rbx, -5, implicit-def $eflags
569 $rbx = LEA64r killed $rbp, 1, killed $rax, -5, $noreg
574 name: test1lea_rbp_64
576 exposesReturnsTwice: false
578 regBankSelected: false
580 tracksRegLiveness: true
586 isFrameAddressTaken: false
587 isReturnAddressTaken: false
596 hasOpaqueSPAdjustment: false
598 hasMustTailInVarArgFunc: false
603 ; CHECK-LABEL: name: test1lea_rbp_64
604 ; CHECK: liveins: $rax, $rbp
605 ; CHECK: $rbx = LEA64r killed $rax, 1, killed $rbp, 0, $noreg
607 $rbx = LEA64r killed $rbp, 1, killed $rax, 0, $noreg
614 exposesReturnsTwice: false
616 regBankSelected: false
618 tracksRegLiveness: true
623 isFrameAddressTaken: false
624 isReturnAddressTaken: false
633 hasOpaqueSPAdjustment: false
635 hasMustTailInVarArgFunc: false
639 ; CHECK-LABEL: name: test8
640 ; CHECK: liveins: $rdi, $rbp
641 ; CHECK: $rbp = KILL $rbp, implicit-def $rbp
642 ; CHECK: $r13 = KILL $rdi, implicit-def $r13
643 ; CHECK: $r12 = LEA64r $noreg, 2, killed $r13, 5, $noreg
644 ; CHECK: $r12 = ADD64rr $r12, killed $rbp, implicit-def $eflags
646 $rbp = KILL $rbp, implicit-def $rbp
647 $r13 = KILL $rdi, implicit-def $r13
648 $r12 = LEA64r killed $rbp, 2, killed $r13, 5, $noreg
653 name: testleaaddi32_64_32
655 exposesReturnsTwice: false
657 regBankSelected: false
659 tracksRegLiveness: true
664 isFrameAddressTaken: false
665 isReturnAddressTaken: false
674 hasOpaqueSPAdjustment: false
676 hasMustTailInVarArgFunc: false
681 ; CHECK-LABEL: name: testleaaddi32_64_32
682 ; CHECK: liveins: $rax, $rbp
683 ; CHECK: $eax = ADD32rr $eax, $ebp, implicit-def $eflags, implicit $rax, implicit $rbp
684 ; CHECK: $eax = ADD32ri $eax, 129, implicit-def $eflags
686 $eax = LEA64_32r killed $rax, 1, killed $rbp, 129, $noreg
691 name: test1mov1add_rbp_64_32
693 exposesReturnsTwice: false
695 regBankSelected: false
697 tracksRegLiveness: true
702 isFrameAddressTaken: false
703 isReturnAddressTaken: false
712 hasOpaqueSPAdjustment: false
714 hasMustTailInVarArgFunc: false
717 liveins: $rax, $rbp, $rbx
719 ; CHECK-LABEL: name: test1mov1add_rbp_64_32
720 ; CHECK: liveins: $rax, $rbp, $rbx
721 ; CHECK: $ebx = LEA64_32r killed $rbp, 1, killed $rbp, 0, $noreg
723 $ebx = LEA64_32r killed $rbp, 1, killed $rbp, 0, $noreg
728 name: testleaadd_rbp_index_64_32
730 exposesReturnsTwice: false
732 regBankSelected: false
734 tracksRegLiveness: true
739 isFrameAddressTaken: false
740 isReturnAddressTaken: false
749 hasOpaqueSPAdjustment: false
751 hasMustTailInVarArgFunc: false
754 liveins: $rax, $rbp, $rbx
756 ; CHECK-LABEL: name: testleaadd_rbp_index_64_32
757 ; CHECK: liveins: $rax, $rbp, $rbx
758 ; CHECK: $ebx = LEA64_32r killed $rbp, 1, killed $rbp, 5, $noreg
760 $ebx = LEA64_32r killed $rbp, 1, killed $rbp, 5, $noreg
765 name: testleaadd_rbp_index2_64_32
767 exposesReturnsTwice: false
769 regBankSelected: false
771 tracksRegLiveness: true
776 isFrameAddressTaken: false
777 isReturnAddressTaken: false
786 hasOpaqueSPAdjustment: false
788 hasMustTailInVarArgFunc: false
791 liveins: $eax, $ebp, $ebx
793 ; CHECK-LABEL: name: testleaadd_rbp_index2_64_32
794 ; CHECK: liveins: $eax, $ebp, $ebx
795 ; CHECK: $ebx = LEA64_32r killed $rbp, 4, killed $rbp, 5, $noreg
797 $ebx = LEA64_32r killed $rbp, 4, killed $rbp, 5, $noreg
804 exposesReturnsTwice: false
806 regBankSelected: false
808 tracksRegLiveness: true
813 isFrameAddressTaken: false
814 isReturnAddressTaken: false
823 hasOpaqueSPAdjustment: false
825 hasMustTailInVarArgFunc: false
830 ; CHECK-LABEL: name: test2addi32_64
831 ; CHECK: liveins: $rax, $rbp
832 ; CHECK: $rax = ADD64rr $rax, $rbp, implicit-def $eflags
833 ; CHECK: $rax = ADD64ri32 $rax, 129, implicit-def $eflags
835 $rax = LEA64r killed $rax, 1, killed $rbp, 129, $noreg
840 name: test1mov1add_rbp_64
842 exposesReturnsTwice: false
844 regBankSelected: false
846 tracksRegLiveness: true
851 isFrameAddressTaken: false
852 isReturnAddressTaken: false
861 hasOpaqueSPAdjustment: false
863 hasMustTailInVarArgFunc: false
866 liveins: $rax, $rbp, $rbx
868 ; CHECK-LABEL: name: test1mov1add_rbp_64
869 ; CHECK: liveins: $rax, $rbp, $rbx
870 ; CHECK: $rbx = MOV64rr $rbp
871 ; CHECK: $rbx = ADD64rr $rbx, $rbp, implicit-def $eflags
872 ; CHECK: $rbx = LEA64r killed $rbp, 1, $rbp, 0, $noreg
874 $rbx = LEA64r killed $rbp, 1, $rbp, 0, $noreg
879 name: testleaadd_rbp_index_64
881 exposesReturnsTwice: false
883 regBankSelected: false
885 tracksRegLiveness: true
890 isFrameAddressTaken: false
891 isReturnAddressTaken: false
900 hasOpaqueSPAdjustment: false
902 hasMustTailInVarArgFunc: false
905 liveins: $rax, $rbp, $rbx
907 ; CHECK-LABEL: name: testleaadd_rbp_index_64
908 ; CHECK: liveins: $rax, $rbp, $rbx
909 ; CHECK: $rbx = LEA64r $noreg, 1, $rbp, 5, $noreg
910 ; CHECK: $rbx = ADD64rr $rbx, $rbp, implicit-def $eflags
912 $rbx = LEA64r $rbp, 1, $rbp, 5, $noreg
917 name: testleaadd_rbp_index2_64
919 exposesReturnsTwice: false
921 regBankSelected: false
923 tracksRegLiveness: true
928 isFrameAddressTaken: false
929 isReturnAddressTaken: false
938 hasOpaqueSPAdjustment: false
940 hasMustTailInVarArgFunc: false
943 liveins: $rax, $rbp, $rbx
945 ; CHECK-LABEL: name: testleaadd_rbp_index2_64
946 ; CHECK: liveins: $rax, $rbp, $rbx
947 ; CHECK: $rbx = LEA64r $noreg, 4, $rbp, 5, $noreg
948 ; CHECK: $rbx = ADD64rr $rbx, $rbp, implicit-def $eflags
950 $rbx = LEA64r $rbp, 4, $rbp, 5, $noreg
955 name: test_skip_opt_64
957 exposesReturnsTwice: false
959 regBankSelected: false
961 tracksRegLiveness: true
966 isFrameAddressTaken: false
967 isReturnAddressTaken: false
976 hasOpaqueSPAdjustment: false
978 hasMustTailInVarArgFunc: false
981 liveins: $rax, $rbp, $rbx
983 ; CHECK-LABEL: name: test_skip_opt_64
984 ; CHECK: liveins: $rax, $rbp, $rbx
985 ; CHECK: $rbp = LEA64r killed $rbp, 4, killed $rbp, 0, $noreg
987 $rbp = LEA64r killed $rbp, 4, killed $rbp, 0, $noreg
992 name: test_skip_eflags_64
994 exposesReturnsTwice: false
996 regBankSelected: false
998 tracksRegLiveness: true
1003 isFrameAddressTaken: false
1004 isReturnAddressTaken: false
1006 hasPatchPoint: false
1013 hasOpaqueSPAdjustment: false
1015 hasMustTailInVarArgFunc: false
1017 ; CHECK-LABEL: name: test_skip_eflags_64
1018 ; CHECK: bb.0 (%ir-block.0):
1019 ; CHECK: successors: %bb.1(0x80000000)
1020 ; CHECK: liveins: $rax, $rbp, $rbx
1021 ; CHECK: CMP64rr $rax, killed $rbx, implicit-def $eflags
1022 ; CHECK: $rbx = LEA64r killed $rax, 4, killed $rax, 5, $noreg
1023 ; CHECK: JCC_1 %bb.1, 4, implicit $eflags
1026 ; CHECK: liveins: $rax, $rbp, $rbx
1027 ; CHECK: $rbp = LEA64r killed $rbx, 4, killed $rbx, 0, $noreg
1028 ; CHECK: $rbp = ADD64ri8 $rbp, 5, implicit-def $eflags
1031 liveins: $rax, $rbp, $rbx
1033 CMP64rr $rax, killed $rbx, implicit-def $eflags
1034 $rbx = LEA64r killed $rax, 4, killed $rax, 5, $noreg
1035 JCC_1 %bb.1, 4, implicit $eflags
1038 liveins: $rax, $rbp, $rbx
1039 $rbp = LEA64r killed $rbx, 4, killed $rbx, 5, $noreg
1044 name: test_skip_opt_64_32
1046 exposesReturnsTwice: false
1048 regBankSelected: false
1050 tracksRegLiveness: true
1055 isFrameAddressTaken: false
1056 isReturnAddressTaken: false
1058 hasPatchPoint: false
1065 hasOpaqueSPAdjustment: false
1067 hasMustTailInVarArgFunc: false
1070 liveins: $rax, $rbp, $rbx
1072 ; CHECK-LABEL: name: test_skip_opt_64_32
1073 ; CHECK: liveins: $rax, $rbp, $rbx
1074 ; CHECK: $ebp = LEA64_32r killed $rbp, 4, killed $rbp, 0, $noreg
1076 $ebp = LEA64_32r killed $rbp, 4, killed $rbp, 0, $noreg
1081 name: test_skip_eflags_64_32
1083 exposesReturnsTwice: false
1085 regBankSelected: false
1087 tracksRegLiveness: true
1092 isFrameAddressTaken: false
1093 isReturnAddressTaken: false
1095 hasPatchPoint: false
1102 hasOpaqueSPAdjustment: false
1104 hasMustTailInVarArgFunc: false
1106 ; CHECK-LABEL: name: test_skip_eflags_64_32
1107 ; CHECK: bb.0 (%ir-block.0):
1108 ; CHECK: successors: %bb.1(0x80000000)
1109 ; CHECK: liveins: $rax, $rbp, $rbx
1110 ; CHECK: CMP64rr $rax, killed $rbx, implicit-def $eflags
1111 ; CHECK: $ebx = LEA64_32r killed $rax, 4, killed $rax, 5, $noreg
1112 ; CHECK: JCC_1 %bb.1, 4, implicit $eflags
1115 ; CHECK: liveins: $rax, $rbp, $rbx
1116 ; CHECK: $ebp = LEA64_32r killed $rbx, 4, killed $rbx, 0, $noreg
1117 ; CHECK: $ebp = ADD32ri8 $ebp, 5, implicit-def $eflags
1120 liveins: $rax, $rbp, $rbx
1122 CMP64rr $rax, killed $rbx, implicit-def $eflags
1123 $ebx = LEA64_32r killed $rax, 4, killed $rax, 5, $noreg
1124 JCC_1 %bb.1, 4, implicit $eflags
1127 liveins: $rax, $rbp, $rbx
1128 $ebp = LEA64_32r killed $rbx, 4, killed $rbx, 5, $noreg