1# RUN: llc -mtriple=thumbv7-- -run-pass=prologepilog \ 2# RUN: -run-pass=machine-outliner %s -o - | FileCheck %s 3 4--- | 5 define void @CheckAddrModeT2_i12() { ret void } 6 define void @CheckAddrModeT2_i8() { ret void } 7 define void @CheckAddrModeT2_i8s4() { ret void } 8 define void @CheckAddrModeT2_ldrex() { ret void } 9 define void @CheckAddrModeT1_s() { ret void } 10 define void @foo() { ret void } 11 12... 13--- 14 15name: CheckAddrModeT2_i12 16tracksRegLiveness: true 17 18body: | 19 bb.0: 20 liveins: $r1 21 ;CHECK-LABEL: name: CheckAddrModeT2_i12 22 ;CHECK: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_[[SHARED:[0-9+]]] 23 ;CHECK-NEXT: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_[[I12:[0-9]+]] 24 ;CHECK-NEXT: $r0 = t2LDRi12 $sp, 4088, 14 /* CC::al */, $noreg 25 $r0 = tMOVr killed $r1, 14, $noreg 26 tBL 14, $noreg, @foo, implicit-def dead $lr, implicit $sp 27 $r0 = t2LDRi12 $sp, 0, 14, $noreg 28 $r0 = t2LDRi12 $sp, 4, 14, $noreg 29 $r0 = t2LDRi12 $sp, 4086, 14, $noreg 30 $r0 = t2LDRi12 $sp, 4088, 14, $noreg 31 tBL 14, $noreg, @foo, implicit-def dead $lr, implicit $sp 32 $r0 = t2LDRi12 $sp, 0, 14, $noreg 33 $r0 = t2LDRi12 $sp, 4, 14, $noreg 34 $r0 = t2LDRi12 $sp, 4086, 14, $noreg 35 $r0 = t2LDRi12 $sp, 4088, 14, $noreg 36 tBL 14, $noreg, @foo, implicit-def dead $lr, implicit $sp 37 $r0 = t2LDRi12 $sp, 0, 14, $noreg 38 $r0 = t2LDRi12 $sp, 4, 14, $noreg 39 $r0 = t2LDRi12 $sp, 4086, 14, $noreg 40 $r0 = t2LDRi12 $sp, 4088, 14, $noreg 41 BX_RET 14, $noreg 42... 43--- 44 45name: CheckAddrModeT2_i8 46tracksRegLiveness: true 47 48body: | 49 bb.0: 50 liveins: $r1 51 ;CHECK-LABEL: name: CheckAddrModeT2_i8 52 ;CHECK: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_[[SHARED:[0-9+]]] 53 ;CHECK-NEXT: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_[[I8:[0-9]+]] 54 ;CHECK-NEXT: t2STRHT $r0, $sp, 248, 14 /* CC::al */, $noreg 55 $r0 = tMOVr $r1, 14, $noreg 56 tBL 14, $noreg, @foo, implicit-def dead $lr, implicit $sp 57 t2STRHT $r0, $sp, 0, 14, $noreg 58 t2STRHT $r0, $sp, 4, 14, $noreg 59 t2STRHT $r0, $sp, 247, 14, $noreg 60 t2STRHT $r0, $sp, 248, 14, $noreg 61 tBL 14, $noreg, @foo, implicit-def dead $lr, implicit $sp 62 t2STRHT $r0, $sp, 0, 14, $noreg 63 t2STRHT $r0, $sp, 4, 14, $noreg 64 t2STRHT $r0, $sp, 247, 14, $noreg 65 t2STRHT $r0, $sp, 248, 14, $noreg 66 tBL 14, $noreg, @foo, implicit-def dead $lr, implicit $sp 67 t2STRHT $r0, $sp, 0, 14, $noreg 68 t2STRHT $r0, $sp, 4, 14, $noreg 69 t2STRHT $r0, $sp, 247, 14, $noreg 70 t2STRHT $r0, $sp, 248, 14, $noreg 71 BX_RET 14, $noreg 72... 73--- 74 75name: CheckAddrModeT2_i8s4 76tracksRegLiveness: true 77 78body: | 79 bb.0: 80 liveins: $r1 81 ;CHECK-LABEL: name: CheckAddrModeT2_i8s4 82 ;CHECK: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_[[SHARED:[0-9+]]] 83 ;CHECK-NEXT: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_[[I8S4:[0-9]+]] 84 ;CHECK-NEXT: t2STRDi8 $r0, $r1, $sp, 1020, 14 /* CC::al */, $noreg 85 $r0 = tMOVr $r1, 14, $noreg 86 tBL 14, $noreg, @foo, implicit-def dead $lr, implicit $sp 87 t2STRDi8 $r0, $r1, $sp, 0, 14, $noreg 88 t2STRDi8 $r0, $r1, $sp, 8, 14, $noreg 89 t2STRDi8 $r0, $r1, $sp, 1012, 14, $noreg 90 t2STRDi8 $r0, $r1, $sp, 1020, 14, $noreg 91 tBL 14, $noreg, @foo, implicit-def dead $lr, implicit $sp 92 t2STRDi8 $r0, $r1, $sp, 0, 14, $noreg 93 t2STRDi8 $r0, $r1, $sp, 8, 14, $noreg 94 t2STRDi8 $r0, $r1, $sp, 1012, 14, $noreg 95 t2STRDi8 $r0, $r1, $sp, 1020, 14, $noreg 96 tBL 14, $noreg, @foo, implicit-def dead $lr, implicit $sp 97 t2STRDi8 $r0, $r1, $sp, 0, 14, $noreg 98 t2STRDi8 $r0, $r1, $sp, 8, 14, $noreg 99 t2STRDi8 $r0, $r1, $sp, 1012, 14, $noreg 100 t2STRDi8 $r0, $r1, $sp, 1020, 14, $noreg 101 BX_RET 14, $noreg 102... 103--- 104 105name: CheckAddrModeT2_ldrex 106tracksRegLiveness: true 107 108body: | 109 bb.0: 110 liveins: $r1 111 ;CHECK-LABEL: name: CheckAddrModeT2_ldrex 112 ;CHECK: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_[[SHARED:[0-9+]]] 113 ;CHECK-NEXT: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_[[LDREX:[0-9]+]] 114 ;CHECK-NEXT: $r1 = t2LDREX $sp, 254, 14 /* CC::al */, $noreg 115 $r0 = tMOVr $r1, 14, $noreg 116 tBL 14, $noreg, @foo, implicit-def dead $lr, implicit $sp 117 $r1 = t2LDREX $sp, 0, 14, $noreg 118 $r1 = t2LDREX $sp, 8, 14, $noreg 119 $r1 = t2LDREX $sp, 253, 14, $noreg 120 $r1 = t2LDREX $sp, 254, 14, $noreg 121 tBL 14, $noreg, @foo, implicit-def dead $lr, implicit $sp 122 $r1 = t2LDREX $sp, 0, 14, $noreg 123 $r1 = t2LDREX $sp, 8, 14, $noreg 124 $r1 = t2LDREX $sp, 253, 14, $noreg 125 $r1 = t2LDREX $sp, 254, 14, $noreg 126 tBL 14, $noreg, @foo, implicit-def dead $lr, implicit $sp 127 $r1 = t2LDREX $sp, 0, 14, $noreg 128 $r1 = t2LDREX $sp, 8, 14, $noreg 129 $r1 = t2LDREX $sp, 253, 14, $noreg 130 $r1 = t2LDREX $sp, 254, 14, $noreg 131 tBL 14, $noreg, @foo, implicit-def dead $lr, implicit $sp 132 $r1 = t2LDREX $sp, 0, 14, $noreg 133 $r1 = t2LDREX $sp, 8, 14, $noreg 134 $r1 = t2LDREX $sp, 253, 14, $noreg 135 $r1 = t2LDREX $sp, 254, 14, $noreg 136 BX_RET 14, $noreg 137... 138--- 139 140name: CheckAddrModeT1_s 141tracksRegLiveness: true 142 143body: | 144 bb.0: 145 liveins: $r0, $r1 146 ;CHECK-LABEL: name: CheckAddrModeT1_s 147 ;CHECK: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_[[SHARED:[0-9+]]] 148 ;CHECK-NEXT: tSTRspi $r0, $sp, 0, 14 /* CC::al */, $noreg 149 ;CHECK-NEXT: tSTRspi $r0, $sp, 4, 14 /* CC::al */, $noreg 150 ;CHECK-NEXT: tSTRspi $r0, $sp, 253, 14 /* CC::al */, $noreg 151 ;CHECK-NEXT: tSTRspi $r0, $sp, 254, 14 /* CC::al */, $noreg 152 $r0 = tMOVr $r1, 14, $noreg 153 tBL 14, $noreg, @foo, implicit-def dead $lr, implicit $sp 154 tSTRspi $r0, $sp, 0, 14, $noreg 155 tSTRspi $r0, $sp, 4, 14, $noreg 156 tSTRspi $r0, $sp, 253, 14, $noreg 157 tSTRspi $r0, $sp, 254, 14, $noreg 158 tBL 14, $noreg, @foo, implicit-def dead $lr, implicit $sp 159 tSTRspi $r0, $sp, 0, 14, $noreg 160 tSTRspi $r0, $sp, 4, 14, $noreg 161 tSTRspi $r0, $sp, 253, 14, $noreg 162 tSTRspi $r0, $sp, 254, 14, $noreg 163 tBL 14, $noreg, @foo, implicit-def dead $lr, implicit $sp 164 tSTRspi $r0, $sp, 0, 14, $noreg 165 tSTRspi $r0, $sp, 4, 14, $noreg 166 tSTRspi $r0, $sp, 253, 14, $noreg 167 tSTRspi $r0, $sp, 254, 14, $noreg 168 tBL 14, $noreg, @foo, implicit-def dead $lr, implicit $sp 169 tSTRspi $r0, $sp, 0, 14, $noreg 170 tSTRspi $r0, $sp, 4, 14, $noreg 171 tSTRspi $r0, $sp, 253, 14, $noreg 172 tSTRspi $r0, $sp, 254, 14, $noreg 173 BX_RET 14, $noreg 174... 175--- 176 177name: foo 178tracksRegLiveness: true 179body: | 180 bb.0: 181 liveins: $lr 182 183 BX_RET 14, $noreg 184 185 ;CHECK: name: OUTLINED_FUNCTION_[[LDREX]] 186 ;CHECK: $r1 = t2LDREX $sp, 0, 14 /* CC::al */, $noreg 187 ;CHECK-NEXT: $r1 = t2LDREX $sp, 8, 14 /* CC::al */, $noreg 188 ;CHECK-NEXT: $r1 = t2LDREX $sp, 253, 14 /* CC::al */, $noreg 189 ;CHECK-NEXT: tBX_RET 14 /* CC::al */, $noreg 190 191 ;CHECK: name: OUTLINED_FUNCTION_[[I8]] 192 ;CHECK: t2STRHT $r0, $sp, 0, 14 /* CC::al */, $noreg 193 ;CHECK-NEXT: t2STRHT $r0, $sp, 4, 14 /* CC::al */, $noreg 194 ;CHECK-NEXT: t2STRHT $r0, $sp, 247, 14 /* CC::al */, $noreg 195 ;CHECK-NEXT: tBX_RET 14 /* CC::al */, $noreg 196 197 ;CHECK: name: OUTLINED_FUNCTION_[[I8S4]] 198 ;CHECK: t2STRDi8 $r0, $r1, $sp, 0, 14 /* CC::al */, $noreg 199 ;CHECK-NEXT: t2STRDi8 $r0, $r1, $sp, 8, 14 /* CC::al */, $noreg 200 ;CHECK-NEXT: t2STRDi8 $r0, $r1, $sp, 1012, 14 /* CC::al */, $noreg 201 ;CHECK-NEXT: tBX_RET 14 /* CC::al */, $nore 202 203 ;CHECK: name: OUTLINED_FUNCTION_[[I12]] 204 ;CHECK: $r0 = t2LDRi12 $sp, 0, 14 /* CC::al */, $noreg 205 ;CHECK-NEXT: $r0 = t2LDRi12 $sp, 4, 14 /* CC::al */, $noreg 206 ;CHECK-NEXT: $r0 = t2LDRi12 $sp, 4086, 14 /* CC::al */, $noreg 207 ;CHECK-NEXT: tBX_RET 14 /* CC::al */, $noreg 208 209 ;CHECK: name: OUTLINED_FUNCTION_[[SHARED]] 210 ;CHECK: $r0 = tMOVr killed $r1, 14 /* CC::al */, $noreg 211 ;CHECK-NEXT: tTAILJMPdND @foo, 14 /* CC::al */, $noreg, implicit $sp 212