342 lines · plain
1; Remove 'S' Scalar Dependencies #1193452; Scalar dependencies are not handled correctly, so they were removed to avoid3; miscompiles. The loop nest in this test case used to be interchanged, but it's4; no longer triggering. XFAIL'ing this test to indicate that this test should5; interchanged if scalar deps are handled correctly.6;7; XFAIL: *8 9; RUN: opt < %s -passes=loop-interchange -cache-line-size=64 -pass-remarks-missed='loop-interchange' -verify-loop-lcssa -pass-remarks-output=%t -S10; RUN: FileCheck --input-file %t --check-prefix REMARK %s11 12target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"13 14@A = common global [100 x [100 x i32]] zeroinitializer15@C = common global [100 x [100 x i32]] zeroinitializer16@X = common global i32 017@Y = common global i64 018@F = common global float 0.019 20; We cannot interchange this loop at the moment, because iv.outer.next is21; produced in the outer loop latch and used in the loop exit block. If the inner22; loop body is not executed, the outer loop latch won't be executed either23; after interchanging.24; REMARK: UnsupportedExitPHI25; REMARK-NEXT: lcssa_0126 27define void @lcssa_01() {28entry:29 %cmp21 = icmp sgt i64 100, 130 br i1 %cmp21, label %outer.ph, label %for.end1631 32outer.ph: ; preds = %entry33 %cmp218 = icmp sgt i64 100, 134 br label %outer.header35 36outer.header: ; preds = %outer.inc, %outer.ph37 %iv.outer = phi i64 [ 1, %outer.ph ], [ %iv.outer.next, %outer.inc ]38 br i1 %cmp218, label %for.body3, label %outer.inc39 40for.body3: ; preds = %for.body3, %outer.header41 %iv.inner = phi i64 [ %iv.inner.next, %for.body3 ], [ 1, %outer.header ]42 %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], ptr @A, i64 0, i64 %iv.inner, i64 %iv.outer43 %vA = load i32, ptr %arrayidx544 %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], ptr @C, i64 0, i64 %iv.inner, i64 %iv.outer45 %vC = load i32, ptr %arrayidx946 %add = add nsw i32 %vA, %vC47 store i32 %add, ptr %arrayidx548 %iv.inner.next = add nuw nsw i64 %iv.inner, 149 %exitcond = icmp eq i64 %iv.inner.next, 10050 br i1 %exitcond, label %outer.inc, label %for.body351 52outer.inc: ; preds = %for.body3, %outer.header53 %iv.outer.next = add nsw i64 %iv.outer, 154 %cmp = icmp eq i64 %iv.outer.next, 10055 br i1 %cmp, label %outer.header, label %for.exit56 57for.exit: ; preds = %outer.inc58 %iv.outer.next.lcssa = phi i64 [ %iv.outer.next, %outer.inc ]59 store i64 %iv.outer.next.lcssa, ptr @Y60 br label %for.end1661 62for.end16: ; preds = %for.exit, %entry63 ret void64}65 66; REMARK: UnsupportedExitPHI67; REMARK-NEXT: lcssa_0268define void @lcssa_02() {69entry:70 %cmp21 = icmp sgt i64 100, 171 br i1 %cmp21, label %outer.ph, label %for.end1672 73outer.ph: ; preds = %entry74 %cmp218 = icmp sgt i64 100, 175 br label %outer.header76 77outer.header: ; preds = %outer.inc, %outer.ph78 %iv.outer = phi i64 [ 1, %outer.ph ], [ %iv.outer.next, %outer.inc ]79 br i1 %cmp218, label %for.body3, label %outer.inc80 81for.body3: ; preds = %for.body3, %outer.header82 %iv.inner = phi i64 [ %iv.inner.next, %for.body3 ], [ 1, %outer.header ]83 %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], ptr @A, i64 0, i64 %iv.inner, i64 %iv.outer84 %vA = load i32, ptr %arrayidx585 %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], ptr @C, i64 0, i64 %iv.inner, i64 %iv.outer86 %vC = load i32, ptr %arrayidx987 %add = add nsw i32 %vA, %vC88 store i32 %add, ptr %arrayidx589 %iv.inner.next = add nuw nsw i64 %iv.inner, 190 %exitcond = icmp eq i64 %iv.inner.next, 10091 br i1 %exitcond, label %outer.inc, label %for.body392 93outer.inc: ; preds = %for.body3, %outer.header94 %iv.inner.end = phi i64 [ 0, %outer.header ], [ %iv.inner.next, %for.body3 ]95 %iv.outer.next = add nsw i64 %iv.outer, 196 %cmp = icmp eq i64 %iv.outer.next, 10097 br i1 %cmp, label %outer.header, label %for.exit98 99for.exit: ; preds = %outer.inc100 %iv.inner.end.lcssa = phi i64 [ %iv.inner.end, %outer.inc ]101 store i64 %iv.inner.end.lcssa, ptr @Y102 br label %for.end16103 104for.end16: ; preds = %for.exit, %entry105 ret void106}107 108; REMARK: Interchanged109; REMARK-NEXT: lcssa_03110define void @lcssa_03() {111entry:112 br label %outer.header113 114outer.header: ; preds = %outer.inc, %entry115 %iv.outer = phi i64 [ 1, %entry ], [ %iv.outer.next, %outer.inc ]116 br label %for.body3117 118for.body3: ; preds = %for.body3, %outer.header119 %iv.inner = phi i64 [ %iv.inner.next, %for.body3 ], [ 1, %outer.header ]120 %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], ptr @A, i64 0, i64 %iv.inner, i64 %iv.outer121 %vA = load i32, ptr %arrayidx5122 %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], ptr @C, i64 0, i64 %iv.inner, i64 %iv.outer123 %vC = load i32, ptr %arrayidx9124 %add = add nsw i32 %vA, %vC125 store i32 %add, ptr %arrayidx5126 %iv.inner.next = add nuw nsw i64 %iv.inner, 1127 %exitcond = icmp eq i64 %iv.inner.next, 100128 br i1 %exitcond, label %outer.inc, label %for.body3129 130outer.inc: ; preds = %for.body3131 %iv.inner.lcssa = phi i64 [ %iv.inner, %for.body3 ]132 %iv.outer.next = add nsw i64 %iv.outer, 1133 %cmp = icmp eq i64 %iv.outer.next, 100134 br i1 %cmp, label %outer.header, label %for.exit135 136for.exit: ; preds = %outer.inc137 %iv.inner.lcssa.lcssa = phi i64 [ %iv.inner.lcssa, %outer.inc ]138 store i64 %iv.inner.lcssa.lcssa, ptr @Y139 br label %for.end16140 141for.end16: ; preds = %for.exit142 ret void143}144 145; Loops with floating point reductions are interchanged with fastmath.146; REMARK: Interchanged147; REMARK-NEXT: lcssa_04148 149define void @lcssa_04() {150entry:151 br label %outer.header152 153outer.header: ; preds = %outer.inc, %entry154 %iv.outer = phi i64 [ 1, %entry ], [ %iv.outer.next, %outer.inc ]155 %float.outer = phi float [ 1.000000e+00, %entry ], [ %float.outer.next, %outer.inc ]156 br label %for.body3157 158for.body3: ; preds = %for.body3, %outer.header159 %iv.inner = phi i64 [ %iv.inner.next, %for.body3 ], [ 1, %outer.header ]160 %float.inner = phi float [ %float.inner.next, %for.body3 ], [ %float.outer, %outer.header ]161 %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], ptr @A, i64 0, i64 %iv.inner, i64 %iv.outer162 %vA = load i32, ptr %arrayidx5163 %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], ptr @C, i64 0, i64 %iv.inner, i64 %iv.outer164 %vC = load i32, ptr %arrayidx9165 %add = add nsw i32 %vA, %vC166 %float.inner.next = fadd fast float %float.inner, 1.000000e+00167 store i32 %add, ptr %arrayidx5168 %iv.inner.next = add nuw nsw i64 %iv.inner, 1169 %exitcond = icmp eq i64 %iv.inner.next, 100170 br i1 %exitcond, label %outer.inc, label %for.body3171 172outer.inc: ; preds = %for.body3173 %float.outer.next = phi float [ %float.inner.next, %for.body3 ]174 %iv.outer.next = add nsw i64 %iv.outer, 1175 %cmp = icmp eq i64 %iv.outer.next, 100176 br i1 %cmp, label %outer.header, label %for.exit177 178for.exit: ; preds = %outer.inc179 %float.outer.lcssa = phi float [ %float.outer.next, %outer.inc ]180 store float %float.outer.lcssa, ptr @F181 br label %for.end16182 183for.end16: ; preds = %for.exit184 ret void185}186 187; PHI node in inner latch with multiple predecessors.188; REMARK: Interchanged189; REMARK-NEXT: lcssa_05190 191define void @lcssa_05(ptr %ptr, i1 %arg) {192entry:193 br label %outer.header194 195outer.header: ; preds = %outer.inc, %entry196 %iv.outer = phi i64 [ 1, %entry ], [ %iv.outer.next, %outer.inc ]197 br label %for.body3198 199for.body3: ; preds = %bb3, %outer.header200 %iv.inner = phi i64 [ %iv.inner.next, %bb3 ], [ 1, %outer.header ]201 br i1 %arg, label %bb2, label %bb3202 203bb2: ; preds = %for.body3204 %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], ptr @A, i64 0, i64 %iv.inner, i64 %iv.outer205 %vA = load i32, ptr %arrayidx5206 %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], ptr @C, i64 0, i64 %iv.inner, i64 %iv.outer207 %vC = load i32, ptr %arrayidx9208 %add = add nsw i32 %vA, %vC209 br label %bb3210 211bb3: ; preds = %bb2, %for.body3212 %addp = phi i32 [ %add, %bb2 ], [ 0, %for.body3 ]213 store i32 %addp, ptr %ptr214 %iv.inner.next = add nuw nsw i64 %iv.inner, 1215 %exitcond = icmp eq i64 %iv.inner.next, 100216 br i1 %exitcond, label %outer.inc, label %for.body3217 218outer.inc: ; preds = %bb3219 %iv.inner.lcssa = phi i64 [ %iv.inner, %bb3 ]220 %iv.outer.next = add nsw i64 %iv.outer, 1221 %cmp = icmp eq i64 %iv.outer.next, 100222 br i1 %cmp, label %outer.header, label %for.exit223 224for.exit: ; preds = %outer.inc225 %iv.inner.lcssa.lcssa = phi i64 [ %iv.inner.lcssa, %outer.inc ]226 store i64 %iv.inner.lcssa.lcssa, ptr @Y227 br label %for.end16228 229for.end16: ; preds = %for.exit230 ret void231}232 233; REMARK: UnsupportedExitPHI234; REMARK-NEXT: lcssa_06235 236define void @lcssa_06(ptr %ptr, ptr %ptr1, i1 %arg) {237entry:238 br label %outer.header239 240outer.header: ; preds = %outer.inc, %entry241 %iv.outer = phi i64 [ 1, %entry ], [ %iv.outer.next, %outer.inc ]242 br i1 %arg, label %for.body3, label %outer.inc243 244for.body3: ; preds = %for.body3, %outer.header245 %iv.inner = phi i64 [ %iv.inner.next, %for.body3 ], [ 1, %outer.header ]246 %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], ptr @A, i64 0, i64 %iv.inner, i64 %iv.outer247 %vA = load i32, ptr %arrayidx5248 %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], ptr @C, i64 0, i64 %iv.inner, i64 %iv.outer249 %vC = load i32, ptr %arrayidx9250 %add = add nsw i32 %vA, %vC251 store i32 %add, ptr %ptr1252 %iv.inner.next = add nuw nsw i64 %iv.inner, 1253 %exitcond = icmp eq i64 %iv.inner.next, 100254 br i1 %exitcond, label %outer.inc, label %for.body3255 256outer.inc: ; preds = %for.body3, %outer.header257 %sv = phi i64 [ 0, %outer.header ], [ 1, %for.body3 ]258 %iv.outer.next = add nsw i64 %iv.outer, 1259 %cmp = icmp eq i64 %iv.outer.next, 100260 br i1 %cmp, label %outer.header, label %for.exit261 262for.exit: ; preds = %outer.inc263 %sv.lcssa = phi i64 [ %sv, %outer.inc ]264 store i64 %sv.lcssa, ptr @Y265 br label %for.end16266 267for.end16: ; preds = %for.exit268 ret void269}270 271; REMARK: Interchanged272; REMARK-NEXT: lcssa_07273define void @lcssa_07() {274entry:275 br label %outer.header276 277outer.header: ; preds = %outer.inc, %entry278 %iv.outer = phi i64 [ 1, %entry ], [ %iv.outer.next, %outer.inc ]279 br label %for.body3280 281for.body3: ; preds = %for.body3, %outer.header282 %iv.inner = phi i64 [ %iv.inner.next, %for.body3 ], [ 1, %outer.header ]283 %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], ptr @A, i64 0, i64 %iv.inner, i64 %iv.outer284 %vA = load i32, ptr %arrayidx5285 %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], ptr @C, i64 0, i64 %iv.inner, i64 %iv.outer286 %vC = load i32, ptr %arrayidx9287 %add = add nsw i32 %vA, %vC288 store i32 %add, ptr %arrayidx5289 %iv.inner.next = add nuw nsw i64 %iv.inner, 1290 %exitcond = icmp eq i64 %iv.inner.next, 100291 br i1 %exitcond, label %outer.bb, label %for.body3292 293outer.bb: ; preds = %for.body3294 %iv.inner.lcssa = phi i64 [ %iv.inner, %for.body3 ]295 br label %outer.inc296 297outer.inc: ; preds = %outer.bb298 %iv.outer.next = add nsw i64 %iv.outer, 1299 %cmp = icmp eq i64 %iv.outer.next, 100300 br i1 %cmp, label %outer.header, label %for.exit301 302for.exit: ; preds = %outer.inc303 %iv.inner.lcssa.lcssa = phi i64 [ %iv.inner.lcssa, %outer.inc ]304 store i64 %iv.inner.lcssa.lcssa, ptr @Y305 br label %for.end16306 307for.end16: ; preds = %for.exit308 ret void309}310 311; Should not crash when the outer header branches to312; both the inner loop and the outer latch, and there313; is an lcssa phi node outside the loopnest.314; REMARK: Interchanged315; REMARK-NEXT: lcssa_08316define i64 @lcssa_08(ptr %Arr, i1 %arg) {317entry:318 br label %for1.header319 320for1.header: ; preds = %for1.inc, %entry321 %indvars.iv23 = phi i64 [ 0, %entry ], [ %indvars.iv.next24, %for1.inc ]322 br i1 %arg, label %for2, label %for1.inc323 324for2: ; preds = %for2, %for1.header325 %indvars.iv = phi i64 [ 0, %for1.header ], [ %indvars.iv.next.3, %for2 ]326 %arrayidx = getelementptr inbounds [100 x [100 x i64]], ptr %Arr, i64 0, i64 %indvars.iv, i64 %indvars.iv23327 %lv = load i64, ptr %arrayidx, align 4328 %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 1329 %exit1 = icmp eq i64 %indvars.iv.next.3, 100330 br i1 %exit1, label %for1.inc, label %for2331 332for1.inc: ; preds = %for2, %for1.header333 %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1334 %exit2 = icmp eq i64 %indvars.iv.next24, 100335 br i1 %exit2, label %for1.loopexit, label %for1.header336 337for1.loopexit: ; preds = %for1.inc338 %sum.outer.lcssa = phi i64 [ %indvars.iv23, %for1.inc ]339 ret i64 %sum.outer.lcssa340}341 342