486 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2; RUN: llc -verify-machineinstrs -stop-after=finalize-isel -mtriple=powerpc64-ibm-aix-xcoff \3; RUN: -mcpu=pwr4 < %s | FileCheck -check-prefix=AIX64 %s4; RUN: llc -verify-machineinstrs -stop-after=finalize-isel -mtriple=powerpc-ibm-aix-xcoff \5; RUN: -mcpu=pwr4 < %s | FileCheck -check-prefix=AIX32 %s6; RUN: llc -verify-machineinstrs -stop-after=finalize-isel -mtriple=powerpc64le-unknown-linux-gnu \7; RUN: -mcpu=pwr8 < %s | FileCheck -check-prefix=LE64 %s8 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 413 14define void @test1(i32 %c) nounwind {15 ; AIX64-LABEL: name: test116 ; AIX64: bb.0.entry:17 ; AIX64-NEXT: successors: %bb.1(0x80000000)18 ; AIX64-NEXT: liveins: $x319 ; AIX64-NEXT: {{ $}}20 ; AIX64-NEXT: [[COPY:%[0-9]+]]:g8rc = COPY $x321 ; AIX64-NEXT: [[COPY1:%[0-9]+]]:gprc = COPY [[COPY]].sub_3222 ; AIX64-NEXT: [[LI8_:%[0-9]+]]:g8rc = LI8 204823 ; AIX64-NEXT: MTCTR8loop killed [[LI8_]], implicit-def dead $ctr824 ; 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 $ctr833 ; AIX64-NEXT: BC killed [[DecreaseCTR8loop]], %bb.134 ; AIX64-NEXT: B %bb.235 ; AIX64-NEXT: {{ $}}36 ; AIX64-NEXT: bb.2.for.end:37 ; AIX64-NEXT: BLR8 implicit $lr8, implicit $rm38 ;39 ; AIX32-LABEL: name: test140 ; AIX32: bb.0.entry:41 ; AIX32-NEXT: successors: %bb.1(0x80000000)42 ; AIX32-NEXT: liveins: $r343 ; AIX32-NEXT: {{ $}}44 ; AIX32-NEXT: [[COPY:%[0-9]+]]:gprc = COPY $r345 ; AIX32-NEXT: [[LI:%[0-9]+]]:gprc = LI 204846 ; AIX32-NEXT: MTCTRloop killed [[LI]], implicit-def dead $ctr47 ; 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 $ctr56 ; AIX32-NEXT: BC killed [[DecreaseCTRloop]], %bb.157 ; AIX32-NEXT: B %bb.258 ; AIX32-NEXT: {{ $}}59 ; AIX32-NEXT: bb.2.for.end:60 ; AIX32-NEXT: BLR implicit $lr, implicit $rm61 ;62 ; LE64-LABEL: name: test163 ; LE64: bb.0.entry:64 ; LE64-NEXT: successors: %bb.1(0x80000000)65 ; LE64-NEXT: liveins: $x366 ; LE64-NEXT: {{ $}}67 ; LE64-NEXT: [[COPY:%[0-9]+]]:g8rc = COPY $x368 ; LE64-NEXT: [[COPY1:%[0-9]+]]:gprc = COPY [[COPY]].sub_3269 ; LE64-NEXT: [[LI8_:%[0-9]+]]:g8rc = LI8 204870 ; LE64-NEXT: MTCTR8loop killed [[LI8_]], implicit-def dead $ctr871 ; 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, @a76 ; 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 $ctr881 ; LE64-NEXT: BC killed [[DecreaseCTR8loop]], %bb.182 ; LE64-NEXT: B %bb.283 ; LE64-NEXT: {{ $}}84 ; LE64-NEXT: bb.2.for.end:85 ; LE64-NEXT: BLR8 implicit $lr8, implicit $rm86entry:87 br label %for.body88 89for.body: ; preds = %for.body, %entry90 %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ]91 %0 = load volatile i32, ptr @a, align 492 %add = add nsw i32 %0, %c93 store volatile i32 %add, ptr @a, align 494 %inc = add nsw i32 %i.01, 195 %exitcond = icmp eq i32 %inc, 204896 br i1 %exitcond, label %for.end, label %for.body97 98for.end: ; preds = %for.body99 ret void100}101 102define void @test2(i32 %c, i32 %d) nounwind {103 ; AIX64-LABEL: name: test2104 ; AIX64: bb.0.entry:105 ; AIX64-NEXT: successors: %bb.1(0x50000000), %bb.3(0x30000000)106 ; AIX64-NEXT: liveins: $x3, $x4107 ; AIX64-NEXT: {{ $}}108 ; AIX64-NEXT: [[COPY:%[0-9]+]]:g8rc = COPY $x4109 ; AIX64-NEXT: [[COPY1:%[0-9]+]]:g8rc = COPY $x3110 ; AIX64-NEXT: [[COPY2:%[0-9]+]]:gprc = COPY [[COPY1]].sub_32111 ; AIX64-NEXT: [[COPY3:%[0-9]+]]:gprc_and_gprc_nor0 = COPY [[COPY]].sub_32112 ; AIX64-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY3]], 1113 ; AIX64-NEXT: BCC 12, killed [[CMPWI]], %bb.3114 ; AIX64-NEXT: B %bb.1115 ; 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]], -1120 ; AIX64-NEXT: [[DEF:%[0-9]+]]:g8rc = IMPLICIT_DEF121 ; AIX64-NEXT: [[INSERT_SUBREG:%[0-9]+]]:g8rc = INSERT_SUBREG [[DEF]], killed [[ADDI]], %subreg.sub_32122 ; AIX64-NEXT: [[RLDICL:%[0-9]+]]:g8rc_and_g8rc_nox0 = RLDICL killed [[INSERT_SUBREG]], 0, 32123 ; AIX64-NEXT: [[ADDI8_:%[0-9]+]]:g8rc = nuw nsw ADDI8 killed [[RLDICL]], 1124 ; AIX64-NEXT: MTCTR8loop killed [[ADDI8_]], implicit-def dead $ctr8125 ; 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 $ctr8134 ; AIX64-NEXT: BC killed [[DecreaseCTR8loop]], %bb.2135 ; AIX64-NEXT: B %bb.3136 ; AIX64-NEXT: {{ $}}137 ; AIX64-NEXT: bb.3.for.end:138 ; AIX64-NEXT: BLR8 implicit $lr8, implicit $rm139 ;140 ; AIX32-LABEL: name: test2141 ; AIX32: bb.0.entry:142 ; AIX32-NEXT: successors: %bb.1(0x50000000), %bb.3(0x30000000)143 ; AIX32-NEXT: liveins: $r3, $r4144 ; AIX32-NEXT: {{ $}}145 ; AIX32-NEXT: [[COPY:%[0-9]+]]:gprc = COPY $r4146 ; AIX32-NEXT: [[COPY1:%[0-9]+]]:gprc = COPY $r3147 ; AIX32-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY]], 1148 ; AIX32-NEXT: BCC 12, killed [[CMPWI]], %bb.3149 ; AIX32-NEXT: B %bb.1150 ; 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 $ctr155 ; 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 $ctr164 ; AIX32-NEXT: BC killed [[DecreaseCTRloop]], %bb.2165 ; AIX32-NEXT: B %bb.3166 ; AIX32-NEXT: {{ $}}167 ; AIX32-NEXT: bb.3.for.end:168 ; AIX32-NEXT: BLR implicit $lr, implicit $rm169 ;170 ; LE64-LABEL: name: test2171 ; LE64: bb.0.entry:172 ; LE64-NEXT: successors: %bb.1(0x50000000), %bb.3(0x30000000)173 ; LE64-NEXT: liveins: $x3, $x4174 ; LE64-NEXT: {{ $}}175 ; LE64-NEXT: [[COPY:%[0-9]+]]:g8rc = COPY $x4176 ; LE64-NEXT: [[COPY1:%[0-9]+]]:g8rc = COPY $x3177 ; LE64-NEXT: [[COPY2:%[0-9]+]]:gprc = COPY [[COPY1]].sub_32178 ; LE64-NEXT: [[COPY3:%[0-9]+]]:gprc_and_gprc_nor0 = COPY [[COPY]].sub_32179 ; LE64-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY3]], 1180 ; LE64-NEXT: BCC 12, killed [[CMPWI]], %bb.3181 ; LE64-NEXT: B %bb.1182 ; 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]], -1187 ; LE64-NEXT: [[DEF:%[0-9]+]]:g8rc = IMPLICIT_DEF188 ; LE64-NEXT: [[INSERT_SUBREG:%[0-9]+]]:g8rc = INSERT_SUBREG [[DEF]], killed [[ADDI]], %subreg.sub_32189 ; LE64-NEXT: [[RLDICL:%[0-9]+]]:g8rc_and_g8rc_nox0 = RLDICL killed [[INSERT_SUBREG]], 0, 32190 ; LE64-NEXT: [[ADDI8_:%[0-9]+]]:g8rc = nuw nsw ADDI8 killed [[RLDICL]], 1191 ; LE64-NEXT: MTCTR8loop killed [[ADDI8_]], implicit-def dead $ctr8192 ; 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, @a197 ; 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 $ctr8202 ; LE64-NEXT: BC killed [[DecreaseCTR8loop]], %bb.2203 ; LE64-NEXT: B %bb.3204 ; LE64-NEXT: {{ $}}205 ; LE64-NEXT: bb.3.for.end:206 ; LE64-NEXT: BLR8 implicit $lr8, implicit $rm207entry:208 %cmp1 = icmp sgt i32 %d, 0209 br i1 %cmp1, label %for.body, label %for.end210 211for.body: ; preds = %entry, %for.body212 %i.02 = phi i32 [ %inc, %for.body ], [ 0, %entry ]213 %0 = load volatile i32, ptr @a, align 4214 %add = add nsw i32 %0, %c215 store volatile i32 %add, ptr @a, align 4216 %inc = add nsw i32 %i.02, 1217 %exitcond = icmp eq i32 %inc, %d218 br i1 %exitcond, label %for.end, label %for.body219 220for.end: ; preds = %for.body, %entry221 ret void222}223 224define void @test3(i32 %c, i32 %d) nounwind {225 ; AIX64-LABEL: name: test3226 ; AIX64: bb.0.entry:227 ; AIX64-NEXT: successors: %bb.1(0x50000000), %bb.3(0x30000000)228 ; AIX64-NEXT: liveins: $x3, $x4229 ; AIX64-NEXT: {{ $}}230 ; AIX64-NEXT: [[COPY:%[0-9]+]]:g8rc = COPY $x4231 ; AIX64-NEXT: [[COPY1:%[0-9]+]]:g8rc = COPY $x3232 ; AIX64-NEXT: [[COPY2:%[0-9]+]]:gprc = COPY [[COPY1]].sub_32233 ; AIX64-NEXT: [[COPY3:%[0-9]+]]:gprc_and_gprc_nor0 = COPY [[COPY]].sub_32234 ; AIX64-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY3]], 1235 ; AIX64-NEXT: BCC 12, killed [[CMPWI]], %bb.3236 ; AIX64-NEXT: B %bb.1237 ; 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]], -1242 ; AIX64-NEXT: [[DEF:%[0-9]+]]:g8rc = IMPLICIT_DEF243 ; AIX64-NEXT: [[INSERT_SUBREG:%[0-9]+]]:g8rc = INSERT_SUBREG [[DEF]], killed [[ADDI]], %subreg.sub_32244 ; AIX64-NEXT: [[RLDICL:%[0-9]+]]:g8rc_and_g8rc_nox0 = RLDICL killed [[INSERT_SUBREG]], 0, 32245 ; AIX64-NEXT: [[ADDI8_:%[0-9]+]]:g8rc = nuw nsw ADDI8 killed [[RLDICL]], 1246 ; AIX64-NEXT: MTCTR8loop killed [[ADDI8_]], implicit-def dead $ctr8247 ; AIX64-NEXT: [[LI:%[0-9]+]]:gprc = LI 0248 ; 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.2253 ; 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 $ctr8259 ; AIX64-NEXT: BC killed [[DecreaseCTR8loop]], %bb.2260 ; AIX64-NEXT: B %bb.3261 ; AIX64-NEXT: {{ $}}262 ; AIX64-NEXT: bb.3.for.end:263 ; AIX64-NEXT: BLR8 implicit $lr8, implicit $rm264 ;265 ; AIX32-LABEL: name: test3266 ; AIX32: bb.0.entry:267 ; AIX32-NEXT: successors: %bb.1(0x50000000), %bb.3(0x30000000)268 ; AIX32-NEXT: liveins: $r3, $r4269 ; AIX32-NEXT: {{ $}}270 ; AIX32-NEXT: [[COPY:%[0-9]+]]:gprc = COPY $r4271 ; AIX32-NEXT: [[COPY1:%[0-9]+]]:gprc = COPY $r3272 ; AIX32-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY]], 1273 ; AIX32-NEXT: BCC 12, killed [[CMPWI]], %bb.3274 ; AIX32-NEXT: B %bb.1275 ; 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 $ctr280 ; AIX32-NEXT: [[LI:%[0-9]+]]:gprc = LI 0281 ; 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.2286 ; 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 $ctr292 ; AIX32-NEXT: BC killed [[DecreaseCTRloop]], %bb.2293 ; AIX32-NEXT: B %bb.3294 ; AIX32-NEXT: {{ $}}295 ; AIX32-NEXT: bb.3.for.end:296 ; AIX32-NEXT: BLR implicit $lr, implicit $rm297 ;298 ; LE64-LABEL: name: test3299 ; LE64: bb.0.entry:300 ; LE64-NEXT: successors: %bb.1(0x50000000), %bb.3(0x30000000)301 ; LE64-NEXT: liveins: $x3, $x4302 ; LE64-NEXT: {{ $}}303 ; LE64-NEXT: [[COPY:%[0-9]+]]:g8rc = COPY $x4304 ; LE64-NEXT: [[COPY1:%[0-9]+]]:g8rc = COPY $x3305 ; LE64-NEXT: [[COPY2:%[0-9]+]]:gprc = COPY [[COPY1]].sub_32306 ; LE64-NEXT: [[COPY3:%[0-9]+]]:gprc_and_gprc_nor0 = COPY [[COPY]].sub_32307 ; LE64-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY3]], 1308 ; LE64-NEXT: BCC 12, killed [[CMPWI]], %bb.3309 ; LE64-NEXT: B %bb.1310 ; 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]], -1315 ; LE64-NEXT: [[DEF:%[0-9]+]]:g8rc = IMPLICIT_DEF316 ; LE64-NEXT: [[INSERT_SUBREG:%[0-9]+]]:g8rc = INSERT_SUBREG [[DEF]], killed [[ADDI]], %subreg.sub_32317 ; LE64-NEXT: [[RLDICL:%[0-9]+]]:g8rc_and_g8rc_nox0 = RLDICL killed [[INSERT_SUBREG]], 0, 32318 ; LE64-NEXT: [[ADDI8_:%[0-9]+]]:g8rc = nuw nsw ADDI8 killed [[RLDICL]], 1319 ; LE64-NEXT: MTCTR8loop killed [[ADDI8_]], implicit-def dead $ctr8320 ; LE64-NEXT: [[LI:%[0-9]+]]:gprc = LI 0321 ; 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.2326 ; LE64-NEXT: [[ADDIStocHA8_:%[0-9]+]]:g8rc_and_g8rc_nox0 = ADDIStocHA8 $x2, @a327 ; 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 $ctr8333 ; LE64-NEXT: BC killed [[DecreaseCTR8loop]], %bb.2334 ; LE64-NEXT: B %bb.3335 ; LE64-NEXT: {{ $}}336 ; LE64-NEXT: bb.3.for.end:337 ; LE64-NEXT: BLR8 implicit $lr8, implicit $rm338entry:339 %cmp1 = icmp sgt i32 %d, 0340 br i1 %cmp1, label %for.body, label %for.end341 342for.body: ; preds = %entry, %for.body343 %i.02 = phi i32 [ %inc, %for.body ], [ 0, %entry ]344 %mul = mul nsw i32 %i.02, %c345 %0 = load volatile i32, ptr @a, align 4346 %add = add nsw i32 %0, %mul347 store volatile i32 %add, ptr @a, align 4348 %inc = add nsw i32 %i.02, 1349 %exitcond = icmp eq i32 %inc, %d350 br i1 %exitcond, label %for.end, label %for.body351 352for.end: ; preds = %for.body, %entry353 ret void354}355 356@tls_var = external thread_local global i8357 358define i32 @test4(i32 %inp) {359 ; AIX64-LABEL: name: test4360 ; AIX64: bb.0.entry:361 ; AIX64-NEXT: successors: %bb.3(0x40000000), %bb.4(0x40000000)362 ; AIX64-NEXT: liveins: $x3363 ; AIX64-NEXT: {{ $}}364 ; AIX64-NEXT: [[COPY:%[0-9]+]]:g8rc = COPY $x3365 ; AIX64-NEXT: [[COPY1:%[0-9]+]]:gprc_and_gprc_nor0 = COPY [[COPY]].sub_32366 ; AIX64-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY1]], 1367 ; AIX64-NEXT: [[LI:%[0-9]+]]:gprc_and_gprc_nor0 = LI 1368 ; AIX64-NEXT: BCC 12, [[CMPWI]], %bb.4369 ; 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.0377 ; AIX64-NEXT: [[SUBF:%[0-9]+]]:gprc = SUBF [[PHI]], [[COPY1]]378 ; AIX64-NEXT: [[DEF:%[0-9]+]]:g8rc = IMPLICIT_DEF379 ; AIX64-NEXT: [[INSERT_SUBREG:%[0-9]+]]:g8rc = INSERT_SUBREG [[DEF]], killed [[SUBF]], %subreg.sub_32380 ; AIX64-NEXT: [[RLDICL:%[0-9]+]]:g8rc_and_g8rc_nox0 = RLDICL killed [[INSERT_SUBREG]], 0, 32381 ; AIX64-NEXT: [[ADDI8_:%[0-9]+]]:g8rc = nuw nsw ADDI8 killed [[RLDICL]], 1382 ; AIX64-NEXT: MTCTR8loop killed [[ADDI8_]], implicit-def dead $ctr8383 ; 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 $ctr8388 ; AIX64-NEXT: BC killed [[DecreaseCTR8loop]], %bb.1389 ; AIX64-NEXT: B %bb.2390 ; 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_32396 ; AIX64-NEXT: [[ADD4_:%[0-9]+]]:gprc = ADD4 killed [[COPY2]], [[PHI]]397 ; AIX64-NEXT: [[DEF1:%[0-9]+]]:g8rc = IMPLICIT_DEF398 ; AIX64-NEXT: [[INSERT_SUBREG1:%[0-9]+]]:g8rc = INSERT_SUBREG [[DEF1]], killed [[ADD4_]], %subreg.sub_32399 ; AIX64-NEXT: $x3 = COPY [[INSERT_SUBREG1]]400 ; AIX64-NEXT: BLR8 implicit $lr8, implicit $rm, implicit $x3401 ;402 ; AIX32-LABEL: name: test4403 ; AIX32: bb.0.entry:404 ; AIX32-NEXT: successors: %bb.3(0x40000000), %bb.4(0x40000000)405 ; AIX32-NEXT: liveins: $r3406 ; AIX32-NEXT: {{ $}}407 ; AIX32-NEXT: [[COPY:%[0-9]+]]:gprc_and_gprc_nor0 = COPY $r3408 ; AIX32-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY]], 1409 ; AIX32-NEXT: [[LI:%[0-9]+]]:gprc_and_gprc_nor0 = LI 1410 ; AIX32-NEXT: BCC 12, [[CMPWI]], %bb.4411 ; 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.0419 ; AIX32-NEXT: [[SUBF:%[0-9]+]]:gprc_and_gprc_nor0 = SUBF [[PHI]], [[COPY]]420 ; AIX32-NEXT: [[ADDI:%[0-9]+]]:gprc = ADDI killed [[SUBF]], 1421 ; AIX32-NEXT: MTCTRloop killed [[ADDI]], implicit-def dead $ctr422 ; 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 $ctr427 ; AIX32-NEXT: BC killed [[DecreaseCTRloop]], %bb.1428 ; AIX32-NEXT: B %bb.2429 ; 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 $r3437 ;438 ; LE64-LABEL: name: test4439 ; LE64: bb.0.entry:440 ; LE64-NEXT: successors: %bb.1(0x80000000)441 ; LE64-NEXT: liveins: $x3442 ; LE64-NEXT: {{ $}}443 ; LE64-NEXT: [[COPY:%[0-9]+]]:g8rc = COPY $x3444 ; LE64-NEXT: [[COPY1:%[0-9]+]]:gprc_and_gprc_nor0 = COPY [[COPY]].sub_32445 ; LE64-NEXT: [[CMPWI:%[0-9]+]]:crrc = CMPWI [[COPY1]], 1446 ; LE64-NEXT: [[LI:%[0-9]+]]:gprc_and_gprc_nor0 = LI 1447 ; LE64-NEXT: [[ISEL:%[0-9]+]]:gprc = ISEL [[COPY1]], [[LI]], [[CMPWI]].sub_lt448 ; LE64-NEXT: [[SUBF:%[0-9]+]]:gprc = SUBF [[ISEL]], [[COPY1]]449 ; LE64-NEXT: [[DEF:%[0-9]+]]:g8rc = IMPLICIT_DEF450 ; LE64-NEXT: [[INSERT_SUBREG:%[0-9]+]]:g8rc = INSERT_SUBREG [[DEF]], killed [[SUBF]], %subreg.sub_32451 ; LE64-NEXT: [[RLDICL:%[0-9]+]]:g8rc_and_g8rc_nox0 = RLDICL killed [[INSERT_SUBREG]], 0, 32452 ; LE64-NEXT: [[ADDI8_:%[0-9]+]]:g8rc = nuw nsw ADDI8 killed [[RLDICL]], 1453 ; LE64-NEXT: MTCTR8loop killed [[ADDI8_]], implicit-def dead $ctr8454 ; 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 $ctr8459 ; LE64-NEXT: BC killed [[DecreaseCTR8loop]], %bb.1460 ; LE64-NEXT: B %bb.2461 ; LE64-NEXT: {{ $}}462 ; LE64-NEXT: bb.2.return:463 ; LE64-NEXT: [[ADDISgotTprelHA:%[0-9]+]]:g8rc_and_g8rc_nox0 = ADDISgotTprelHA $x2, @tls_var464 ; 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_var466 ; LE64-NEXT: [[COPY2:%[0-9]+]]:gprc = COPY [[ADD8TLS]].sub_32467 ; LE64-NEXT: [[ADD4_:%[0-9]+]]:gprc = ADD4 killed [[COPY2]], [[ISEL]]468 ; LE64-NEXT: [[DEF1:%[0-9]+]]:g8rc = IMPLICIT_DEF469 ; LE64-NEXT: [[INSERT_SUBREG1:%[0-9]+]]:g8rc = INSERT_SUBREG [[DEF1]], killed [[ADD4_]], %subreg.sub_32470 ; LE64-NEXT: $x3 = COPY [[INSERT_SUBREG1]]471 ; LE64-NEXT: BLR8 implicit $lr8, implicit $rm, implicit $x3472entry:473 br label %for.body474 475for.body: ; preds = %for.body, %entry476 %phi = phi i32 [ %dec, %for.body ], [ %inp, %entry ]477 %load = ptrtoint ptr @tls_var to i32478 %val = add i32 %load, %phi479 %dec = add i32 %phi, -1480 %cmp = icmp sgt i32 %phi, 1481 br i1 %cmp, label %for.body, label %return482 483return: ; preds = %for.body484 ret i32 %val485}486