552 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -run-pass x86-fixup-LEAs -mtriple=i386 -verify-machineinstrs -mcpu=corei7-avx -o - %s | FileCheck %s3--- |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.mir9 10 ;test2add_32: 3 operands LEA32r that can be replaced with 2 add instructions11 ; where ADD32ri is chosen12 define i32 @test2add_32() {13 ret i32 014 }15 16 ;test2add_ebp_32: 3 operands LEA32r that can be replaced with 2 add instructions17 ; where the base is rbp/r13/ebp register18 define i32 @test2add_ebp_32() {19 ret i32 020 }21 22 ;test1add_ebp_32: 2 operands LEA32r where base register is ebp and can be replaced23 ; with an add instruction24 define i32 @test1add_ebp_32() {25 ret i32 026 }27 28 ;testleaadd_32: 3 operands LEA32r that can be replaced with 1 lea 1 add instructions29 define i32 @testleaadd_32() {30 ret i32 031 }32 33 ;testleaadd_ebp_32: 3 operands LEA32r that can be replaced with 1 lea 1 add instructions34 ; where the base is ebp register35 define i32 @testleaadd_ebp_32() {36 ret i32 037 }38 39 ;test1lea_ebp_32: 2 operands LEA32r wher base register is rbp/r13/ebp and can be replaced40 ; with a lea instruction41 define i32 @test1lea_ebp_32() {42 ret i32 043 }44 45 ;test2addi32_32: 3 operands LEA32r that can be replaced with 2 add instructions where ADD32ri3246 ; is chosen47 define i32 @test2addi32_32() {48 ret i32 049 }50 51 ;test_leab_ebp_leais_32: 2 operands LEA32r that can be replaced with LEA_IS form52 ; where the base is rbp/r13/ebp register53 define i32 @test_leab_ebp_leais_32() {54 ret i32 055 }56 57 ;test_leabi_ebp_leais_32: 3 operands LEA32r that can be replaced with LEA_IS form58 ; where the base and the index are ebp register and there is offset59 define i32 @test_leabi_ebp_leais_32() {60 ret i32 061 }62 63 ;testleaadd_ebp_index2_32: 3 operands LEA32r that can be replaced with 1 lea 1 add instructions64 ; where the base and the index are ebp register and there is scale65 define i32 @testleaadd_ebp_index2_32() {66 ret i32 067 }68 69 ;test_skip_opt_32: 3 operands LEA32r that can not be replaced with 2 instructions70 define i32 @test_skip_opt_32() {71 ret i32 072 }73 74 ;test_skip_eflags_32: LEA32r that cannot be replaced since its not safe to clobber eflags75 define i32 @test_skip_eflags_32() {76 ret i32 077 }78 79...80---81name: test2add_3282alignment: 1683exposesReturnsTwice: false84legalized: false85regBankSelected: false86selected: false87tracksRegLiveness: true88liveins:89 - { reg: '$eax' }90 - { reg: '$ebp' }91frameInfo:92 isFrameAddressTaken: false93 isReturnAddressTaken: false94 hasStackMap: false95 hasPatchPoint: false96 stackSize: 097 offsetAdjustment: 098 maxAlignment: 099 adjustsStack: false100 hasCalls: false101 maxCallFrameSize: 0102 hasOpaqueSPAdjustment: false103 hasVAStart: false104 hasMustTailInVarArgFunc: false105body: |106 bb.0 (%ir-block.0):107 liveins: $eax, $ebp108 109 ; CHECK-LABEL: name: test2add_32110 ; CHECK: liveins: $eax, $ebp111 ; CHECK: $eax = ADD32rr $eax, $ebp, implicit-def $eflags112 ; CHECK: $eax = ADD32ri $eax, -5, implicit-def $eflags113 ; CHECK: RET64 $eax114 $eax = LEA32r killed $eax, 1, killed $ebp, -5, $noreg115 RET64 $eax116 117...118---119name: test2add_ebp_32120alignment: 16121exposesReturnsTwice: false122legalized: false123regBankSelected: false124selected: false125tracksRegLiveness: true126liveins:127 - { reg: '$eax' }128 - { reg: '$ebp' }129frameInfo:130 isFrameAddressTaken: false131 isReturnAddressTaken: false132 hasStackMap: false133 hasPatchPoint: false134 stackSize: 0135 offsetAdjustment: 0136 maxAlignment: 0137 adjustsStack: false138 hasCalls: false139 maxCallFrameSize: 0140 hasOpaqueSPAdjustment: false141 hasVAStart: false142 hasMustTailInVarArgFunc: false143body: |144 bb.0 (%ir-block.0):145 liveins: $eax, $ebp146 147 ; CHECK-LABEL: name: test2add_ebp_32148 ; CHECK: liveins: $eax, $ebp149 ; CHECK: $ebp = ADD32rr $ebp, $eax, implicit-def $eflags150 ; CHECK: $ebp = ADD32ri $ebp, -5, implicit-def $eflags151 ; CHECK: RET64 $ebp152 $ebp = LEA32r killed $ebp, 1, killed $eax, -5, $noreg153 RET64 $ebp154 155...156---157name: test1add_ebp_32158alignment: 16159exposesReturnsTwice: false160legalized: false161regBankSelected: false162selected: false163tracksRegLiveness: true164liveins:165 - { reg: '$eax' }166 - { reg: '$ebp' }167frameInfo:168 isFrameAddressTaken: false169 isReturnAddressTaken: false170 hasStackMap: false171 hasPatchPoint: false172 stackSize: 0173 offsetAdjustment: 0174 maxAlignment: 0175 adjustsStack: false176 hasCalls: false177 maxCallFrameSize: 0178 hasOpaqueSPAdjustment: false179 hasVAStart: false180 hasMustTailInVarArgFunc: false181body: |182 bb.0 (%ir-block.0):183 liveins: $eax, $ebp184 185 ; CHECK-LABEL: name: test1add_ebp_32186 ; CHECK: liveins: $eax, $ebp187 ; CHECK: $ebp = ADD32rr $ebp, $eax, implicit-def $eflags188 ; CHECK: RET64 $ebp189 $ebp = LEA32r killed $ebp, 1, killed $eax, 0, $noreg190 RET64 $ebp191 192...193---194name: testleaadd_32195alignment: 16196exposesReturnsTwice: false197legalized: false198regBankSelected: false199selected: false200tracksRegLiveness: true201liveins:202 - { reg: '$eax' }203 - { reg: '$ebp' }204 - { reg: '$ebx' }205frameInfo:206 isFrameAddressTaken: false207 isReturnAddressTaken: false208 hasStackMap: false209 hasPatchPoint: false210 stackSize: 0211 offsetAdjustment: 0212 maxAlignment: 0213 adjustsStack: false214 hasCalls: false215 maxCallFrameSize: 0216 hasOpaqueSPAdjustment: false217 hasVAStart: false218 hasMustTailInVarArgFunc: false219body: |220 bb.0 (%ir-block.0):221 liveins: $eax, $ebp, $esi222 223 ; CHECK-LABEL: name: testleaadd_32224 ; CHECK: liveins: $eax, $ebp, $esi225 ; CHECK: $ebx = LEA32r killed $eax, 1, killed $ebp, 0, $noreg226 ; CHECK: $ebx = ADD32ri $ebx, -5, implicit-def $eflags227 ; CHECK: RET64 $ebx228 $ebx = LEA32r killed $eax, 1, killed $ebp, -5, $noreg229 RET64 $ebx230 231...232---233name: testleaadd_ebp_32234alignment: 16235exposesReturnsTwice: false236legalized: false237regBankSelected: false238selected: false239tracksRegLiveness: true240liveins:241 - { reg: '$eax' }242 - { reg: '$ebp' }243 - { reg: '$ebx' }244frameInfo:245 isFrameAddressTaken: false246 isReturnAddressTaken: false247 hasStackMap: false248 hasPatchPoint: false249 stackSize: 0250 offsetAdjustment: 0251 maxAlignment: 0252 adjustsStack: false253 hasCalls: false254 maxCallFrameSize: 0255 hasOpaqueSPAdjustment: false256 hasVAStart: false257 hasMustTailInVarArgFunc: false258body: |259 bb.0 (%ir-block.0):260 liveins: $eax, $ebp261 262 ; CHECK-LABEL: name: testleaadd_ebp_32263 ; CHECK: liveins: $eax, $ebp264 ; CHECK: $ebx = LEA32r killed $eax, 1, killed $ebp, 0, $noreg265 ; CHECK: $ebx = ADD32ri $ebx, -5, implicit-def $eflags266 ; CHECK: RET64 $ebx267 $ebx = LEA32r killed $ebp, 1, killed $eax, -5, $noreg268 RET64 $ebx269 270...271---272name: test1lea_ebp_32273alignment: 16274exposesReturnsTwice: false275legalized: false276regBankSelected: false277selected: false278tracksRegLiveness: true279liveins:280 - { reg: '$eax' }281 - { reg: '$ebp' }282 - { reg: '$ebx' }283frameInfo:284 isFrameAddressTaken: false285 isReturnAddressTaken: false286 hasStackMap: false287 hasPatchPoint: false288 stackSize: 0289 offsetAdjustment: 0290 maxAlignment: 0291 adjustsStack: false292 hasCalls: false293 maxCallFrameSize: 0294 hasOpaqueSPAdjustment: false295 hasVAStart: false296 hasMustTailInVarArgFunc: false297body: |298 bb.0 (%ir-block.0):299 liveins: $eax, $ebp300 301 ; CHECK-LABEL: name: test1lea_ebp_32302 ; CHECK: liveins: $eax, $ebp303 ; CHECK: $ebx = LEA32r killed $eax, 1, killed $ebp, 0, $noreg304 ; CHECK: RET64 $ebx305 $ebx = LEA32r killed $ebp, 1, killed $eax, 0, $noreg306 RET64 $ebx307 308...309---310name: test2addi32_32311alignment: 16312exposesReturnsTwice: false313legalized: false314regBankSelected: false315selected: false316tracksRegLiveness: true317liveins:318 - { reg: '$eax' }319 - { reg: '$ebp' }320frameInfo:321 isFrameAddressTaken: false322 isReturnAddressTaken: false323 hasStackMap: false324 hasPatchPoint: false325 stackSize: 0326 offsetAdjustment: 0327 maxAlignment: 0328 adjustsStack: false329 hasCalls: false330 maxCallFrameSize: 0331 hasOpaqueSPAdjustment: false332 hasVAStart: false333 hasMustTailInVarArgFunc: false334body: |335 bb.0 (%ir-block.0):336 liveins: $eax, $ebp337 338 ; CHECK-LABEL: name: test2addi32_32339 ; CHECK: liveins: $eax, $ebp340 ; CHECK: $eax = ADD32rr $eax, $ebp, implicit-def $eflags341 ; CHECK: $eax = ADD32ri $eax, 129, implicit-def $eflags342 ; CHECK: RET64 $eax343 $eax = LEA32r killed $eax, 1, killed $ebp, 129, $noreg344 RET64 $eax345 346...347---348name: test_leab_ebp_leais_32349alignment: 16350exposesReturnsTwice: false351legalized: false352regBankSelected: false353selected: false354tracksRegLiveness: true355liveins:356 - { reg: '$eax' }357 - { reg: '$ebx' }358 - { reg: '$ebp' }359frameInfo:360 isFrameAddressTaken: false361 isReturnAddressTaken: false362 hasStackMap: false363 hasPatchPoint: false364 stackSize: 0365 offsetAdjustment: 0366 maxAlignment: 0367 adjustsStack: false368 hasCalls: false369 maxCallFrameSize: 0370 hasOpaqueSPAdjustment: false371 hasVAStart: false372 hasMustTailInVarArgFunc: false373body: |374 bb.0 (%ir-block.0):375 liveins: $eax, $ebp, $ebx376 377 ; CHECK-LABEL: name: test_leab_ebp_leais_32378 ; CHECK: liveins: $eax, $ebp, $ebx379 ; CHECK: $ebx = LEA32r $noreg, 2, $ebp, 0, $noreg380 ; CHECK: RET64 $ebx381 $ebx = LEA32r killed $ebp, 1, $ebp, 0, $noreg382 RET64 $ebx383 384...385---386name: test_leabi_ebp_leais_32387alignment: 16388exposesReturnsTwice: false389legalized: false390regBankSelected: false391selected: false392tracksRegLiveness: true393liveins:394 - { reg: '$ebx' }395 - { reg: '$ebp' }396frameInfo:397 isFrameAddressTaken: false398 isReturnAddressTaken: false399 hasStackMap: false400 hasPatchPoint: false401 stackSize: 0402 offsetAdjustment: 0403 maxAlignment: 0404 adjustsStack: false405 hasCalls: false406 maxCallFrameSize: 0407 hasOpaqueSPAdjustment: false408 hasVAStart: false409 hasMustTailInVarArgFunc: false410body: |411 bb.0 (%ir-block.0):412 liveins: $eax, $ebp, $ebx413 414 ; CHECK-LABEL: name: test_leabi_ebp_leais_32415 ; CHECK: liveins: $eax, $ebp, $ebx416 ; CHECK: $ebx = LEA32r $noreg, 2, $ebp, 5, $noreg417 ; CHECK: RET64 $ebx418 $ebx = LEA32r $ebp, 1, $ebp, 5, $noreg419 RET64 $ebx420 421...422---423name: testleaadd_ebp_index2_32424alignment: 16425exposesReturnsTwice: false426legalized: false427regBankSelected: false428selected: false429tracksRegLiveness: true430liveins:431 - { reg: '$ebx' }432 - { reg: '$ebp' }433frameInfo:434 isFrameAddressTaken: false435 isReturnAddressTaken: false436 hasStackMap: false437 hasPatchPoint: false438 stackSize: 0439 offsetAdjustment: 0440 maxAlignment: 0441 adjustsStack: false442 hasCalls: false443 maxCallFrameSize: 0444 hasOpaqueSPAdjustment: false445 hasVAStart: false446 hasMustTailInVarArgFunc: false447body: |448 bb.0 (%ir-block.0):449 liveins: $eax, $ebp, $ebx450 451 ; CHECK-LABEL: name: testleaadd_ebp_index2_32452 ; CHECK: liveins: $eax, $ebp, $ebx453 ; CHECK: $ebx = LEA32r $noreg, 4, $ebp, 5, $noreg454 ; CHECK: $ebx = ADD32rr $ebx, $ebp, implicit-def $eflags455 ; CHECK: RET64 $ebx456 $ebx = LEA32r $ebp, 4, $ebp, 5, $noreg457 RET64 $ebx458 459...460---461name: test_skip_opt_32462alignment: 16463exposesReturnsTwice: false464legalized: false465regBankSelected: false466selected: false467tracksRegLiveness: true468liveins:469 - { reg: '$ebx' }470 - { reg: '$ebp' }471frameInfo:472 isFrameAddressTaken: false473 isReturnAddressTaken: false474 hasStackMap: false475 hasPatchPoint: false476 stackSize: 0477 offsetAdjustment: 0478 maxAlignment: 0479 adjustsStack: false480 hasCalls: false481 maxCallFrameSize: 0482 hasOpaqueSPAdjustment: false483 hasVAStart: false484 hasMustTailInVarArgFunc: false485body: |486 bb.0 (%ir-block.0):487 liveins: $eax, $ebp, $ebx488 489 ; CHECK-LABEL: name: test_skip_opt_32490 ; CHECK: liveins: $eax, $ebp, $ebx491 ; CHECK: $ebp = LEA32r killed $ebp, 4, killed $ebp, 0, $noreg492 ; CHECK: RET64 $ebp493 $ebp = LEA32r killed $ebp, 4, killed $ebp, 0, $noreg494 RET64 $ebp495 496...497---498name: test_skip_eflags_32499alignment: 16500exposesReturnsTwice: false501legalized: false502regBankSelected: false503selected: false504tracksRegLiveness: true505liveins:506 - { reg: '$ebp' }507 - { reg: '$eax' }508frameInfo:509 isFrameAddressTaken: false510 isReturnAddressTaken: false511 hasStackMap: false512 hasPatchPoint: false513 stackSize: 0514 offsetAdjustment: 0515 maxAlignment: 0516 adjustsStack: false517 hasCalls: false518 maxCallFrameSize: 0519 hasOpaqueSPAdjustment: false520 hasVAStart: false521 hasMustTailInVarArgFunc: false522body: |523 ; CHECK-LABEL: name: test_skip_eflags_32524 ; CHECK: bb.0 (%ir-block.0):525 ; CHECK: successors: %bb.1(0x80000000)526 ; CHECK: liveins: $eax, $ebp, $ebx527 ; CHECK: CMP32rr $eax, killed $ebx, implicit-def $eflags528 ; CHECK: $ebx = LEA32r killed $eax, 4, killed $eax, 5, $noreg529 ; CHECK: JCC_1 %bb.1, 4, implicit $eflags530 ; CHECK: RET64 $ebx531 ; CHECK: bb.1:532 ; CHECK: liveins: $eax, $ebp, $ebx533 ; CHECK: $ebp = LEA32r killed $ebx, 4, killed $ebx, 0, $noreg534 ; CHECK: $ebp = ADD32ri $ebp, 5, implicit-def $eflags535 ; CHECK: RET64 $ebp536 bb.0 (%ir-block.0):537 liveins: $eax, $ebp, $ebx538 539 CMP32rr $eax, killed $ebx, implicit-def $eflags540 $ebx = LEA32r killed $eax, 4, killed $eax, 5, $noreg541 JCC_1 %bb.1, 4, implicit $eflags542 RET64 $ebx543 bb.1:544 liveins: $eax, $ebp, $ebx545 $ebp = LEA32r killed $ebx, 4, killed $ebx, 5, $noreg546 RET64 $ebp547 548...549 550 551 552