1; Remove 'S' Scalar Dependencies #119345 2; Scalar dependencies are not handled correctly, so they were removed to avoid 3; miscompiles. The loop nest in this test case used to be interchanged, but it's 4; no longer triggering. XFAIL'ing this test to indicate that this test should 5; interchanged if scalar deps are handled correctly. 6; 7; XFAIL: * 8 9; RUN: opt -passes=loop-interchange -cache-line-size=64 -verify-loop-lcssa %s -pass-remarks-output=%t -disable-output 10; RUN: FileCheck -input-file %t %s 11 12; Tests for PR43797. 13 14@wdtdr = external dso_local global [5 x [5 x double]], align 16 15 16; CHECK: --- !Passed 17; CHECK-NEXT: Pass: loop-interchange 18; CHECK-NEXT: Name: Interchanged 19; CHECK-NEXT: Function: test1 20; CHECK-NEXT: Args: 21; CHECK-NEXT: - String: Loop interchanged with enclosing loop. 22; CHECK-NEXT: ... 23 24define void @test1() { 25entry: 26 br label %outer.header 27 28outer.header: ; preds = %for.inc27, %entry 29 %outer.idx = phi i64 [ 0, %entry ], [ %outer.idx.inc, %outer.latch ] 30 %arrayidx8 = getelementptr inbounds [5 x [5 x double]], ptr @wdtdr, i64 0, i64 0, i64 %outer.idx 31 br label %inner.header 32 33inner.header: ; preds = %for.inc, %for.body 34 %inner.idx = phi i64 [ 0, %outer.header ], [ %inner.idx.inc, %inner.latch] 35 %0 = load double, ptr %arrayidx8, align 8 36 store double undef, ptr %arrayidx8, align 8 37 br label %inner.latch 38 39inner.latch: ; preds = %for.body6 40 %inner.idx.inc = add nsw i64 %inner.idx, 1 41 br i1 false, label %inner.header, label %inner.exit 42 43inner.exit: ; preds = %for.inc 44 %outer.v = add nsw i64 %outer.idx, 1 45 br label %outer.latch 46 47outer.latch: ; preds = %for.end 48 %outer.idx.inc = add nsw i64 %outer.idx, 1 49 br i1 false, label %outer.header, label %outer.exit 50 51outer.exit: ; preds = %for.inc27 52 %exit1.lcssa = phi i64 [ %outer.v, %outer.latch ] 53 %exit2.lcssa = phi i64 [ %outer.idx.inc, %outer.latch ] 54 ret void 55} 56 57; CHECK: --- !Passed 58; CHECK-NEXT: Pass: loop-interchange 59; CHECK-NEXT: Name: Interchanged 60; CHECK-NEXT: Function: test2 61; CHECK-NEXT: Args: 62; CHECK-NEXT: - String: Loop interchanged with enclosing loop. 63; CHECK-NEXT: ... 64 65define void @test2(i1 %cond) { 66entry: 67 br i1 %cond, label %outer.header, label %outer.exit 68 69outer.header: ; preds = %for.inc27, %entry 70 %outer.idx = phi i64 [ 0, %entry ], [ %outer.idx.inc, %outer.latch ] 71 %arrayidx8 = getelementptr inbounds [5 x [5 x double]], ptr @wdtdr, i64 0, i64 0, i64 %outer.idx 72 br label %inner.header 73 74inner.header: ; preds = %for.inc, %for.body 75 %inner.idx = phi i64 [ 0, %outer.header ], [ %inner.idx.inc, %inner.latch] 76 %0 = load double, ptr %arrayidx8, align 8 77 store double undef, ptr %arrayidx8, align 8 78 br label %inner.latch 79 80inner.latch: ; preds = %for.body6 81 %inner.idx.inc = add nsw i64 %inner.idx , 1 82 br i1 false, label %inner.header, label %inner.exit 83 84inner.exit: ; preds = %for.inc 85 %outer.v = add nsw i64 %outer.idx, 1 86 br label %outer.latch 87 88outer.latch: ; preds = %for.end 89 %outer.idx.inc = add nsw i64 %outer.idx, 1 90 br i1 false, label %outer.header, label %outer.exit 91 92outer.exit: ; preds = %for.inc27 93 %exit1.lcssa = phi i64 [ 0, %entry ], [ %outer.v, %outer.latch ] 94 %exit2.lcssa = phi i64 [ 0, %entry ], [ %outer.idx.inc, %outer.latch ] 95 ret void 96} 97