1; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2; RUN: llc -verify-machineinstrs -stop-after=finalize-isel -mtriple=powerpc64-ibm-aix-xcoff \ 3; RUN: -mcpu=pwr4 < %s | FileCheck -check-prefix=AIX64 %s 4; RUN: llc -verify-machineinstrs -stop-after=finalize-isel -mtriple=powerpc-ibm-aix-xcoff \ 5; RUN: -mcpu=pwr4 < %s | FileCheck -check-prefix=AIX32 %s 6; RUN: llc -verify-machineinstrs -stop-after=finalize-isel -mtriple=powerpc64le-unknown-linux-gnu \ 7; RUN: -mcpu=pwr8 < %s | FileCheck -check-prefix=LE64 %s 8 9;; This file is copied from test/CodeGen/PowerPC/ctrloops.ll. 10;; In this file, we are testing the CTR loops form after ISEL. 11 12@a = common global i32 0, align 4 13 14define void @test1(i32 %c) nounwind { 15 ; AIX64-LABEL: name: test1 16 ; AIX64: bb.0.entry: 17 ; AIX64-NEXT: successors: %bb.1(0x80000000) 18 ; AIX64-NEXT: liveins: $x3 19 ; AIX64-NEXT: {{ $}} 20 ; AIX64-NEXT: [[COPY:%[0-9]+]]:g8rc = COPY $x3 21 ; AIX64-NEXT: [[COPY1:%[0-9]+]]:gprc = COPY [[COPY]].sub_32 22 ; AIX64-NEXT: [[LI8_:%[0-9]+]]:g8rc = LI8 2048 23 ; AIX64-NEXT: MTCTR8loop killed [[LI8_]], implicit-def dead $ctr8 24 ; AIX64-NEXT: {{ $}} 25 ; AIX64-NEXT: bb.1.for.body: 26 ; AIX64-NEXT: successors: %bb.1(0x7c000000), %bb.2(0x04000000) 27 ; AIX64-NEXT: {{ $}} 28 ; AIX64-NEXT: [[LDtoc:%[0-9]+]]:g8rc_and_g8rc_nox0 = LDtoc @a, $x2 :: (load (s64) from got) 29 ; AIX64-NEXT: [[LWZ:%[0-9]+]]:gprc = LWZ 0, [[LDtoc]] :: (volatile dereferenceable load (s32) from @a) 30 ; AIX64-NEXT: [[ADD4_:%[0-9]+]]:gprc = nsw ADD4 killed [[LWZ]], [[COPY1]] 31 ; AIX64-NEXT: STW killed [[ADD4_]], 0, [[LDtoc]] :: (volatile store (s32) into @a) 32 ; AIX64-NEXT: [[DecreaseCTR8loop:%[0-9]+]]:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 33 ; AIX64-NEXT: BC killed [[DecreaseCTR8loop]], %bb.1 34 ; AIX64-NEXT: B %bb.2 35 ; AIX64-NEXT: {{ $}} 36 ; AIX64-NEXT: bb.2.for.end: 37 ; AIX64-NEXT: BLR8 implicit $lr8, implicit $rm 38 ; 39 ; AIX32-LABEL: name: test1 40 ; AIX32: bb.0.entry: 41 ; AIX32-NEXT: successors: %bb.1(0x80000000) 42 ; AIX32-NEXT: liveins: $r3 43 ; AIX32-NEXT: {{ $}} 44 ; AIX32-NEXT: [[COPY:%[0-9]+]]:gprc = COPY $r3 45 ; AIX32-NEXT: [[LI:%[0-9]+]]:gprc = LI 2048 46 ; AIX32-NEXT: MTCTRloop killed [[LI]], implicit-def dead $ctr 47 ; AIX32-NEXT: {{ $}} 48 ; AIX32-NEXT: bb.1.for.body: 49 ; AIX32-NEXT: successors: %bb.1(0x7c000000), %bb.2(0x04000000) 50 ; AIX32-NEXT: {{ $}} 51 ; AIX32-NEXT: [[LWZtoc:%[0-9]+]]:gprc_and_gprc_nor0 = LWZtoc @a, $r2 :: (load (s32) from got) 52 ; AIX32-NEXT: [[LWZ:%[0-9]+]]:gprc = LWZ 0, [[LWZtoc]] :: (volatile dereferenceable load (s32) from @a) 53 ; AIX32-NEXT: [[ADD4_:%[0-9]+]]:gprc = nsw ADD4 killed [[LWZ]], [[COPY]] 54 ; AIX32-NEXT: STW killed [[ADD4_]], 0, [[LWZtoc]] :: (volatile store (s32) into @a) 55 ; AIX32-NEXT: [[DecreaseCTRloop:%[0-9]+]]:crbitrc = DecreaseCTRloop 1, implicit-def dead $ctr, implicit $ctr 56 ; AIX32-NEXT: BC killed [[DecreaseCTRloop]], %bb.1 57 ; AIX32-NEXT: B %bb.2 58 ; AIX32-NEXT: {{ $}} 59 ; AIX32-NEXT: bb.2.for.end: 60 ; AIX32-NEXT: BLR implicit $lr, implicit $rm 61 ; 62 ; LE64-LABEL: name: test1 63 ; LE64: bb.0.entry: 64 ; LE64-NEXT: successors: %bb.1(0x80000000) 65 ; LE64-NEXT: liveins: $x3 66 ; LE64-NEXT: {{ $}} 67 ; LE64-NEXT: [[COPY:%[0-9]+]]:g8rc = COPY $x3 68 ; LE64-NEXT: [[COPY1:%[0-9]+]]:gprc = COPY [[COPY]].sub_32 69 ; LE64-NEXT: [[LI8_:%[0-9]+]]:g8rc = LI8 2048 70 ; LE64-NEXT: MTCTR8loop killed [[LI8_]], implicit-def dead $ctr8 71 ; LE64-NEXT: {{ $}} 72 ; LE64-NEXT: bb.1.for.body: 73 ; LE64-NEXT: successors: %bb.1(0x7c000000), %bb.2(0x04000000) 74 ; LE64-NEXT: {{ $}} 75 ; LE64-NEXT: [[ADDIStocHA8_:%[0-9]+]]:g8rc_and_g8rc_nox0 = ADDIStocHA8 $x2, @a 76 ; LE64-NEXT: [[LDtocL:%[0-9]+]]:g8rc_and_g8rc_nox0 = LDtocL @a, killed [[ADDIStocHA8_]] :: (load (s64) from got) 77 ; LE64-NEXT: [[LWZ:%[0-9]+]]:gprc = LWZ 0, [[LDtocL]] :: (volatile dereferenceable load (s32) from @a) 78 ; LE64-NEXT: [[ADD4_:%[0-9]+]]:gprc = nsw ADD4 killed [[LWZ]], [[COPY1]] 79 ; LE64-NEXT: STW killed [[ADD4_]], 0, [[LDtocL]] :: (volatile store (s32) into @a) 80 ; LE64-NEXT: [[DecreaseCTR8loop:%[0-9]+]]:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 81 ; LE64-NEXT: BC killed [[DecreaseCTR8loop]], %bb.1 82 ; LE64-NEXT: B %bb.2 83 ; LE64-NEXT: {{ $}} 84 ; LE64-NEXT: bb.2.for.end: 85 ; LE64-NEXT: BLR8 implicit $lr8, implicit $rm 86entry: 87 br label %for.body 88 89for.body: ; preds = %for.body, %entry 90 %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 91 %0 = load volatile i32, ptr @a, align 4 92 %add = add nsw i32 %0, %c 93 store volatile i32 %add, ptr @a, align 4 94 %inc = add nsw i32 %i.01, 1 95 %exitcond = icmp eq i32 %inc, 2048 96 br i1 %exitcond, label %for.end, label %for.body 97 98for.end: ; preds = %for.body 99 ret void 100} 101 102define void @test2(i32 %c, i32 %d) nounwind { 103 ; AIX64-LABEL: name: test2 104 ; AIX64: bb.0.entry: 105 ; AIX64-NEXT: successors: %bb.1(0x50000000), %bb.3(0x30000000) 106 ; AIX64-NEXT: liveins: $x3, $x4 107 ; AIX64-NEXT: {{ $}} 108 ; AIX64-NEXT: [[COPY:%[0-9]+]]:g8rc = COPY $x4 109 ; AIX64-NEXT: [[COPY1:%[0-9]+]]:g8rc = COPY $x3 110 ; AIX64-NEXT: [[COPY2:%[0-9]+]]:gprc = COPY [[COPY1]].sub_32 111 ; AIX64-NEXT: [[COPY3:%[0-9]+]]:gprc_and_gprc_nor0 = COPY [[COPY]].sub_32 112 ; AIX64-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY3]], 1 113 ; AIX64-NEXT: BCC 12, killed [[CMPWI]], %bb.3 114 ; AIX64-NEXT: B %bb.1 115 ; AIX64-NEXT: {{ $}} 116 ; AIX64-NEXT: bb.1.for.body.preheader: 117 ; AIX64-NEXT: successors: %bb.2(0x80000000) 118 ; AIX64-NEXT: {{ $}} 119 ; AIX64-NEXT: [[ADDI:%[0-9]+]]:gprc = ADDI [[COPY3]], -1 120 ; AIX64-NEXT: [[DEF:%[0-9]+]]:g8rc = IMPLICIT_DEF 121 ; AIX64-NEXT: [[INSERT_SUBREG:%[0-9]+]]:g8rc = INSERT_SUBREG [[DEF]], killed [[ADDI]], %subreg.sub_32 122 ; AIX64-NEXT: [[RLDICL:%[0-9]+]]:g8rc_and_g8rc_nox0 = RLDICL killed [[INSERT_SUBREG]], 0, 32 123 ; AIX64-NEXT: [[ADDI8_:%[0-9]+]]:g8rc = nuw nsw ADDI8 killed [[RLDICL]], 1 124 ; AIX64-NEXT: MTCTR8loop killed [[ADDI8_]], implicit-def dead $ctr8 125 ; AIX64-NEXT: {{ $}} 126 ; AIX64-NEXT: bb.2.for.body: 127 ; AIX64-NEXT: successors: %bb.2(0x7c000000), %bb.3(0x04000000) 128 ; AIX64-NEXT: {{ $}} 129 ; AIX64-NEXT: [[LDtoc:%[0-9]+]]:g8rc_and_g8rc_nox0 = LDtoc @a, $x2 :: (load (s64) from got) 130 ; AIX64-NEXT: [[LWZ:%[0-9]+]]:gprc = LWZ 0, [[LDtoc]] :: (volatile dereferenceable load (s32) from @a) 131 ; AIX64-NEXT: [[ADD4_:%[0-9]+]]:gprc = nsw ADD4 killed [[LWZ]], [[COPY2]] 132 ; AIX64-NEXT: STW killed [[ADD4_]], 0, [[LDtoc]] :: (volatile store (s32) into @a) 133 ; AIX64-NEXT: [[DecreaseCTR8loop:%[0-9]+]]:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 134 ; AIX64-NEXT: BC killed [[DecreaseCTR8loop]], %bb.2 135 ; AIX64-NEXT: B %bb.3 136 ; AIX64-NEXT: {{ $}} 137 ; AIX64-NEXT: bb.3.for.end: 138 ; AIX64-NEXT: BLR8 implicit $lr8, implicit $rm 139 ; 140 ; AIX32-LABEL: name: test2 141 ; AIX32: bb.0.entry: 142 ; AIX32-NEXT: successors: %bb.1(0x50000000), %bb.3(0x30000000) 143 ; AIX32-NEXT: liveins: $r3, $r4 144 ; AIX32-NEXT: {{ $}} 145 ; AIX32-NEXT: [[COPY:%[0-9]+]]:gprc = COPY $r4 146 ; AIX32-NEXT: [[COPY1:%[0-9]+]]:gprc = COPY $r3 147 ; AIX32-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY]], 1 148 ; AIX32-NEXT: BCC 12, killed [[CMPWI]], %bb.3 149 ; AIX32-NEXT: B %bb.1 150 ; AIX32-NEXT: {{ $}} 151 ; AIX32-NEXT: bb.1.for.body.preheader: 152 ; AIX32-NEXT: successors: %bb.2(0x80000000) 153 ; AIX32-NEXT: {{ $}} 154 ; AIX32-NEXT: MTCTRloop [[COPY]], implicit-def dead $ctr 155 ; AIX32-NEXT: {{ $}} 156 ; AIX32-NEXT: bb.2.for.body: 157 ; AIX32-NEXT: successors: %bb.2(0x7c000000), %bb.3(0x04000000) 158 ; AIX32-NEXT: {{ $}} 159 ; AIX32-NEXT: [[LWZtoc:%[0-9]+]]:gprc_and_gprc_nor0 = LWZtoc @a, $r2 :: (load (s32) from got) 160 ; AIX32-NEXT: [[LWZ:%[0-9]+]]:gprc = LWZ 0, [[LWZtoc]] :: (volatile dereferenceable load (s32) from @a) 161 ; AIX32-NEXT: [[ADD4_:%[0-9]+]]:gprc = nsw ADD4 killed [[LWZ]], [[COPY1]] 162 ; AIX32-NEXT: STW killed [[ADD4_]], 0, [[LWZtoc]] :: (volatile store (s32) into @a) 163 ; AIX32-NEXT: [[DecreaseCTRloop:%[0-9]+]]:crbitrc = DecreaseCTRloop 1, implicit-def dead $ctr, implicit $ctr 164 ; AIX32-NEXT: BC killed [[DecreaseCTRloop]], %bb.2 165 ; AIX32-NEXT: B %bb.3 166 ; AIX32-NEXT: {{ $}} 167 ; AIX32-NEXT: bb.3.for.end: 168 ; AIX32-NEXT: BLR implicit $lr, implicit $rm 169 ; 170 ; LE64-LABEL: name: test2 171 ; LE64: bb.0.entry: 172 ; LE64-NEXT: successors: %bb.1(0x50000000), %bb.3(0x30000000) 173 ; LE64-NEXT: liveins: $x3, $x4 174 ; LE64-NEXT: {{ $}} 175 ; LE64-NEXT: [[COPY:%[0-9]+]]:g8rc = COPY $x4 176 ; LE64-NEXT: [[COPY1:%[0-9]+]]:g8rc = COPY $x3 177 ; LE64-NEXT: [[COPY2:%[0-9]+]]:gprc = COPY [[COPY1]].sub_32 178 ; LE64-NEXT: [[COPY3:%[0-9]+]]:gprc_and_gprc_nor0 = COPY [[COPY]].sub_32 179 ; LE64-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY3]], 1 180 ; LE64-NEXT: BCC 12, killed [[CMPWI]], %bb.3 181 ; LE64-NEXT: B %bb.1 182 ; LE64-NEXT: {{ $}} 183 ; LE64-NEXT: bb.1.for.body.preheader: 184 ; LE64-NEXT: successors: %bb.2(0x80000000) 185 ; LE64-NEXT: {{ $}} 186 ; LE64-NEXT: [[ADDI:%[0-9]+]]:gprc = ADDI [[COPY3]], -1 187 ; LE64-NEXT: [[DEF:%[0-9]+]]:g8rc = IMPLICIT_DEF 188 ; LE64-NEXT: [[INSERT_SUBREG:%[0-9]+]]:g8rc = INSERT_SUBREG [[DEF]], killed [[ADDI]], %subreg.sub_32 189 ; LE64-NEXT: [[RLDICL:%[0-9]+]]:g8rc_and_g8rc_nox0 = RLDICL killed [[INSERT_SUBREG]], 0, 32 190 ; LE64-NEXT: [[ADDI8_:%[0-9]+]]:g8rc = nuw nsw ADDI8 killed [[RLDICL]], 1 191 ; LE64-NEXT: MTCTR8loop killed [[ADDI8_]], implicit-def dead $ctr8 192 ; LE64-NEXT: {{ $}} 193 ; LE64-NEXT: bb.2.for.body: 194 ; LE64-NEXT: successors: %bb.2(0x7c000000), %bb.3(0x04000000) 195 ; LE64-NEXT: {{ $}} 196 ; LE64-NEXT: [[ADDIStocHA8_:%[0-9]+]]:g8rc_and_g8rc_nox0 = ADDIStocHA8 $x2, @a 197 ; LE64-NEXT: [[LDtocL:%[0-9]+]]:g8rc_and_g8rc_nox0 = LDtocL @a, killed [[ADDIStocHA8_]] :: (load (s64) from got) 198 ; LE64-NEXT: [[LWZ:%[0-9]+]]:gprc = LWZ 0, [[LDtocL]] :: (volatile dereferenceable load (s32) from @a) 199 ; LE64-NEXT: [[ADD4_:%[0-9]+]]:gprc = nsw ADD4 killed [[LWZ]], [[COPY2]] 200 ; LE64-NEXT: STW killed [[ADD4_]], 0, [[LDtocL]] :: (volatile store (s32) into @a) 201 ; LE64-NEXT: [[DecreaseCTR8loop:%[0-9]+]]:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 202 ; LE64-NEXT: BC killed [[DecreaseCTR8loop]], %bb.2 203 ; LE64-NEXT: B %bb.3 204 ; LE64-NEXT: {{ $}} 205 ; LE64-NEXT: bb.3.for.end: 206 ; LE64-NEXT: BLR8 implicit $lr8, implicit $rm 207entry: 208 %cmp1 = icmp sgt i32 %d, 0 209 br i1 %cmp1, label %for.body, label %for.end 210 211for.body: ; preds = %entry, %for.body 212 %i.02 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 213 %0 = load volatile i32, ptr @a, align 4 214 %add = add nsw i32 %0, %c 215 store volatile i32 %add, ptr @a, align 4 216 %inc = add nsw i32 %i.02, 1 217 %exitcond = icmp eq i32 %inc, %d 218 br i1 %exitcond, label %for.end, label %for.body 219 220for.end: ; preds = %for.body, %entry 221 ret void 222} 223 224define void @test3(i32 %c, i32 %d) nounwind { 225 ; AIX64-LABEL: name: test3 226 ; AIX64: bb.0.entry: 227 ; AIX64-NEXT: successors: %bb.1(0x50000000), %bb.3(0x30000000) 228 ; AIX64-NEXT: liveins: $x3, $x4 229 ; AIX64-NEXT: {{ $}} 230 ; AIX64-NEXT: [[COPY:%[0-9]+]]:g8rc = COPY $x4 231 ; AIX64-NEXT: [[COPY1:%[0-9]+]]:g8rc = COPY $x3 232 ; AIX64-NEXT: [[COPY2:%[0-9]+]]:gprc = COPY [[COPY1]].sub_32 233 ; AIX64-NEXT: [[COPY3:%[0-9]+]]:gprc_and_gprc_nor0 = COPY [[COPY]].sub_32 234 ; AIX64-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY3]], 1 235 ; AIX64-NEXT: BCC 12, killed [[CMPWI]], %bb.3 236 ; AIX64-NEXT: B %bb.1 237 ; AIX64-NEXT: {{ $}} 238 ; AIX64-NEXT: bb.1.for.body.preheader: 239 ; AIX64-NEXT: successors: %bb.2(0x80000000) 240 ; AIX64-NEXT: {{ $}} 241 ; AIX64-NEXT: [[ADDI:%[0-9]+]]:gprc = ADDI [[COPY3]], -1 242 ; AIX64-NEXT: [[DEF:%[0-9]+]]:g8rc = IMPLICIT_DEF 243 ; AIX64-NEXT: [[INSERT_SUBREG:%[0-9]+]]:g8rc = INSERT_SUBREG [[DEF]], killed [[ADDI]], %subreg.sub_32 244 ; AIX64-NEXT: [[RLDICL:%[0-9]+]]:g8rc_and_g8rc_nox0 = RLDICL killed [[INSERT_SUBREG]], 0, 32 245 ; AIX64-NEXT: [[ADDI8_:%[0-9]+]]:g8rc = nuw nsw ADDI8 killed [[RLDICL]], 1 246 ; AIX64-NEXT: MTCTR8loop killed [[ADDI8_]], implicit-def dead $ctr8 247 ; AIX64-NEXT: [[LI:%[0-9]+]]:gprc = LI 0 248 ; AIX64-NEXT: {{ $}} 249 ; AIX64-NEXT: bb.2.for.body: 250 ; AIX64-NEXT: successors: %bb.2(0x7c000000), %bb.3(0x04000000) 251 ; AIX64-NEXT: {{ $}} 252 ; AIX64-NEXT: [[PHI:%[0-9]+]]:gprc = PHI [[LI]], %bb.1, %1, %bb.2 253 ; AIX64-NEXT: [[LDtoc:%[0-9]+]]:g8rc_and_g8rc_nox0 = LDtoc @a, $x2 :: (load (s64) from got) 254 ; AIX64-NEXT: [[LWZ:%[0-9]+]]:gprc = LWZ 0, [[LDtoc]] :: (volatile dereferenceable load (s32) from @a) 255 ; AIX64-NEXT: [[ADD4_:%[0-9]+]]:gprc = ADD4 [[PHI]], killed [[LWZ]] 256 ; AIX64-NEXT: STW killed [[ADD4_]], 0, [[LDtoc]] :: (volatile store (s32) into @a) 257 ; AIX64-NEXT: [[ADD4_1:%[0-9]+]]:gprc = ADD4 [[PHI]], [[COPY2]] 258 ; AIX64-NEXT: [[DecreaseCTR8loop:%[0-9]+]]:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 259 ; AIX64-NEXT: BC killed [[DecreaseCTR8loop]], %bb.2 260 ; AIX64-NEXT: B %bb.3 261 ; AIX64-NEXT: {{ $}} 262 ; AIX64-NEXT: bb.3.for.end: 263 ; AIX64-NEXT: BLR8 implicit $lr8, implicit $rm 264 ; 265 ; AIX32-LABEL: name: test3 266 ; AIX32: bb.0.entry: 267 ; AIX32-NEXT: successors: %bb.1(0x50000000), %bb.3(0x30000000) 268 ; AIX32-NEXT: liveins: $r3, $r4 269 ; AIX32-NEXT: {{ $}} 270 ; AIX32-NEXT: [[COPY:%[0-9]+]]:gprc = COPY $r4 271 ; AIX32-NEXT: [[COPY1:%[0-9]+]]:gprc = COPY $r3 272 ; AIX32-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY]], 1 273 ; AIX32-NEXT: BCC 12, killed [[CMPWI]], %bb.3 274 ; AIX32-NEXT: B %bb.1 275 ; AIX32-NEXT: {{ $}} 276 ; AIX32-NEXT: bb.1.for.body.preheader: 277 ; AIX32-NEXT: successors: %bb.2(0x80000000) 278 ; AIX32-NEXT: {{ $}} 279 ; AIX32-NEXT: MTCTRloop [[COPY]], implicit-def dead $ctr 280 ; AIX32-NEXT: [[LI:%[0-9]+]]:gprc = LI 0 281 ; AIX32-NEXT: {{ $}} 282 ; AIX32-NEXT: bb.2.for.body: 283 ; AIX32-NEXT: successors: %bb.2(0x7c000000), %bb.3(0x04000000) 284 ; AIX32-NEXT: {{ $}} 285 ; AIX32-NEXT: [[PHI:%[0-9]+]]:gprc = PHI [[LI]], %bb.1, %1, %bb.2 286 ; AIX32-NEXT: [[LWZtoc:%[0-9]+]]:gprc_and_gprc_nor0 = LWZtoc @a, $r2 :: (load (s32) from got) 287 ; AIX32-NEXT: [[LWZ:%[0-9]+]]:gprc = LWZ 0, [[LWZtoc]] :: (volatile dereferenceable load (s32) from @a) 288 ; AIX32-NEXT: [[ADD4_:%[0-9]+]]:gprc = ADD4 [[PHI]], killed [[LWZ]] 289 ; AIX32-NEXT: STW killed [[ADD4_]], 0, [[LWZtoc]] :: (volatile store (s32) into @a) 290 ; AIX32-NEXT: [[ADD4_1:%[0-9]+]]:gprc = ADD4 [[PHI]], [[COPY1]] 291 ; AIX32-NEXT: [[DecreaseCTRloop:%[0-9]+]]:crbitrc = DecreaseCTRloop 1, implicit-def dead $ctr, implicit $ctr 292 ; AIX32-NEXT: BC killed [[DecreaseCTRloop]], %bb.2 293 ; AIX32-NEXT: B %bb.3 294 ; AIX32-NEXT: {{ $}} 295 ; AIX32-NEXT: bb.3.for.end: 296 ; AIX32-NEXT: BLR implicit $lr, implicit $rm 297 ; 298 ; LE64-LABEL: name: test3 299 ; LE64: bb.0.entry: 300 ; LE64-NEXT: successors: %bb.1(0x50000000), %bb.3(0x30000000) 301 ; LE64-NEXT: liveins: $x3, $x4 302 ; LE64-NEXT: {{ $}} 303 ; LE64-NEXT: [[COPY:%[0-9]+]]:g8rc = COPY $x4 304 ; LE64-NEXT: [[COPY1:%[0-9]+]]:g8rc = COPY $x3 305 ; LE64-NEXT: [[COPY2:%[0-9]+]]:gprc = COPY [[COPY1]].sub_32 306 ; LE64-NEXT: [[COPY3:%[0-9]+]]:gprc_and_gprc_nor0 = COPY [[COPY]].sub_32 307 ; LE64-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY3]], 1 308 ; LE64-NEXT: BCC 12, killed [[CMPWI]], %bb.3 309 ; LE64-NEXT: B %bb.1 310 ; LE64-NEXT: {{ $}} 311 ; LE64-NEXT: bb.1.for.body.preheader: 312 ; LE64-NEXT: successors: %bb.2(0x80000000) 313 ; LE64-NEXT: {{ $}} 314 ; LE64-NEXT: [[ADDI:%[0-9]+]]:gprc = ADDI [[COPY3]], -1 315 ; LE64-NEXT: [[DEF:%[0-9]+]]:g8rc = IMPLICIT_DEF 316 ; LE64-NEXT: [[INSERT_SUBREG:%[0-9]+]]:g8rc = INSERT_SUBREG [[DEF]], killed [[ADDI]], %subreg.sub_32 317 ; LE64-NEXT: [[RLDICL:%[0-9]+]]:g8rc_and_g8rc_nox0 = RLDICL killed [[INSERT_SUBREG]], 0, 32 318 ; LE64-NEXT: [[ADDI8_:%[0-9]+]]:g8rc = nuw nsw ADDI8 killed [[RLDICL]], 1 319 ; LE64-NEXT: MTCTR8loop killed [[ADDI8_]], implicit-def dead $ctr8 320 ; LE64-NEXT: [[LI:%[0-9]+]]:gprc = LI 0 321 ; LE64-NEXT: {{ $}} 322 ; LE64-NEXT: bb.2.for.body: 323 ; LE64-NEXT: successors: %bb.2(0x7c000000), %bb.3(0x04000000) 324 ; LE64-NEXT: {{ $}} 325 ; LE64-NEXT: [[PHI:%[0-9]+]]:gprc = PHI [[LI]], %bb.1, %1, %bb.2 326 ; LE64-NEXT: [[ADDIStocHA8_:%[0-9]+]]:g8rc_and_g8rc_nox0 = ADDIStocHA8 $x2, @a 327 ; LE64-NEXT: [[LDtocL:%[0-9]+]]:g8rc_and_g8rc_nox0 = LDtocL @a, killed [[ADDIStocHA8_]] :: (load (s64) from got) 328 ; LE64-NEXT: [[LWZ:%[0-9]+]]:gprc = LWZ 0, [[LDtocL]] :: (volatile dereferenceable load (s32) from @a) 329 ; LE64-NEXT: [[ADD4_:%[0-9]+]]:gprc = ADD4 [[PHI]], killed [[LWZ]] 330 ; LE64-NEXT: STW killed [[ADD4_]], 0, [[LDtocL]] :: (volatile store (s32) into @a) 331 ; LE64-NEXT: [[ADD4_1:%[0-9]+]]:gprc = ADD4 [[PHI]], [[COPY2]] 332 ; LE64-NEXT: [[DecreaseCTR8loop:%[0-9]+]]:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 333 ; LE64-NEXT: BC killed [[DecreaseCTR8loop]], %bb.2 334 ; LE64-NEXT: B %bb.3 335 ; LE64-NEXT: {{ $}} 336 ; LE64-NEXT: bb.3.for.end: 337 ; LE64-NEXT: BLR8 implicit $lr8, implicit $rm 338entry: 339 %cmp1 = icmp sgt i32 %d, 0 340 br i1 %cmp1, label %for.body, label %for.end 341 342for.body: ; preds = %entry, %for.body 343 %i.02 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 344 %mul = mul nsw i32 %i.02, %c 345 %0 = load volatile i32, ptr @a, align 4 346 %add = add nsw i32 %0, %mul 347 store volatile i32 %add, ptr @a, align 4 348 %inc = add nsw i32 %i.02, 1 349 %exitcond = icmp eq i32 %inc, %d 350 br i1 %exitcond, label %for.end, label %for.body 351 352for.end: ; preds = %for.body, %entry 353 ret void 354} 355 356@tls_var = external thread_local global i8 357 358define i32 @test4(i32 %inp) { 359 ; AIX64-LABEL: name: test4 360 ; AIX64: bb.0.entry: 361 ; AIX64-NEXT: successors: %bb.3(0x40000000), %bb.4(0x40000000) 362 ; AIX64-NEXT: liveins: $x3 363 ; AIX64-NEXT: {{ $}} 364 ; AIX64-NEXT: [[COPY:%[0-9]+]]:g8rc = COPY $x3 365 ; AIX64-NEXT: [[COPY1:%[0-9]+]]:gprc_and_gprc_nor0 = COPY [[COPY]].sub_32 366 ; AIX64-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY1]], 1 367 ; AIX64-NEXT: [[LI:%[0-9]+]]:gprc_and_gprc_nor0 = LI 1 368 ; AIX64-NEXT: BCC 12, [[CMPWI]], %bb.4 369 ; AIX64-NEXT: {{ $}} 370 ; AIX64-NEXT: bb.3.entry: 371 ; AIX64-NEXT: successors: %bb.4(0x80000000) 372 ; AIX64-NEXT: {{ $}} 373 ; AIX64-NEXT: bb.4.entry: 374 ; AIX64-NEXT: successors: %bb.1(0x80000000) 375 ; AIX64-NEXT: {{ $}} 376 ; AIX64-NEXT: [[PHI:%[0-9]+]]:gprc = PHI [[LI]], %bb.3, [[COPY1]], %bb.0 377 ; AIX64-NEXT: [[SUBF:%[0-9]+]]:gprc = SUBF [[PHI]], [[COPY1]] 378 ; AIX64-NEXT: [[DEF:%[0-9]+]]:g8rc = IMPLICIT_DEF 379 ; AIX64-NEXT: [[INSERT_SUBREG:%[0-9]+]]:g8rc = INSERT_SUBREG [[DEF]], killed [[SUBF]], %subreg.sub_32 380 ; AIX64-NEXT: [[RLDICL:%[0-9]+]]:g8rc_and_g8rc_nox0 = RLDICL killed [[INSERT_SUBREG]], 0, 32 381 ; AIX64-NEXT: [[ADDI8_:%[0-9]+]]:g8rc = nuw nsw ADDI8 killed [[RLDICL]], 1 382 ; AIX64-NEXT: MTCTR8loop killed [[ADDI8_]], implicit-def dead $ctr8 383 ; AIX64-NEXT: {{ $}} 384 ; AIX64-NEXT: bb.1.for.body: 385 ; AIX64-NEXT: successors: %bb.1(0x7c000000), %bb.2(0x04000000) 386 ; AIX64-NEXT: {{ $}} 387 ; AIX64-NEXT: [[DecreaseCTR8loop:%[0-9]+]]:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 388 ; AIX64-NEXT: BC killed [[DecreaseCTR8loop]], %bb.1 389 ; AIX64-NEXT: B %bb.2 390 ; AIX64-NEXT: {{ $}} 391 ; AIX64-NEXT: bb.2.return: 392 ; AIX64-NEXT: [[LDtoc:%[0-9]+]]:g8rc = LDtoc target-flags(ppc-tlsgdm) @tls_var, $x2 :: (load (s64) from got) 393 ; AIX64-NEXT: [[LDtoc1:%[0-9]+]]:g8rc = LDtoc target-flags(ppc-tlsgd) @tls_var, $x2 :: (load (s64) from got) 394 ; AIX64-NEXT: [[TLSGDAIX8_:%[0-9]+]]:g8rc = TLSGDAIX8 killed [[LDtoc1]], killed [[LDtoc]] 395 ; AIX64-NEXT: [[COPY2:%[0-9]+]]:gprc = COPY [[TLSGDAIX8_]].sub_32 396 ; AIX64-NEXT: [[ADD4_:%[0-9]+]]:gprc = ADD4 killed [[COPY2]], [[PHI]] 397 ; AIX64-NEXT: [[DEF1:%[0-9]+]]:g8rc = IMPLICIT_DEF 398 ; AIX64-NEXT: [[INSERT_SUBREG1:%[0-9]+]]:g8rc = INSERT_SUBREG [[DEF1]], killed [[ADD4_]], %subreg.sub_32 399 ; AIX64-NEXT: $x3 = COPY [[INSERT_SUBREG1]] 400 ; AIX64-NEXT: BLR8 implicit $lr8, implicit $rm, implicit $x3 401 ; 402 ; AIX32-LABEL: name: test4 403 ; AIX32: bb.0.entry: 404 ; AIX32-NEXT: successors: %bb.3(0x40000000), %bb.4(0x40000000) 405 ; AIX32-NEXT: liveins: $r3 406 ; AIX32-NEXT: {{ $}} 407 ; AIX32-NEXT: [[COPY:%[0-9]+]]:gprc_and_gprc_nor0 = COPY $r3 408 ; AIX32-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY]], 1 409 ; AIX32-NEXT: [[LI:%[0-9]+]]:gprc_and_gprc_nor0 = LI 1 410 ; AIX32-NEXT: BCC 12, [[CMPWI]], %bb.4 411 ; AIX32-NEXT: {{ $}} 412 ; AIX32-NEXT: bb.3.entry: 413 ; AIX32-NEXT: successors: %bb.4(0x80000000) 414 ; AIX32-NEXT: {{ $}} 415 ; AIX32-NEXT: bb.4.entry: 416 ; AIX32-NEXT: successors: %bb.1(0x80000000) 417 ; AIX32-NEXT: {{ $}} 418 ; AIX32-NEXT: [[PHI:%[0-9]+]]:gprc = PHI [[LI]], %bb.3, [[COPY]], %bb.0 419 ; AIX32-NEXT: [[SUBF:%[0-9]+]]:gprc_and_gprc_nor0 = SUBF [[PHI]], [[COPY]] 420 ; AIX32-NEXT: [[ADDI:%[0-9]+]]:gprc = ADDI killed [[SUBF]], 1 421 ; AIX32-NEXT: MTCTRloop killed [[ADDI]], implicit-def dead $ctr 422 ; AIX32-NEXT: {{ $}} 423 ; AIX32-NEXT: bb.1.for.body: 424 ; AIX32-NEXT: successors: %bb.1(0x7c000000), %bb.2(0x04000000) 425 ; AIX32-NEXT: {{ $}} 426 ; AIX32-NEXT: [[DecreaseCTRloop:%[0-9]+]]:crbitrc = DecreaseCTRloop 1, implicit-def dead $ctr, implicit $ctr 427 ; AIX32-NEXT: BC killed [[DecreaseCTRloop]], %bb.1 428 ; AIX32-NEXT: B %bb.2 429 ; AIX32-NEXT: {{ $}} 430 ; AIX32-NEXT: bb.2.return: 431 ; AIX32-NEXT: [[LWZtoc:%[0-9]+]]:gprc = LWZtoc target-flags(ppc-tlsgdm) @tls_var, $r2 :: (load (s32) from got) 432 ; AIX32-NEXT: [[LWZtoc1:%[0-9]+]]:gprc = LWZtoc target-flags(ppc-tlsgd) @tls_var, $r2 :: (load (s32) from got) 433 ; AIX32-NEXT: [[TLSGDAIX:%[0-9]+]]:gprc = TLSGDAIX killed [[LWZtoc1]], killed [[LWZtoc]] 434 ; AIX32-NEXT: [[ADD4_:%[0-9]+]]:gprc = ADD4 killed [[TLSGDAIX]], [[PHI]] 435 ; AIX32-NEXT: $r3 = COPY [[ADD4_]] 436 ; AIX32-NEXT: BLR implicit $lr, implicit $rm, implicit $r3 437 ; 438 ; LE64-LABEL: name: test4 439 ; LE64: bb.0.entry: 440 ; LE64-NEXT: successors: %bb.1(0x80000000) 441 ; LE64-NEXT: liveins: $x3 442 ; LE64-NEXT: {{ $}} 443 ; LE64-NEXT: [[COPY:%[0-9]+]]:g8rc = COPY $x3 444 ; LE64-NEXT: [[COPY1:%[0-9]+]]:gprc_and_gprc_nor0 = COPY [[COPY]].sub_32 445 ; LE64-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY1]], 1 446 ; LE64-NEXT: [[LI:%[0-9]+]]:gprc_and_gprc_nor0 = LI 1 447 ; LE64-NEXT: [[ISEL:%[0-9]+]]:gprc = ISEL [[COPY1]], [[LI]], [[CMPWI]].sub_lt 448 ; LE64-NEXT: [[SUBF:%[0-9]+]]:gprc = SUBF [[ISEL]], [[COPY1]] 449 ; LE64-NEXT: [[DEF:%[0-9]+]]:g8rc = IMPLICIT_DEF 450 ; LE64-NEXT: [[INSERT_SUBREG:%[0-9]+]]:g8rc = INSERT_SUBREG [[DEF]], killed [[SUBF]], %subreg.sub_32 451 ; LE64-NEXT: [[RLDICL:%[0-9]+]]:g8rc_and_g8rc_nox0 = RLDICL killed [[INSERT_SUBREG]], 0, 32 452 ; LE64-NEXT: [[ADDI8_:%[0-9]+]]:g8rc = nuw nsw ADDI8 killed [[RLDICL]], 1 453 ; LE64-NEXT: MTCTR8loop killed [[ADDI8_]], implicit-def dead $ctr8 454 ; LE64-NEXT: {{ $}} 455 ; LE64-NEXT: bb.1.for.body: 456 ; LE64-NEXT: successors: %bb.1(0x7c000000), %bb.2(0x04000000) 457 ; LE64-NEXT: {{ $}} 458 ; LE64-NEXT: [[DecreaseCTR8loop:%[0-9]+]]:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 459 ; LE64-NEXT: BC killed [[DecreaseCTR8loop]], %bb.1 460 ; LE64-NEXT: B %bb.2 461 ; LE64-NEXT: {{ $}} 462 ; LE64-NEXT: bb.2.return: 463 ; LE64-NEXT: [[ADDISgotTprelHA:%[0-9]+]]:g8rc_and_g8rc_nox0 = ADDISgotTprelHA $x2, @tls_var 464 ; LE64-NEXT: [[LDgotTprelL:%[0-9]+]]:g8rc_and_g8rc_nox0 = LDgotTprelL @tls_var, killed [[ADDISgotTprelHA]] 465 ; LE64-NEXT: [[ADD8TLS:%[0-9]+]]:g8rc = ADD8TLS killed [[LDgotTprelL]], target-flags(ppc-tls) @tls_var 466 ; LE64-NEXT: [[COPY2:%[0-9]+]]:gprc = COPY [[ADD8TLS]].sub_32 467 ; LE64-NEXT: [[ADD4_:%[0-9]+]]:gprc = ADD4 killed [[COPY2]], [[ISEL]] 468 ; LE64-NEXT: [[DEF1:%[0-9]+]]:g8rc = IMPLICIT_DEF 469 ; LE64-NEXT: [[INSERT_SUBREG1:%[0-9]+]]:g8rc = INSERT_SUBREG [[DEF1]], killed [[ADD4_]], %subreg.sub_32 470 ; LE64-NEXT: $x3 = COPY [[INSERT_SUBREG1]] 471 ; LE64-NEXT: BLR8 implicit $lr8, implicit $rm, implicit $x3 472entry: 473 br label %for.body 474 475for.body: ; preds = %for.body, %entry 476 %phi = phi i32 [ %dec, %for.body ], [ %inp, %entry ] 477 %load = ptrtoint ptr @tls_var to i32 478 %val = add i32 %load, %phi 479 %dec = add i32 %phi, -1 480 %cmp = icmp sgt i32 %phi, 1 481 br i1 %cmp, label %for.body, label %return 482 483return: ; preds = %for.body 484 ret i32 %val 485} 486