|
| 1 | +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py |
| 2 | +# RUN: llc %s -o - -mtriple=x86_64-unknown-linux -enable-spill2reg -mattr=+sse4.1 --run-pass=spill2reg -simplify-mir -spill2reg-mem-instrs=0 -spill2reg-vec-instrs=99999 | FileCheck %s |
| 3 | + |
| 4 | +# Simple test with two overlapping spill-reload pairs. |
| 5 | +# spill stack.0 |
| 6 | +# spill stack.1 |
| 7 | +# reload stack.0 |
| 8 | +# reload stack.1 |
| 9 | + |
| 10 | +--- | |
| 11 | + @D0 = dso_local local_unnamed_addr global i32 0, align 4 |
| 12 | + @D1 = dso_local local_unnamed_addr global i32 0, align 4 |
| 13 | + @U0 = dso_local local_unnamed_addr global i32 0, align 4 |
| 14 | + @U1 = dso_local local_unnamed_addr global i32 0, align 4 |
| 15 | + define void @func() { ret void } |
| 16 | +... |
| 17 | +--- |
| 18 | +name: func |
| 19 | +alignment: 16 |
| 20 | +tracksRegLiveness: true |
| 21 | +tracksDebugUserValues: true |
| 22 | +frameInfo: |
| 23 | + maxAlignment: 4 |
| 24 | +stack: |
| 25 | + - { id: 0, type: spill-slot, size: 4, alignment: 4 } |
| 26 | + - { id: 1, type: spill-slot, size: 4, alignment: 4 } |
| 27 | +machineFunctionInfo: {} |
| 28 | +body: | |
| 29 | +
|
| 30 | + bb.0: |
| 31 | + ; CHECK-LABEL: name: func |
| 32 | + ; CHECK: $eax = MOV32rm $rip, 1, $noreg, @D0, $noreg :: (dereferenceable load (s32) from @D0) |
| 33 | + ; CHECK-NEXT: $xmm0 = MOVDI2PDIrr $eax |
| 34 | + ; CHECK-NEXT: $eax = MOV32rm $rip, 1, $noreg, @D1, $noreg :: (dereferenceable load (s32) from @D1) |
| 35 | + ; CHECK-NEXT: $xmm0 = MOVDI2PDIrr $eax |
| 36 | + ; CHECK-NEXT: $eax = MOVPDI2DIrr $xmm0 |
| 37 | + ; CHECK-NEXT: MOV32mr $rip, 1, $noreg, @U0, $noreg, killed renamable $eax :: (store (s32) into @U0) |
| 38 | + ; CHECK-NEXT: $eax = MOVPDI2DIrr $xmm0 |
| 39 | + ; CHECK-NEXT: MOV32mr $rip, 1, $noreg, @U1, $noreg, killed renamable $eax :: (store (s32) into @U1) |
| 40 | + ; CHECK-NEXT: RET 0 |
| 41 | + $eax = MOV32rm $rip, 1, $noreg, @D0, $noreg :: (dereferenceable load (s32) from @D0) |
| 42 | + MOV32mr %stack.0, 1, $noreg, 0, $noreg, killed renamable $eax :: (store (s32) into %stack.0) |
| 43 | + $eax = MOV32rm $rip, 1, $noreg, @D1, $noreg :: (dereferenceable load (s32) from @D1) |
| 44 | + MOV32mr %stack.1, 1, $noreg, 0, $noreg, killed renamable $eax :: (store (s32) into %stack.1) |
| 45 | +
|
| 46 | + $eax = MOV32rm %stack.0, 1, $noreg, 0, $noreg :: (load (s32) from %stack.0) |
| 47 | + MOV32mr $rip, 1, $noreg, @U0, $noreg, killed renamable $eax :: (store (s32) into @U0) |
| 48 | + $eax = MOV32rm %stack.1, 1, $noreg, 0, $noreg :: (load (s32) from %stack.1) |
| 49 | + MOV32mr $rip, 1, $noreg, @U1, $noreg, killed renamable $eax :: (store (s32) into @U1) |
| 50 | + RET 0 |
| 51 | +
|
| 52 | +... |
0 commit comments