brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.5 KiB · e77efe3 Raw
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