1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -run-pass=prologepilog -simplify-mir -verify-machineinstrs %s -o - | FileCheck %s 3# 4# Test that prologepilog works for each of the LD1R instructions for stack-based objects. 5# 6--- | 7 define void @testcase_positive_offset() { 8 %dummy = alloca i64, align 8 9 %object = alloca i64, align 8 10 ; Reads from %object at offset 63 * readsize 11 ret void 12 } 13 define void @testcase_positive_offset_out_of_range() { 14 %dummy = alloca i64, align 8 15 %object = alloca i64, align 8 16 ; Reads from %object at offset 64 * readsize 17 ret void 18 } 19 define void @testcase_negative_offset_out_of_range() { 20 %dummy = alloca i64, align 8 21 %object = alloca i64, align 8 22 ; Reads from %object at offset -1 * readsize 23 ret void 24 } 25... 26--- 27name: testcase_positive_offset 28tracksRegLiveness: true 29stack: 30 - { id: 0, name: dummy, type: default, offset: 0, size: 8, alignment: 8 } 31 - { id: 1, name: object, type: default, offset: 0, size: 8, alignment: 8 } 32body: | 33 bb.0 (%ir-block.0): 34 liveins: $p0 35 36 ; CHECK-LABEL: name: testcase_positive_offset 37 ; CHECK: liveins: $p0 38 ; CHECK: $sp = frame-setup SUBXri $sp, 16, 0 39 ; CHECK: frame-setup CFI_INSTRUCTION def_cfa_offset <mcsymbol >16 40 ; CHECK: renamable $z0 = LD1RB_IMM renamable $p0, $sp, 63 :: (load (s8) from %ir.object, align 2) 41 ; CHECK: renamable $z0 = LD1RB_H_IMM renamable $p0, $sp, 63 :: (load (s8) from %ir.object, align 2) 42 ; CHECK: renamable $z0 = LD1RB_S_IMM renamable $p0, $sp, 63 :: (load (s8) from %ir.object, align 2) 43 ; CHECK: renamable $z0 = LD1RB_D_IMM renamable $p0, $sp, 63 :: (load (s8) from %ir.object, align 2) 44 ; CHECK: renamable $z0 = LD1RSB_H_IMM renamable $p0, $sp, 63 :: (load (s8) from %ir.object, align 2) 45 ; CHECK: renamable $z0 = LD1RSB_S_IMM renamable $p0, $sp, 63 :: (load (s8) from %ir.object, align 2) 46 ; CHECK: renamable $z0 = LD1RSB_D_IMM renamable $p0, $sp, 63 :: (load (s8) from %ir.object, align 2) 47 ; CHECK: renamable $z0 = LD1RH_IMM renamable $p0, $sp, 63 :: (load (s16) from %ir.object) 48 ; CHECK: renamable $z0 = LD1RH_S_IMM renamable $p0, $sp, 63 :: (load (s16) from %ir.object) 49 ; CHECK: renamable $z0 = LD1RH_D_IMM renamable $p0, $sp, 63 :: (load (s16) from %ir.object) 50 ; CHECK: renamable $z0 = LD1RSH_S_IMM renamable $p0, $sp, 63 :: (load (s16) from %ir.object) 51 ; CHECK: renamable $z0 = LD1RSH_D_IMM renamable $p0, $sp, 63 :: (load (s16) from %ir.object) 52 ; CHECK: renamable $z0 = LD1RW_IMM renamable $p0, $sp, 63 :: (load (s32) from %ir.object) 53 ; CHECK: renamable $z0 = LD1RW_D_IMM renamable $p0, $sp, 63 :: (load (s32) from %ir.object) 54 ; CHECK: renamable $z0 = LD1RSW_IMM renamable $p0, $sp, 63 :: (load (s32) from %ir.object) 55 ; CHECK: renamable $z0 = LD1RD_IMM renamable $p0, $sp, 63 :: (load (s64) from %ir.object) 56 ; CHECK: renamable $z0 = LD1RD_IMM renamable $p0, $sp, 63 :: (load (s64) from %ir.object) 57 ; CHECK: $sp = frame-destroy ADDXri $sp, 16, 0 58 ; CHECK: RET_ReallyLR implicit $z0 59 renamable $z0 = LD1RB_IMM renamable $p0, %stack.1.object, 63 :: (load 1 from %ir.object, align 2) 60 renamable $z0 = LD1RB_H_IMM renamable $p0, %stack.1.object, 63 :: (load 1 from %ir.object, align 2) 61 renamable $z0 = LD1RB_S_IMM renamable $p0, %stack.1.object, 63 :: (load 1 from %ir.object, align 2) 62 renamable $z0 = LD1RB_D_IMM renamable $p0, %stack.1.object, 63 :: (load 1 from %ir.object, align 2) 63 renamable $z0 = LD1RSB_H_IMM renamable $p0, %stack.1.object, 63 :: (load 1 from %ir.object, align 2) 64 renamable $z0 = LD1RSB_S_IMM renamable $p0, %stack.1.object, 63 :: (load 1 from %ir.object, align 2) 65 renamable $z0 = LD1RSB_D_IMM renamable $p0, %stack.1.object, 63 :: (load 1 from %ir.object, align 2) 66 renamable $z0 = LD1RH_IMM renamable $p0, %stack.1.object, 63 :: (load 2 from %ir.object, align 2) 67 renamable $z0 = LD1RH_S_IMM renamable $p0, %stack.1.object, 63 :: (load 2 from %ir.object, align 2) 68 renamable $z0 = LD1RH_D_IMM renamable $p0, %stack.1.object, 63 :: (load 2 from %ir.object, align 2) 69 renamable $z0 = LD1RSH_S_IMM renamable $p0, %stack.1.object, 63 :: (load 2 from %ir.object, align 2) 70 renamable $z0 = LD1RSH_D_IMM renamable $p0, %stack.1.object, 63 :: (load 2 from %ir.object, align 2) 71 renamable $z0 = LD1RW_IMM renamable $p0, %stack.1.object, 63 :: (load 4 from %ir.object, align 4) 72 renamable $z0 = LD1RW_D_IMM renamable $p0, %stack.1.object, 63 :: (load 4 from %ir.object, align 4) 73 renamable $z0 = LD1RSW_IMM renamable $p0, %stack.1.object, 63 :: (load 4 from %ir.object, align 4) 74 renamable $z0 = LD1RD_IMM renamable $p0, %stack.1.object, 63 :: (load 8 from %ir.object, align 8) 75 renamable $z0 = LD1RD_IMM renamable $p0, %stack.1.object, 63 :: (load 8 from %ir.object, align 8) 76 RET_ReallyLR implicit $z0 77... 78--- 79name: testcase_positive_offset_out_of_range 80tracksRegLiveness: true 81stack: 82 - { id: 0, name: dummy, type: default, offset: 0, size: 8, alignment: 8 } 83 - { id: 1, name: object, type: default, offset: 0, size: 8, alignment: 8 } 84body: | 85 bb.0 (%ir-block.0): 86 liveins: $p0 87 88 ; CHECK-LABEL: name: testcase_positive_offset_out_of_range 89 ; CHECK: liveins: $p0 90 ; CHECK: $sp = frame-setup SUBXri $sp, 16, 0 91 ; CHECK: frame-setup CFI_INSTRUCTION def_cfa_offset <mcsymbol >16 92 ; CHECK: $x8 = ADDXri $sp, 1, 0 93 ; CHECK: renamable $z0 = LD1RB_IMM renamable $p0, killed $x8, 63 :: (load (s8) from %ir.object, align 2) 94 ; CHECK: $x8 = ADDXri $sp, 1, 0 95 ; CHECK: renamable $z0 = LD1RB_H_IMM renamable $p0, killed $x8, 63 :: (load (s8) from %ir.object, align 2) 96 ; CHECK: $x8 = ADDXri $sp, 1, 0 97 ; CHECK: renamable $z0 = LD1RB_S_IMM renamable $p0, killed $x8, 63 :: (load (s8) from %ir.object, align 2) 98 ; CHECK: $x8 = ADDXri $sp, 1, 0 99 ; CHECK: renamable $z0 = LD1RB_D_IMM renamable $p0, killed $x8, 63 :: (load (s8) from %ir.object, align 2) 100 ; CHECK: $x8 = ADDXri $sp, 1, 0 101 ; CHECK: renamable $z0 = LD1RSB_H_IMM renamable $p0, killed $x8, 63 :: (load (s8) from %ir.object, align 2) 102 ; CHECK: $x8 = ADDXri $sp, 1, 0 103 ; CHECK: renamable $z0 = LD1RSB_S_IMM renamable $p0, killed $x8, 63 :: (load (s8) from %ir.object, align 2) 104 ; CHECK: $x8 = ADDXri $sp, 1, 0 105 ; CHECK: renamable $z0 = LD1RSB_D_IMM renamable $p0, killed $x8, 63 :: (load (s8) from %ir.object, align 2) 106 ; CHECK: $x8 = ADDXri $sp, 2, 0 107 ; CHECK: renamable $z0 = LD1RH_IMM renamable $p0, killed $x8, 63 :: (load (s16) from %ir.object) 108 ; CHECK: $x8 = ADDXri $sp, 2, 0 109 ; CHECK: renamable $z0 = LD1RH_S_IMM renamable $p0, killed $x8, 63 :: (load (s16) from %ir.object) 110 ; CHECK: $x8 = ADDXri $sp, 2, 0 111 ; CHECK: renamable $z0 = LD1RH_D_IMM renamable $p0, killed $x8, 63 :: (load (s16) from %ir.object) 112 ; CHECK: $x8 = ADDXri $sp, 2, 0 113 ; CHECK: renamable $z0 = LD1RSH_S_IMM renamable $p0, killed $x8, 63 :: (load (s16) from %ir.object) 114 ; CHECK: $x8 = ADDXri $sp, 2, 0 115 ; CHECK: renamable $z0 = LD1RSH_D_IMM renamable $p0, killed $x8, 63 :: (load (s16) from %ir.object) 116 ; CHECK: $x8 = ADDXri $sp, 4, 0 117 ; CHECK: renamable $z0 = LD1RW_IMM renamable $p0, killed $x8, 63 :: (load (s32) from %ir.object) 118 ; CHECK: $x8 = ADDXri $sp, 4, 0 119 ; CHECK: renamable $z0 = LD1RW_D_IMM renamable $p0, killed $x8, 63 :: (load (s32) from %ir.object) 120 ; CHECK: $x8 = ADDXri $sp, 4, 0 121 ; CHECK: renamable $z0 = LD1RSW_IMM renamable $p0, killed $x8, 63 :: (load (s32) from %ir.object) 122 ; CHECK: $x8 = ADDXri $sp, 8, 0 123 ; CHECK: renamable $z0 = LD1RD_IMM renamable $p0, killed $x8, 63 :: (load (s64) from %ir.object) 124 ; CHECK: $x8 = ADDXri $sp, 8, 0 125 ; CHECK: renamable $z0 = LD1RD_IMM renamable $p0, killed $x8, 63 :: (load (s64) from %ir.object) 126 ; CHECK: $sp = frame-destroy ADDXri $sp, 16, 0 127 ; CHECK: RET_ReallyLR implicit $z0 128 renamable $z0 = LD1RB_IMM renamable $p0, %stack.1.object, 64 :: (load 1 from %ir.object, align 2) 129 renamable $z0 = LD1RB_H_IMM renamable $p0, %stack.1.object, 64 :: (load 1 from %ir.object, align 2) 130 renamable $z0 = LD1RB_S_IMM renamable $p0, %stack.1.object, 64 :: (load 1 from %ir.object, align 2) 131 renamable $z0 = LD1RB_D_IMM renamable $p0, %stack.1.object, 64 :: (load 1 from %ir.object, align 2) 132 renamable $z0 = LD1RSB_H_IMM renamable $p0, %stack.1.object, 64 :: (load 1 from %ir.object, align 2) 133 renamable $z0 = LD1RSB_S_IMM renamable $p0, %stack.1.object, 64 :: (load 1 from %ir.object, align 2) 134 renamable $z0 = LD1RSB_D_IMM renamable $p0, %stack.1.object, 64 :: (load 1 from %ir.object, align 2) 135 renamable $z0 = LD1RH_IMM renamable $p0, %stack.1.object, 64 :: (load 2 from %ir.object, align 2) 136 renamable $z0 = LD1RH_S_IMM renamable $p0, %stack.1.object, 64 :: (load 2 from %ir.object, align 2) 137 renamable $z0 = LD1RH_D_IMM renamable $p0, %stack.1.object, 64 :: (load 2 from %ir.object, align 2) 138 renamable $z0 = LD1RSH_S_IMM renamable $p0, %stack.1.object, 64 :: (load 2 from %ir.object, align 2) 139 renamable $z0 = LD1RSH_D_IMM renamable $p0, %stack.1.object, 64 :: (load 2 from %ir.object, align 2) 140 renamable $z0 = LD1RW_IMM renamable $p0, %stack.1.object, 64 :: (load 4 from %ir.object, align 4) 141 renamable $z0 = LD1RW_D_IMM renamable $p0, %stack.1.object, 64 :: (load 4 from %ir.object, align 4) 142 renamable $z0 = LD1RSW_IMM renamable $p0, %stack.1.object, 64 :: (load 4 from %ir.object, align 4) 143 renamable $z0 = LD1RD_IMM renamable $p0, %stack.1.object, 64 :: (load 8 from %ir.object, align 8) 144 renamable $z0 = LD1RD_IMM renamable $p0, %stack.1.object, 64 :: (load 8 from %ir.object, align 8) 145 RET_ReallyLR implicit $z0 146... 147 148... 149--- 150name: testcase_negative_offset_out_of_range 151tracksRegLiveness: true 152stack: 153 - { id: 0, name: dummy, type: default, offset: 0, size: 8, alignment: 8 } 154 - { id: 1, name: object, type: default, offset: 0, size: 8, alignment: 8 } 155body: | 156 bb.0 (%ir-block.0): 157 liveins: $p0 158 159 ; CHECK-LABEL: name: testcase_negative_offset_out_of_range 160 ; CHECK: liveins: $p0 161 ; CHECK: $sp = frame-setup SUBXri $sp, 16, 0 162 ; CHECK: frame-setup CFI_INSTRUCTION def_cfa_offset <mcsymbol >16 163 ; CHECK: $x8 = SUBXri $sp, 1, 0 164 ; CHECK: renamable $z0 = LD1RB_IMM renamable $p0, killed $x8, 0 :: (load (s8) from %ir.object, align 2) 165 ; CHECK: $x8 = SUBXri $sp, 1, 0 166 ; CHECK: renamable $z0 = LD1RB_H_IMM renamable $p0, killed $x8, 0 :: (load (s8) from %ir.object, align 2) 167 ; CHECK: $x8 = SUBXri $sp, 1, 0 168 ; CHECK: renamable $z0 = LD1RB_S_IMM renamable $p0, killed $x8, 0 :: (load (s8) from %ir.object, align 2) 169 ; CHECK: $x8 = SUBXri $sp, 1, 0 170 ; CHECK: renamable $z0 = LD1RB_D_IMM renamable $p0, killed $x8, 0 :: (load (s8) from %ir.object, align 2) 171 ; CHECK: $x8 = SUBXri $sp, 1, 0 172 ; CHECK: renamable $z0 = LD1RSB_H_IMM renamable $p0, killed $x8, 0 :: (load (s8) from %ir.object, align 2) 173 ; CHECK: $x8 = SUBXri $sp, 1, 0 174 ; CHECK: renamable $z0 = LD1RSB_S_IMM renamable $p0, killed $x8, 0 :: (load (s8) from %ir.object, align 2) 175 ; CHECK: $x8 = SUBXri $sp, 1, 0 176 ; CHECK: renamable $z0 = LD1RSB_D_IMM renamable $p0, killed $x8, 0 :: (load (s8) from %ir.object, align 2) 177 ; CHECK: $x8 = SUBXri $sp, 2, 0 178 ; CHECK: renamable $z0 = LD1RH_IMM renamable $p0, killed $x8, 0 :: (load (s16) from %ir.object) 179 ; CHECK: $x8 = SUBXri $sp, 2, 0 180 ; CHECK: renamable $z0 = LD1RH_S_IMM renamable $p0, killed $x8, 0 :: (load (s16) from %ir.object) 181 ; CHECK: $x8 = SUBXri $sp, 2, 0 182 ; CHECK: renamable $z0 = LD1RH_D_IMM renamable $p0, killed $x8, 0 :: (load (s16) from %ir.object) 183 ; CHECK: $x8 = SUBXri $sp, 2, 0 184 ; CHECK: renamable $z0 = LD1RSH_S_IMM renamable $p0, killed $x8, 0 :: (load (s16) from %ir.object) 185 ; CHECK: $x8 = SUBXri $sp, 2, 0 186 ; CHECK: renamable $z0 = LD1RSH_D_IMM renamable $p0, killed $x8, 0 :: (load (s16) from %ir.object) 187 ; CHECK: $x8 = SUBXri $sp, 4, 0 188 ; CHECK: renamable $z0 = LD1RW_IMM renamable $p0, killed $x8, 0 :: (load (s32) from %ir.object) 189 ; CHECK: $x8 = SUBXri $sp, 4, 0 190 ; CHECK: renamable $z0 = LD1RW_D_IMM renamable $p0, killed $x8, 0 :: (load (s32) from %ir.object) 191 ; CHECK: $x8 = SUBXri $sp, 4, 0 192 ; CHECK: renamable $z0 = LD1RSW_IMM renamable $p0, killed $x8, 0 :: (load (s32) from %ir.object) 193 ; CHECK: $x8 = SUBXri $sp, 8, 0 194 ; CHECK: renamable $z0 = LD1RD_IMM renamable $p0, killed $x8, 0 :: (load (s64) from %ir.object) 195 ; CHECK: $x8 = SUBXri $sp, 8, 0 196 ; CHECK: renamable $z0 = LD1RD_IMM renamable $p0, killed $x8, 0 :: (load (s64) from %ir.object) 197 ; CHECK: $sp = frame-destroy ADDXri $sp, 16, 0 198 ; CHECK: RET_ReallyLR implicit $z0 199 renamable $z0 = LD1RB_IMM renamable $p0, %stack.1.object, -1 :: (load 1 from %ir.object, align 2) 200 renamable $z0 = LD1RB_H_IMM renamable $p0, %stack.1.object, -1 :: (load 1 from %ir.object, align 2) 201 renamable $z0 = LD1RB_S_IMM renamable $p0, %stack.1.object, -1 :: (load 1 from %ir.object, align 2) 202 renamable $z0 = LD1RB_D_IMM renamable $p0, %stack.1.object, -1 :: (load 1 from %ir.object, align 2) 203 renamable $z0 = LD1RSB_H_IMM renamable $p0, %stack.1.object, -1 :: (load 1 from %ir.object, align 2) 204 renamable $z0 = LD1RSB_S_IMM renamable $p0, %stack.1.object, -1 :: (load 1 from %ir.object, align 2) 205 renamable $z0 = LD1RSB_D_IMM renamable $p0, %stack.1.object, -1 :: (load 1 from %ir.object, align 2) 206 renamable $z0 = LD1RH_IMM renamable $p0, %stack.1.object, -1 :: (load 2 from %ir.object, align 2) 207 renamable $z0 = LD1RH_S_IMM renamable $p0, %stack.1.object, -1 :: (load 2 from %ir.object, align 2) 208 renamable $z0 = LD1RH_D_IMM renamable $p0, %stack.1.object, -1 :: (load 2 from %ir.object, align 2) 209 renamable $z0 = LD1RSH_S_IMM renamable $p0, %stack.1.object, -1 :: (load 2 from %ir.object, align 2) 210 renamable $z0 = LD1RSH_D_IMM renamable $p0, %stack.1.object, -1 :: (load 2 from %ir.object, align 2) 211 renamable $z0 = LD1RW_IMM renamable $p0, %stack.1.object, -1 :: (load 4 from %ir.object, align 4) 212 renamable $z0 = LD1RW_D_IMM renamable $p0, %stack.1.object, -1 :: (load 4 from %ir.object, align 4) 213 renamable $z0 = LD1RSW_IMM renamable $p0, %stack.1.object, -1 :: (load 4 from %ir.object, align 4) 214 renamable $z0 = LD1RD_IMM renamable $p0, %stack.1.object, -1 :: (load 8 from %ir.object, align 8) 215 renamable $z0 = LD1RD_IMM renamable $p0, %stack.1.object, -1 :: (load 8 from %ir.object, align 8) 216 RET_ReallyLR implicit $z0 217... 218