diff options
| author | Eric Christopher <echristo@gmail.com> | 2019-04-17 02:12:23 +0000 |
|---|---|---|
| committer | Eric Christopher <echristo@gmail.com> | 2019-04-17 02:12:23 +0000 |
| commit | a86343512845c9c1fdbac865fea88aa5fce7142a (patch) | |
| tree | 666fc6353de19ad8b00e56b67edd33f24104e4a7 /llvm/test/Transforms/LoopInterchange | |
| parent | 7f8ca6e3679b3af951cb7a4b1377edfaa3244b93 (diff) | |
| download | bcm5719-llvm-a86343512845c9c1fdbac865fea88aa5fce7142a.tar.gz bcm5719-llvm-a86343512845c9c1fdbac865fea88aa5fce7142a.zip | |
Temporarily Revert "Add basic loop fusion pass."
As it's causing some bot failures (and per request from kbarton).
This reverts commit r358543/ab70da07286e618016e78247e4a24fcb84077fda.
llvm-svn: 358546
Diffstat (limited to 'llvm/test/Transforms/LoopInterchange')
17 files changed, 0 insertions, 1980 deletions
diff --git a/llvm/test/Transforms/LoopInterchange/call-instructions.ll b/llvm/test/Transforms/LoopInterchange/call-instructions.ll deleted file mode 100644 index d06708a9262..00000000000 --- a/llvm/test/Transforms/LoopInterchange/call-instructions.ll +++ /dev/null @@ -1,120 +0,0 @@ -; REQUIRES: asserts -; RUN: opt < %s -basicaa -loop-interchange -pass-remarks-missed='loop-interchange' -pass-remarks-output=%t -S \ -; RUN: -verify-dom-info -verify-loop-info -stats 2>&1 | FileCheck -check-prefix=STATS %s -; RUN: FileCheck --input-file=%t %s - -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -@A = common global [100 x [100 x i32]] zeroinitializer - -declare void @foo(i64 %a) -declare void @bar(i64 %a) readnone - -;;--------------------------------------Test case 01------------------------------------ -;; Not safe to interchange, because the called function `foo` is not marked as -;; readnone, so it could introduce dependences. -;; -;; for(int i=0;i<100;i++) { -;; for(int j=1;j<100;j++) { -;; foo(i); -;; A[j][i] = A[j][i]+k; -;; } -;; } - -; CHECK: --- !Missed -; CHECK-NEXT: Pass: loop-interchange -; CHECK-NEXT: Name: CallInst -; CHECK-NEXT: Function: interchange_01 -; CHECK-NEXT: Args: -; CHECK-NEXT - String: Cannot interchange loops due to call instruction. - -define void @interchange_01(i32 %k) { -entry: - br label %for1.header - -for1.header: - %indvars.iv23 = phi i64 [ 0, %entry ], [ %indvars.iv.next24, %for1.inc10 ] - br label %for2 - -for2: - %indvars.iv = phi i64 [ %indvars.iv.next, %for2 ], [ 1, %for1.header ] - call void @foo(i64 %indvars.iv23) - %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv, i64 %indvars.iv23 - %lv = load i32, i32* %arrayidx5 - %add = add nsw i32 %lv, %k - store i32 %add, i32* %arrayidx5 - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %exitcond = icmp eq i64 %indvars.iv, 99 - br i1 %exitcond, label %for2.loopexit , label %for2 - -for2.loopexit: - br label %for1.inc10 - -for1.inc10: - %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1 - %exitcond26 = icmp eq i64 %indvars.iv23, 99 - br i1 %exitcond26, label %for1.loopexit, label %for1.header - -for1.loopexit: - br label %exit - -exit: - ret void -} - -;;--------------------------------------Test case 02------------------------------------ -;; Safe to interchange, because the called function `bar` is marked as readnone, -;; so it cannot introduce dependences. -;; -;; for(int i=0;i<100;i++) { -;; for(int j=1;j<100;j++) { -;; bar(i); -;; A[j][i] = A[j][i]+k; -;; } -;; } - -; CHECK: --- !Passed -; CHECK-NEXT: Pass: loop-interchange -; CHECK-NEXT: Name: Interchanged -; CHECK-NEXT: Function: interchange_02 -; CHECK-NEXT: Args: -; CHECK-NEXT: - String: Loop interchanged with enclosing loop. -; CHECK-NEXT: ... - -define void @interchange_02(i32 %k) { -entry: - br label %for1.header - -for1.header: - %indvars.iv23 = phi i64 [ 0, %entry ], [ %indvars.iv.next24, %for1.inc10 ] - br label %for2 - -for2: - %indvars.iv = phi i64 [ %indvars.iv.next, %for2 ], [ 1, %for1.header ] - call void @bar(i64 %indvars.iv23) - %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv, i64 %indvars.iv23 - %lv = load i32, i32* %arrayidx5 - %add = add nsw i32 %lv, %k - store i32 %add, i32* %arrayidx5 - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %exitcond = icmp eq i64 %indvars.iv, 99 - br i1 %exitcond, label %for2.loopexit , label %for2 - -for2.loopexit: - br label %for1.inc10 - -for1.inc10: - %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1 - %exitcond26 = icmp eq i64 %indvars.iv23, 99 - br i1 %exitcond26, label %for1.loopexit, label %for1.header - -for1.loopexit: - br label %exit - -exit: - ret void -} - -; Check stats, we interchanged 1 out of 2 loops. -; STATS: 1 loop-interchange - Number of loops interchanged diff --git a/llvm/test/Transforms/LoopInterchange/currentLimitation.ll b/llvm/test/Transforms/LoopInterchange/currentLimitation.ll deleted file mode 100644 index 1a9d42dbb9a..00000000000 --- a/llvm/test/Transforms/LoopInterchange/currentLimitation.ll +++ /dev/null @@ -1,97 +0,0 @@ -; RUN: opt < %s -basicaa -loop-interchange -pass-remarks-missed='loop-interchange' \ -; RUN: -pass-remarks-output=%t -verify-loop-info -verify-dom-info -S | FileCheck -check-prefix=IR %s -; RUN: FileCheck --input-file=%t %s - -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -@A = common global [100 x [100 x i32]] zeroinitializer -@B = common global [100 x [100 x [100 x i32]]] zeroinitializer -@C = common global [100 x [100 x i64]] zeroinitializer - -;;--------------------------------------Test case 01------------------------------------ -;; [FIXME] This loop though valid is currently not interchanged due to the limitation that we cannot split the inner loop latch due to multiple use of inner induction -;; variable.(used to increment the loop counter and to access A[j+1][i+1] -;; for(int i=0;i<N-1;i++) -;; for(int j=1;j<N-1;j++) -;; A[j+1][i+1] = A[j+1][i+1] + k; - -; FIXME: Currently fails because of DA changes. -; IR-LABEL: @interchange_01 -; IR-NOT: split - -; CHECK: Name: Dependence -; CHECK-NEXT: Function: interchange_01 - -define void @interchange_01(i32 %k, i32 %N) { - entry: - %sub = add nsw i32 %N, -1 - %cmp26 = icmp sgt i32 %N, 1 - br i1 %cmp26, label %for.cond1.preheader.lr.ph, label %for.end17 - - for.cond1.preheader.lr.ph: - %cmp324 = icmp sgt i32 %sub, 1 - %0 = add i32 %N, -2 - %1 = sext i32 %sub to i64 - br label %for.cond1.preheader - - for.cond.loopexit: - %cmp = icmp slt i64 %indvars.iv.next29, %1 - br i1 %cmp, label %for.cond1.preheader, label %for.end17 - - for.cond1.preheader: - %indvars.iv28 = phi i64 [ 0, %for.cond1.preheader.lr.ph ], [ %indvars.iv.next29, %for.cond.loopexit ] - %indvars.iv.next29 = add nuw nsw i64 %indvars.iv28, 1 - br i1 %cmp324, label %for.body4, label %for.cond.loopexit - - for.body4: - %indvars.iv = phi i64 [ %indvars.iv.next, %for.body4 ], [ 1, %for.cond1.preheader ] - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %arrayidx7 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv.next, i64 %indvars.iv.next29 - %2 = load i32, i32* %arrayidx7 - %add8 = add nsw i32 %2, %k - store i32 %add8, i32* %arrayidx7 - %lftr.wideiv = trunc i64 %indvars.iv to i32 - %exitcond = icmp eq i32 %lftr.wideiv, %0 - br i1 %exitcond, label %for.cond.loopexit, label %for.body4 - - for.end17: - ret void -} - -; When currently cannot interchange this loop, because transform currently -; expects the latches to be the exiting blocks too. - -; IR-LABEL: @interchange_02 -; IR-NOT: split -; -; CHECK: Name: ExitingNotLatch -; CHECK-NEXT: Function: interchange_02 -define void @interchange_02(i64 %k, i64 %N) { -entry: - br label %for1.header - -for1.header: - %j23 = phi i64 [ 0, %entry ], [ %j.next24, %for1.inc10 ] - br label %for2 - -for2: - %j = phi i64 [ %j.next, %latch ], [ 0, %for1.header ] - %arrayidx5 = getelementptr inbounds [100 x [100 x i64]], [100 x [100 x i64]]* @C, i64 0, i64 %j, i64 %j23 - %lv = load i64, i64* %arrayidx5 - %add = add nsw i64 %lv, %k - store i64 %add, i64* %arrayidx5 - %exitcond = icmp eq i64 %j, 99 - br i1 %exitcond, label %for1.inc10, label %latch -latch: - %j.next = add nuw nsw i64 %j, 1 - br label %for2 - -for1.inc10: - %j.next24 = add nuw nsw i64 %j23, 1 - %exitcond26 = icmp eq i64 %j23, 99 - br i1 %exitcond26, label %for.end12, label %for1.header - -for.end12: - ret void -} diff --git a/llvm/test/Transforms/LoopInterchange/debuginfo.ll b/llvm/test/Transforms/LoopInterchange/debuginfo.ll deleted file mode 100644 index c35fda0c9bb..00000000000 --- a/llvm/test/Transforms/LoopInterchange/debuginfo.ll +++ /dev/null @@ -1,70 +0,0 @@ -; RUN: opt < %s -basicaa -loop-interchange -pass-remarks='loop-interchange' -pass-remarks-output=%t -S \ -; RUN: -verify-dom-info -verify-loop-info | FileCheck %s -; RUN: FileCheck -check-prefix=REMARK --input-file=%t %s - - -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -@A = common global [100 x [100 x i64]] zeroinitializer - -;; for(int i=0;i<100;i++) -;; for(int j=0;j<100;j++) -;; A[j][i] = A[j][i]+k; - -; REMARK: Name: Interchanged -; REMARK-NEXT: Function: interchange_01 -; CHECK: split - -define void @interchange_01(i64 %k, i64 %N) !dbg !5 { -entry: - br label %for1.header - -for1.header: - %j23 = phi i64 [ 0, %entry ], [ %j.next24, %for1.inc10 ] - call void @llvm.dbg.value(metadata i64 %j, metadata !13, metadata !DIExpression()), !dbg !14 - br label %for2 - -for2: - %j = phi i64 [ %j.next, %for2 ], [ 0, %for1.header ] - call void @llvm.dbg.value(metadata i64 %j, metadata !13, metadata !DIExpression()), !dbg !14 - %arrayidx5 = getelementptr inbounds [100 x [100 x i64]], [100 x [100 x i64]]* @A, i64 0, i64 %j, i64 %j23 - %lv = load i64, i64* %arrayidx5 - %add = add nsw i64 %lv, %k - store i64 %add, i64* %arrayidx5 - %j.next = add nuw nsw i64 %j, 1 - %exitcond = icmp eq i64 %j, 99 - call void @llvm.dbg.value(metadata i64 %j, metadata !13, metadata !DIExpression()), !dbg !14 - br i1 %exitcond, label %for1.inc10, label %for2 - -for1.inc10: - %j.next24 = add nuw nsw i64 %j23, 1 - call void @llvm.dbg.value(metadata i64 %j, metadata !13, metadata !DIExpression()), !dbg !14 - %exitcond26 = icmp eq i64 %j23, 99 - br i1 %exitcond26, label %for.end12, label %for1.header - -for.end12: - ret void -} - -; Function Attrs: nounwind readnone speculatable -declare void @llvm.dbg.value(metadata, metadata, metadata) - -!llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!3, !4} - -!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2) -!1 = !DIFile(filename: "test.c", directory: "/test") -!2 = !{} -!3 = !{i32 2, !"Dwarf Version", i32 4} -!4 = !{i32 2, !"Debug Info Version", i32 3} -!5 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12) -!6 = !DISubroutineType(types: !7) -!7 = !{null, !8, !8, !11} -!8 = !DIDerivedType(tag: DW_TAG_restrict_type, baseType: !9) -!9 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !10, size: 32, align: 32) -!10 = !DIBasicType(name: "float", size: 32, align: 32, encoding: DW_ATE_float) -!11 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed) -!12 = !{!13} -!13 = !DILocalVariable(name: "a", arg: 1, scope: !5, file: !1, line: 1, type: !8) -!14 = !DILocation(line: 1, column: 27, scope: !5) diff --git a/llvm/test/Transforms/LoopInterchange/inner-only-reductions.ll b/llvm/test/Transforms/LoopInterchange/inner-only-reductions.ll deleted file mode 100644 index 7c77b10dd8e..00000000000 --- a/llvm/test/Transforms/LoopInterchange/inner-only-reductions.ll +++ /dev/null @@ -1,124 +0,0 @@ -; RUN: opt < %s -basicaa -loop-interchange -pass-remarks-missed='loop-interchange' -pass-remarks-output=%t -S \ -; RUN: -verify-dom-info -verify-loop-info -verify-loop-lcssa 2>&1 | FileCheck -check-prefix=IR %s -; RUN: FileCheck --input-file=%t %s - -; Inner loop only reductions are not supported currently. See discussion at -; D53027 for more information on the required checks. - -@A = common global [500 x [500 x i32]] zeroinitializer -@X = common global i32 0 -@B = common global [500 x [500 x i32]] zeroinitializer -@Y = common global i32 0 - -;; global X - -;; for( int i=1;i<N;i++) -;; for( int j=1;j<N;j++) -;; X+=A[j][i]; - -; CHECK: --- !Missed -; CHECK-NEXT: Pass: loop-interchange -; CHECK-NEXT: Name: UnsupportedPHI -; CHECK-NEXT: Function: reduction_01 - -; IR-LABEL: @reduction_01( -; IR-NOT: split - -define void @reduction_01(i32 %N) { -entry: - %cmp16 = icmp sgt i32 %N, 1 - br i1 %cmp16, label %for.body3.lr.ph, label %for.end8 - -for.body3.lr.ph: ; preds = %for.cond1.for.inc6_crit_edge, %entry - %indvars.iv18 = phi i64 [ %indvars.iv.next19, %for.cond1.for.inc6_crit_edge ], [ 1, %entry ] - %X.promoted = load i32, i32* @X - br label %for.body3 - -for.body3: ; preds = %for.body3, %for.body3.lr.ph - %indvars.iv = phi i64 [ 1, %for.body3.lr.ph ], [ %indvars.iv.next, %for.body3 ] - %add15 = phi i32 [ %X.promoted, %for.body3.lr.ph ], [ %add, %for.body3 ] - %arrayidx5 = getelementptr inbounds [500 x [500 x i32]], [500 x [500 x i32]]* @A, i64 0, i64 %indvars.iv, i64 %indvars.iv18 - %0 = load i32, i32* %arrayidx5 - %add = add nsw i32 %add15, %0 - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %lftr.wideiv = trunc i64 %indvars.iv.next to i32 - %exitcond = icmp eq i32 %lftr.wideiv, %N - br i1 %exitcond, label %for.cond1.for.inc6_crit_edge, label %for.body3 - -for.cond1.for.inc6_crit_edge: ; preds = %for.body3 - %add.lcssa = phi i32 [ %add, %for.body3 ] - store i32 %add.lcssa, i32* @X - %indvars.iv.next19 = add nuw nsw i64 %indvars.iv18, 1 - %lftr.wideiv20 = trunc i64 %indvars.iv.next19 to i32 - %exitcond21 = icmp eq i32 %lftr.wideiv20, %N - br i1 %exitcond21, label %for.end8, label %for.body3.lr.ph - -for.end8: ; preds = %for.cond1.for.inc6_crit_edge, %entry - ret void -} - -;; Not tightly nested. Do not interchange. -;; for( int i=1;i<N;i++) -;; for( int j=1;j<N;j++) { -;; for( int k=1;k<N;k++) { -;; X+=A[k][j]; -;; } -;; Y+=B[j][i]; -;; } - -;; Not tightly nested. Do not interchange. -;; Not interchanged hence the phi's in the inner loop will not be split. - -; CHECK: --- !Missed -; CHECK-NEXT: Pass: loop-interchange -; CHECK-NEXT: Name: UnsupportedPHIOuter -; CHECK-NEXT: Function: reduction_03 - -; IR-LABEL: @reduction_03( -; IR-NOT: split - -define void @reduction_03(i32 %N) { -entry: - %cmp35 = icmp sgt i32 %N, 1 - br i1 %cmp35, label %for.cond4.preheader.lr.ph, label %for.end19 - -for.cond4.preheader.lr.ph: ; preds = %for.cond1.for.inc17_crit_edge, %entry - %indvars.iv41 = phi i64 [ %indvars.iv.next42, %for.cond1.for.inc17_crit_edge ], [ 1, %entry ] - %Y.promoted = load i32, i32* @Y - br label %for.body6.lr.ph - -for.body6.lr.ph: ; preds = %for.cond4.for.end_crit_edge, %for.cond4.preheader.lr.ph - %indvars.iv37 = phi i64 [ 1, %for.cond4.preheader.lr.ph ], [ %indvars.iv.next38, %for.cond4.for.end_crit_edge ] - %add1334 = phi i32 [ %Y.promoted, %for.cond4.preheader.lr.ph ], [ %add13, %for.cond4.for.end_crit_edge ] - %X.promoted = load i32, i32* @X - br label %for.body6 - -for.body6: ; preds = %for.body6, %for.body6.lr.ph - %indvars.iv = phi i64 [ 1, %for.body6.lr.ph ], [ %indvars.iv.next, %for.body6 ] - %arrayidx8 = getelementptr inbounds [500 x [500 x i32]], [500 x [500 x i32]]* @A, i64 0, i64 %indvars.iv, i64 %indvars.iv37 - %0 = load i32, i32* %arrayidx8 - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %lftr.wideiv = trunc i64 %indvars.iv.next to i32 - %exitcond = icmp eq i32 %lftr.wideiv, %N - br i1 %exitcond, label %for.cond4.for.end_crit_edge, label %for.body6 - -for.cond4.for.end_crit_edge: ; preds = %for.body6 - %arrayidx12 = getelementptr inbounds [500 x [500 x i32]], [500 x [500 x i32]]* @B, i64 0, i64 %indvars.iv37, i64 %indvars.iv41 - %1 = load i32, i32* %arrayidx12 - %add13 = add nsw i32 %add1334, %1 - %indvars.iv.next38 = add nuw nsw i64 %indvars.iv37, 1 - %lftr.wideiv39 = trunc i64 %indvars.iv.next38 to i32 - %exitcond40 = icmp eq i32 %lftr.wideiv39, %N - br i1 %exitcond40, label %for.cond1.for.inc17_crit_edge, label %for.body6.lr.ph - -for.cond1.for.inc17_crit_edge: ; preds = %for.cond4.for.end_crit_edge - %add13.lcssa = phi i32 [ %add13, %for.cond4.for.end_crit_edge ] - store i32 %add13.lcssa, i32* @Y - %indvars.iv.next42 = add nuw nsw i64 %indvars.iv41, 1 - %lftr.wideiv43 = trunc i64 %indvars.iv.next42 to i32 - %exitcond44 = icmp eq i32 %lftr.wideiv43, %N - br i1 %exitcond44, label %for.end19, label %for.cond4.preheader.lr.ph - -for.end19: ; preds = %for.cond1.for.inc17_crit_edge, %entry - ret void -} diff --git a/llvm/test/Transforms/LoopInterchange/interchange-flow-dep-outer.ll b/llvm/test/Transforms/LoopInterchange/interchange-flow-dep-outer.ll deleted file mode 100644 index 02a30f4c1f7..00000000000 --- a/llvm/test/Transforms/LoopInterchange/interchange-flow-dep-outer.ll +++ /dev/null @@ -1,76 +0,0 @@ -; REQUIRES: asserts -; RUN: opt < %s -basicaa -loop-interchange -verify-dom-info -verify-loop-info \ -; RUN: -S -debug 2>&1 | FileCheck %s - -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -@A = common global [100 x [100 x i32]] zeroinitializer -@B = common global [100 x i32] zeroinitializer -@C = common global [100 x [100 x i32]] zeroinitializer -@D = common global [100 x [100 x [100 x i32]]] zeroinitializer - -;; Test that a flow dependency in outer loop doesn't prevent interchange in -;; loops i and j. -;; -;; for (int k = 0; k < 100; ++k) { -;; T[k] = fn1(); -;; for (int i = 0; i < 1000; ++i) -;; for(int j = 1; j < 1000; ++j) -;; Arr[j][i] = Arr[j][i]+k; -;; fn2(T[k]); -;; } - -; CHECK: Processing Inner Loop Id = 2 and OuterLoopId = 1 -; CHECK: Loops interchanged. - -; CHECK: Processing Inner Loop Id = 1 and OuterLoopId = 0 -; CHECK: Not interchanging loops. Cannot prove legality. - -@T = internal global [100 x double] zeroinitializer, align 4 -@Arr = internal global [1000 x [1000 x i32]] zeroinitializer, align 4 - -define void @interchange_09(i32 %k) { -entry: - br label %for.body - -for.cond.cleanup: ; preds = %for.cond.cleanup4 - ret void - -for.body: ; preds = %for.cond.cleanup4, %entry - %indvars.iv45 = phi i64 [ 0, %entry ], [ %indvars.iv.next46, %for.cond.cleanup4 ] - %call = call double @fn1() - %arrayidx = getelementptr inbounds [100 x double], [100 x double]* @T, i64 0, i64 %indvars.iv45 - store double %call, double* %arrayidx, align 8 - br label %for.cond6.preheader - -for.cond6.preheader: ; preds = %for.cond.cleanup8, %for.body - %indvars.iv42 = phi i64 [ 0, %for.body ], [ %indvars.iv.next43, %for.cond.cleanup8 ] - br label %for.body9 - -for.cond.cleanup4: ; preds = %for.cond.cleanup8 - %tmp = load double, double* %arrayidx, align 8 - call void @fn2(double %tmp) - %indvars.iv.next46 = add nuw nsw i64 %indvars.iv45, 1 - %exitcond47 = icmp ne i64 %indvars.iv.next46, 100 - br i1 %exitcond47, label %for.body, label %for.cond.cleanup - -for.cond.cleanup8: ; preds = %for.body9 - %indvars.iv.next43 = add nuw nsw i64 %indvars.iv42, 1 - %exitcond44 = icmp ne i64 %indvars.iv.next43, 1000 - br i1 %exitcond44, label %for.cond6.preheader, label %for.cond.cleanup4 - -for.body9: ; preds = %for.body9, %for.cond6.preheader - %indvars.iv = phi i64 [ 1, %for.cond6.preheader ], [ %indvars.iv.next, %for.body9 ] - %arrayidx13 = getelementptr inbounds [1000 x [1000 x i32]], [1000 x [1000 x i32]]* @Arr, i64 0, i64 %indvars.iv, i64 %indvars.iv42 - %tmp1 = load i32, i32* %arrayidx13, align 4 - %tmp2 = trunc i64 %indvars.iv45 to i32 - %add = add nsw i32 %tmp1, %tmp2 - store i32 %add, i32* %arrayidx13, align 4 - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %exitcond = icmp ne i64 %indvars.iv.next, 1000 - br i1 %exitcond, label %for.body9, label %for.cond.cleanup8 -} - -declare double @fn1() readnone -declare void @fn2(double) readnone diff --git a/llvm/test/Transforms/LoopInterchange/interchange-insts-between-indvar.ll b/llvm/test/Transforms/LoopInterchange/interchange-insts-between-indvar.ll deleted file mode 100644 index 6653f0779e9..00000000000 --- a/llvm/test/Transforms/LoopInterchange/interchange-insts-between-indvar.ll +++ /dev/null @@ -1,48 +0,0 @@ -; RUN: opt < %s -basicaa -loop-interchange -verify-dom-info -verify-loop-info \ -; RUN: -S -pass-remarks=loop-interchange 2>&1 | FileCheck %s - -@A10 = local_unnamed_addr global [3 x [3 x i32]] zeroinitializer, align 16 - -;; Test to make sure we can handle zext instructions introduced by -;; IndVarSimplify. -;; -;; for (int i = 0; i < 2; ++i) -;; for(int j = 0; j < n; ++j) { -;; A[j][i] = i; -;; } - -; CHECK: Loop interchanged with enclosing loop. - -@A11 = local_unnamed_addr global [3 x [3 x i32]] zeroinitializer, align 16 - -define void @interchange_11(i32 %n) { -entry: - br label %for.cond1.preheader - -for.cond.loopexit: ; preds = %for.body4 - %exitcond28 = icmp ne i64 %indvars.iv.next27, 2 - br i1 %exitcond28, label %for.cond1.preheader, label %for.cond.cleanup - -for.cond1.preheader: ; preds = %for.cond.loopexit, %entry - %indvars.iv26 = phi i64 [ 0, %entry ], [ %indvars.iv.next27, %for.cond.loopexit ] - %indvars.iv.next27 = add nuw nsw i64 %indvars.iv26, 1 - br label %for.body4 - -for.cond.cleanup: ; preds = %for.cond.loopexit - ret void - -for.body4: ; preds = %for.body4, %for.cond1.preheader - %indvars.iv = phi i64 [ 0, %for.cond1.preheader ], [ %indvars.iv.next, %for.body4 ] -; The store below does not appear in the C snippet above. -; With two stores in the loop there may be WAW dependences, and interchange is illegal. -; %arrayidx6 = getelementptr inbounds [3 x [3 x i32]], [3 x [3 x i32]]* @A10, i64 0, i64 %indvars.iv, i64 %indvars.iv26 -; %tmp = trunc i64 %indvars.iv26 to i32 -; store i32 %tmp, i32* %arrayidx6, align 4 - %arrayidx10 = getelementptr inbounds [3 x [3 x i32]], [3 x [3 x i32]]* @A10, i64 0, i64 %indvars.iv, i64 %indvars.iv.next27 - %tmp1 = trunc i64 %indvars.iv to i32 - store i32 %tmp1, i32* %arrayidx10, align 4 - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %n.wide = zext i32 %n to i64 - %exitcond = icmp ne i64 %indvars.iv.next, %n.wide - br i1 %exitcond, label %for.body4, label %for.cond.loopexit -} diff --git a/llvm/test/Transforms/LoopInterchange/interchange-no-deps.ll b/llvm/test/Transforms/LoopInterchange/interchange-no-deps.ll deleted file mode 100644 index 5423648ce14..00000000000 --- a/llvm/test/Transforms/LoopInterchange/interchange-no-deps.ll +++ /dev/null @@ -1,95 +0,0 @@ -; REQUIRES: asserts -; RUN: opt < %s -loop-interchange -simplifycfg -pass-remarks-output=%t \ -; RUN: -pass-remarks=loop-interchange -pass-remarks-missed=loop-interchange -stats -S 2>&1 \ -; RUN: | FileCheck -check-prefix=STATS %s -; RUN: FileCheck -input-file %t %s - - -; no_deps_interchange just accesses a single nested array and can be interchange. -; CHECK: Name: Interchanged -; CHECK-NEXT: Function: no_deps_interchange -define i32 @no_deps_interchange([1024 x i32]* nocapture %Arr) local_unnamed_addr #0 { -entry: - br label %for1.header - -for1.header: ; preds = %entry, %for1.inc - %indvars.iv19 = phi i64 [ 0, %entry ], [ %indvars.iv.next20, %for1.inc ] - br label %for2 - -for2: ; preds = %for1.header, %for2 - %indvars.iv = phi i64 [ 0, %for1.header ], [ %indvars.iv.next, %for2 ] - %arrayidx6 = getelementptr inbounds [1024 x i32], [1024 x i32]* %Arr, i64 %indvars.iv, i64 %indvars.iv19 - store i32 0, i32* %arrayidx6, align 4 - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %exitcond = icmp ne i64 %indvars.iv.next, 1024 - br i1 %exitcond, label %for2, label %for1.inc - -for1.inc: - %indvars.iv.next20 = add nuw nsw i64 %indvars.iv19, 1 - %exitcond21 = icmp ne i64 %indvars.iv.next20, 1024 - br i1 %exitcond21, label %for1.header, label %exit - -exit: ; preds = %for1.inc - ret i32 0 - -} - -; Only the inner loop induction variable is used for memory accesses. -; Interchanging is not beneficial. -; CHECK: Name: InterchangeNotProfitable -; CHECK-NEXT: Function: no_bad_order -define i32 @no_bad_order(i32* %Arr) { -entry: - br label %for1.header - -for1.header: ; preds = %entry, %for1.inc - %indvars.iv19 = phi i64 [ 0, %entry ], [ %indvars.iv.next20, %for1.inc ] - br label %for2 - -for2: ; preds = %for1.header, %for2 - %indvars.iv = phi i64 [ 0, %for1.header ], [ %indvars.iv.next, %for2 ] - %arrayidx6 = getelementptr inbounds i32, i32* %Arr, i64 %indvars.iv - store i32 0, i32* %arrayidx6, align 4 - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %exitcond = icmp ne i64 %indvars.iv.next, 1024 - br i1 %exitcond, label %for2, label %for1.inc - -for1.inc: - %indvars.iv.next20 = add nuw nsw i64 %indvars.iv19, 1 - %exitcond21 = icmp ne i64 %indvars.iv.next20, 1024 - br i1 %exitcond21, label %for1.header, label %exit - -exit: ; preds = %for1.inc - ret i32 0 -} - -; No memory access using any induction variables, interchanging not beneficial. -; CHECK: Name: InterchangeNotProfitable -; CHECK-NEXT: Function: no_mem_instrs -define i32 @no_mem_instrs(i64* %ptr) { -entry: - br label %for1.header - -for1.header: ; preds = %entry, %for1.inc - %indvars.iv19 = phi i64 [ 0, %entry ], [ %indvars.iv.next20, %for1.inc ] - br label %for2 - -for2: ; preds = %for1.header, %for2 - %indvars.iv = phi i64 [ 0, %for1.header ], [ %indvars.iv.next, %for2 ] - store i64 %indvars.iv, i64* %ptr, align 4 - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %exitcond = icmp ne i64 %indvars.iv.next, 1024 - br i1 %exitcond, label %for2, label %for1.inc - -for1.inc: - %indvars.iv.next20 = add nuw nsw i64 %indvars.iv19, 1 - %exitcond21 = icmp ne i64 %indvars.iv.next20, 1024 - br i1 %exitcond21, label %for1.header, label %exit - -exit: ; preds = %for1.inc - ret i32 0 -} - - -; Check stats, we interchanged 1 out of 3 loops. -; STATS: 1 loop-interchange - Number of loops interchanged diff --git a/llvm/test/Transforms/LoopInterchange/interchangeable.ll b/llvm/test/Transforms/LoopInterchange/interchangeable.ll deleted file mode 100644 index a97981c5128..00000000000 --- a/llvm/test/Transforms/LoopInterchange/interchangeable.ll +++ /dev/null @@ -1,167 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt < %s -basicaa -loop-interchange -verify-dom-info -verify-loop-info -verify-scev -verify-loop-lcssa -S | FileCheck %s - -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -@A = common global [100 x [100 x i64]] zeroinitializer -@B = common global [100 x i64] zeroinitializer - -;; for(int i=0;i<100;i++) -;; for(int j=0;j<100;j++) -;; A[j][i] = A[j][i]+k; - -define void @interchange_01(i64 %k, i64 %N) { -; CHECK-LABEL: @interchange_01( -; CHECK-NEXT: entry: -; CHECK-NEXT: br label [[FOR2_PREHEADER:%.*]] -; CHECK: for1.header.preheader: -; CHECK-NEXT: br label [[FOR1_HEADER:%.*]] -; CHECK: for1.header: -; CHECK-NEXT: [[INDVARS_IV23:%.*]] = phi i64 [ [[INDVARS_IV_NEXT24:%.*]], [[FOR1_INC10:%.*]] ], [ 0, [[FOR1_HEADER_PREHEADER:%.*]] ] -; CHECK-NEXT: br label [[FOR2_SPLIT1:%.*]] -; CHECK: for2.preheader: -; CHECK-NEXT: br label [[FOR2:%.*]] -; CHECK: for2: -; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR2_SPLIT:%.*]] ], [ 0, [[FOR2_PREHEADER]] ] -; CHECK-NEXT: br label [[FOR1_HEADER_PREHEADER]] -; CHECK: for2.split1: -; CHECK-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds [100 x [100 x i64]], [100 x [100 x i64]]* @A, i64 0, i64 [[INDVARS_IV]], i64 [[INDVARS_IV23]] -; CHECK-NEXT: [[LV:%.*]] = load i64, i64* [[ARRAYIDX5]] -; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[LV]], [[K:%.*]] -; CHECK-NEXT: store i64 [[ADD]], i64* [[ARRAYIDX5]] -; CHECK-NEXT: br label [[FOR1_INC10]] -; CHECK: for2.split: -; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1 -; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[INDVARS_IV]], 99 -; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END12:%.*]], label [[FOR2]] -; CHECK: for1.inc10: -; CHECK-NEXT: [[INDVARS_IV_NEXT24]] = add nuw nsw i64 [[INDVARS_IV23]], 1 -; CHECK-NEXT: [[EXITCOND26:%.*]] = icmp eq i64 [[INDVARS_IV23]], 99 -; CHECK-NEXT: br i1 [[EXITCOND26]], label [[FOR2_SPLIT]], label [[FOR1_HEADER]] -; CHECK: for.end12: -; CHECK-NEXT: ret void -; -entry: - br label %for1.header - -for1.header: - %j23 = phi i64 [ 0, %entry ], [ %j.next24, %for1.inc10 ] - br label %for2 - -for2: - %j = phi i64 [ %j.next, %for2 ], [ 0, %for1.header ] - %arrayidx5 = getelementptr inbounds [100 x [100 x i64]], [100 x [100 x i64]]* @A, i64 0, i64 %j, i64 %j23 - %lv = load i64, i64* %arrayidx5 - %add = add nsw i64 %lv, %k - store i64 %add, i64* %arrayidx5 - %j.next = add nuw nsw i64 %j, 1 - %exitcond = icmp eq i64 %j, 99 - br i1 %exitcond, label %for1.inc10, label %for2 - -for1.inc10: - %j.next24 = add nuw nsw i64 %j23, 1 - %exitcond26 = icmp eq i64 %j23, 99 - br i1 %exitcond26, label %for.end12, label %for1.header - -for.end12: - ret void -} - -;; for(int i=0;i<100;i++) -;; for(int j=100;j>=0;j--) -;; A[j][i] = A[j][i]+k; - -define void @interchange_02(i64 %k) { -; CHECK-LABEL: @interchange_02( -; CHECK-NEXT: entry: -; CHECK-NEXT: br label [[FOR3_PREHEADER:%.*]] -; CHECK: for1.header.preheader: -; CHECK-NEXT: br label [[FOR1_HEADER:%.*]] -; CHECK: for1.header: -; CHECK-NEXT: [[INDVARS_IV19:%.*]] = phi i64 [ [[INDVARS_IV_NEXT20:%.*]], [[FOR1_INC10:%.*]] ], [ 0, [[FOR1_HEADER_PREHEADER:%.*]] ] -; CHECK-NEXT: br label [[FOR3_SPLIT1:%.*]] -; CHECK: for3.preheader: -; CHECK-NEXT: br label [[FOR3:%.*]] -; CHECK: for3: -; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR3_SPLIT:%.*]] ], [ 100, [[FOR3_PREHEADER]] ] -; CHECK-NEXT: br label [[FOR1_HEADER_PREHEADER]] -; CHECK: for3.split1: -; CHECK-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds [100 x [100 x i64]], [100 x [100 x i64]]* @A, i64 0, i64 [[INDVARS_IV]], i64 [[INDVARS_IV19]] -; CHECK-NEXT: [[TMP0:%.*]] = load i64, i64* [[ARRAYIDX5]] -; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[TMP0]], [[K:%.*]] -; CHECK-NEXT: store i64 [[ADD]], i64* [[ARRAYIDX5]] -; CHECK-NEXT: br label [[FOR1_INC10]] -; CHECK: for3.split: -; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], -1 -; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i64 [[INDVARS_IV]], 0 -; CHECK-NEXT: br i1 [[CMP2]], label [[FOR3]], label [[FOR_END11:%.*]] -; CHECK: for1.inc10: -; CHECK-NEXT: [[INDVARS_IV_NEXT20]] = add nuw nsw i64 [[INDVARS_IV19]], 1 -; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT20]], 100 -; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR3_SPLIT]], label [[FOR1_HEADER]] -; CHECK: for.end11: -; CHECK-NEXT: ret void -; -entry: - br label %for1.header - -for1.header: - %j19 = phi i64 [ 0, %entry ], [ %j.next20, %for1.inc10 ] - br label %for3 - -for3: - %j = phi i64 [ 100, %for1.header ], [ %j.next, %for3 ] - %arrayidx5 = getelementptr inbounds [100 x [100 x i64]], [100 x [100 x i64]]* @A, i64 0, i64 %j, i64 %j19 - %0 = load i64, i64* %arrayidx5 - %add = add nsw i64 %0, %k - store i64 %add, i64* %arrayidx5 - %j.next = add nsw i64 %j, -1 - %cmp2 = icmp sgt i64 %j, 0 - br i1 %cmp2, label %for3, label %for1.inc10 - -for1.inc10: - %j.next20 = add nuw nsw i64 %j19, 1 - %exitcond = icmp eq i64 %j.next20, 100 - br i1 %exitcond, label %for.end11, label %for1.header - -for.end11: - ret void -} - -;; Test to make sure we can handle output dependencies. -;; -;; for (int i = 1; i < 100; ++i) -;; for(int j = 1; j < 99; ++j) { -;; A[j][i] = i; -;; A[j][i+1] = j; -;; } -;; FIXME: DA misses this case after D35430 - -define void @interchange_10() { -entry: - br label %for1.header - -for1.header: - %j23 = phi i64 [ 1, %entry ], [ %j.next24, %for1.inc10 ] - %j.next24 = add nuw nsw i64 %j23, 1 - br label %for2 - -for2: - %j = phi i64 [ %j.next, %for2 ], [ 1, %for1.header ] - %j.next = add nuw nsw i64 %j, 1 - %arrayidx5 = getelementptr inbounds [100 x [100 x i64]], [100 x [100 x i64]]* @A, i64 0, i64 %j, i64 %j23 - store i64 %j, i64* %arrayidx5 - %arrayidx10 = getelementptr inbounds [100 x [100 x i64]], [100 x [100 x i64]]* @A, i64 0, i64 %j, i64 %j.next24 - store i64 %j23, i64* %arrayidx10 - %exitcond = icmp eq i64 %j, 99 - br i1 %exitcond, label %for1.inc10, label %for2 - -for1.inc10: - %exitcond26 = icmp eq i64 %j23, 98 - br i1 %exitcond26, label %for.end12, label %for1.header - -for.end12: - ret void - -} diff --git a/llvm/test/Transforms/LoopInterchange/lcssa.ll b/llvm/test/Transforms/LoopInterchange/lcssa.ll deleted file mode 100644 index edc9800ecd7..00000000000 --- a/llvm/test/Transforms/LoopInterchange/lcssa.ll +++ /dev/null @@ -1,300 +0,0 @@ -; RUN: opt < %s -basicaa -loop-interchange -pass-remarks-missed='loop-interchange' -verify-loop-lcssa -pass-remarks-output=%t -S -; RUN: FileCheck --input-file %t --check-prefix REMARK %s - -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -@A = common global [100 x [100 x i32]] zeroinitializer -@C = common global [100 x [100 x i32]] zeroinitializer -@X = common global i32 0 -@Y = common global i64 0 -@F = common global float 0.0 - -; We cannot interchange this loop at the moment, because iv.outer.next is -; produced in the outer loop latch and used in the loop exit block. If the inner -; loop body is not executed, the outer loop latch won't be executed either -; after interchanging. -; REMARK: UnsupportedExitPHI -; REMARK-NEXT: lcssa_01 - -define void @lcssa_01() { -entry: - %cmp21 = icmp sgt i64 100, 1 - br i1 %cmp21, label %outer.ph, label %for.end16 - -outer.ph: ; preds = %entry - %cmp218 = icmp sgt i64 100, 1 - br label %outer.header - -outer.header: ; preds = %outer.inc, %outer.ph - %iv.outer = phi i64 [ 1, %outer.ph ], [ %iv.outer.next, %outer.inc ] - br i1 %cmp218, label %for.body3, label %outer.inc - -for.body3: ; preds = %for.body3, %outer.header - %iv.inner = phi i64 [ %iv.inner.next, %for.body3 ], [ 1, %outer.header ] - %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %iv.inner, i64 %iv.outer - %vA = load i32, i32* %arrayidx5 - %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @C, i64 0, i64 %iv.inner, i64 %iv.outer - %vC = load i32, i32* %arrayidx9 - %add = add nsw i32 %vA, %vC - store i32 %add, i32* %arrayidx5 - %iv.inner.next = add nuw nsw i64 %iv.inner, 1 - %exitcond = icmp eq i64 %iv.inner.next, 100 - br i1 %exitcond, label %outer.inc, label %for.body3 - -outer.inc: ; preds = %for.body3, %outer.header - %iv.outer.next = add nsw i64 %iv.outer, 1 - %cmp = icmp eq i64 %iv.outer.next, 100 - br i1 %cmp, label %outer.header, label %for.exit - -for.exit: ; preds = %outer.inc - %iv.outer.next.lcssa = phi i64 [ %iv.outer.next, %outer.inc ] - store i64 %iv.outer.next.lcssa, i64* @Y - br label %for.end16 - -for.end16: ; preds = %for.exit, %entry - ret void -} - -; REMARK: UnsupportedExitPHI -; REMARK-NEXT: lcssa_02 -define void @lcssa_02() { -entry: - %cmp21 = icmp sgt i64 100, 1 - br i1 %cmp21, label %outer.ph, label %for.end16 - -outer.ph: ; preds = %entry - %cmp218 = icmp sgt i64 100, 1 - br label %outer.header - -outer.header: ; preds = %outer.inc, %outer.ph - %iv.outer = phi i64 [ 1, %outer.ph ], [ %iv.outer.next, %outer.inc ] - br i1 %cmp218, label %for.body3, label %outer.inc - -for.body3: ; preds = %for.body3, %outer.header - %iv.inner = phi i64 [ %iv.inner.next, %for.body3 ], [ 1, %outer.header ] - %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %iv.inner, i64 %iv.outer - %vA = load i32, i32* %arrayidx5 - %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @C, i64 0, i64 %iv.inner, i64 %iv.outer - %vC = load i32, i32* %arrayidx9 - %add = add nsw i32 %vA, %vC - store i32 %add, i32* %arrayidx5 - %iv.inner.next = add nuw nsw i64 %iv.inner, 1 - %exitcond = icmp eq i64 %iv.inner.next, 100 - br i1 %exitcond, label %outer.inc, label %for.body3 - -outer.inc: ; preds = %for.body3, %outer.header - %iv.inner.end = phi i64 [ 0, %outer.header ], [ %iv.inner.next, %for.body3 ] - %iv.outer.next = add nsw i64 %iv.outer, 1 - %cmp = icmp eq i64 %iv.outer.next, 100 - br i1 %cmp, label %outer.header, label %for.exit - -for.exit: ; preds = %outer.inc - %iv.inner.end.lcssa = phi i64 [ %iv.inner.end, %outer.inc ] - store i64 %iv.inner.end.lcssa, i64* @Y - br label %for.end16 - -for.end16: ; preds = %for.exit, %entry - ret void -} - -; REMARK: Interchanged -; REMARK-NEXT: lcssa_03 -define void @lcssa_03() { -entry: - br label %outer.header - -outer.header: ; preds = %outer.inc, %entry - %iv.outer = phi i64 [ 1, %entry ], [ %iv.outer.next, %outer.inc ] - br label %for.body3 - -for.body3: ; preds = %for.body3, %outer.header - %iv.inner = phi i64 [ %iv.inner.next, %for.body3 ], [ 1, %outer.header ] - %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %iv.inner, i64 %iv.outer - %vA = load i32, i32* %arrayidx5 - %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @C, i64 0, i64 %iv.inner, i64 %iv.outer - %vC = load i32, i32* %arrayidx9 - %add = add nsw i32 %vA, %vC - store i32 %add, i32* %arrayidx5 - %iv.inner.next = add nuw nsw i64 %iv.inner, 1 - %exitcond = icmp eq i64 %iv.inner.next, 100 - br i1 %exitcond, label %outer.inc, label %for.body3 - -outer.inc: ; preds = %for.body3 - %iv.inner.lcssa = phi i64 [ %iv.inner, %for.body3 ] - %iv.outer.next = add nsw i64 %iv.outer, 1 - %cmp = icmp eq i64 %iv.outer.next, 100 - br i1 %cmp, label %outer.header, label %for.exit - -for.exit: ; preds = %outer.inc - %iv.inner.lcssa.lcssa = phi i64 [ %iv.inner.lcssa, %outer.inc ] - store i64 %iv.inner.lcssa.lcssa, i64* @Y - br label %for.end16 - -for.end16: ; preds = %for.exit - ret void -} - -; FIXME: We currently do not support LCSSA phi nodes involving floating point -; types, as we fail to detect floating point reductions for now. -; REMARK: UnsupportedPHIOuter -; REMARK-NEXT: lcssa_04 - -define void @lcssa_04() { -entry: - br label %outer.header - -outer.header: ; preds = %outer.inc, %entry - %iv.outer = phi i64 [ 1, %entry ], [ %iv.outer.next, %outer.inc ] - %float.outer = phi float [ 1.000000e+00, %entry ], [ 2.000000e+00, %outer.inc ] - br label %for.body3 - -for.body3: ; preds = %for.body3, %outer.header - %iv.inner = phi i64 [ %iv.inner.next, %for.body3 ], [ 1, %outer.header ] - %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %iv.inner, i64 %iv.outer - %vA = load i32, i32* %arrayidx5 - %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @C, i64 0, i64 %iv.inner, i64 %iv.outer - %vC = load i32, i32* %arrayidx9 - %add = add nsw i32 %vA, %vC - store i32 %add, i32* %arrayidx5 - %iv.inner.next = add nuw nsw i64 %iv.inner, 1 - %exitcond = icmp eq i64 %iv.inner.next, 100 - br i1 %exitcond, label %outer.inc, label %for.body3 - -outer.inc: ; preds = %for.body3 - %iv.outer.next = add nsw i64 %iv.outer, 1 - %cmp = icmp eq i64 %iv.outer.next, 100 - br i1 %cmp, label %outer.header, label %for.exit - -for.exit: ; preds = %outer.inc - %float.outer.lcssa = phi float [ %float.outer, %outer.inc ] - store float %float.outer.lcssa, float* @F - br label %for.end16 - -for.end16: ; preds = %for.exit - ret void -} - -; PHI node in inner latch with multiple predecessors. -; REMARK: Interchanged -; REMARK-NEXT: lcssa_05 - -define void @lcssa_05(i32* %ptr) { -entry: - br label %outer.header - -outer.header: ; preds = %outer.inc, %entry - %iv.outer = phi i64 [ 1, %entry ], [ %iv.outer.next, %outer.inc ] - br label %for.body3 - -for.body3: ; preds = %bb3, %outer.header - %iv.inner = phi i64 [ %iv.inner.next, %bb3 ], [ 1, %outer.header ] - br i1 undef, label %bb2, label %bb3 - -bb2: ; preds = %for.body3 - %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %iv.inner, i64 %iv.outer - %vA = load i32, i32* %arrayidx5 - %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @C, i64 0, i64 %iv.inner, i64 %iv.outer - %vC = load i32, i32* %arrayidx9 - %add = add nsw i32 %vA, %vC - br label %bb3 - -bb3: ; preds = %bb2, %for.body3 - %addp = phi i32 [ %add, %bb2 ], [ 0, %for.body3 ] - store i32 %addp, i32* %ptr - %iv.inner.next = add nuw nsw i64 %iv.inner, 1 - %exitcond = icmp eq i64 %iv.inner.next, 100 - br i1 %exitcond, label %outer.inc, label %for.body3 - -outer.inc: ; preds = %bb3 - %iv.inner.lcssa = phi i64 [ %iv.inner, %bb3 ] - %iv.outer.next = add nsw i64 %iv.outer, 1 - %cmp = icmp eq i64 %iv.outer.next, 100 - br i1 %cmp, label %outer.header, label %for.exit - -for.exit: ; preds = %outer.inc - %iv.inner.lcssa.lcssa = phi i64 [ %iv.inner.lcssa, %outer.inc ] - store i64 %iv.inner.lcssa.lcssa, i64* @Y - br label %for.end16 - -for.end16: ; preds = %for.exit - ret void -} - -; REMARK: UnsupportedExitPHI -; REMARK-NEXT: lcssa_06 - -define void @lcssa_06(i64* %ptr, i32* %ptr1) { -entry: - br label %outer.header - -outer.header: ; preds = %outer.inc, %entry - %iv.outer = phi i64 [ 1, %entry ], [ %iv.outer.next, %outer.inc ] - br i1 undef, label %for.body3, label %outer.inc - -for.body3: ; preds = %for.body3, %outer.header - %iv.inner = phi i64 [ %iv.inner.next, %for.body3 ], [ 1, %outer.header ] - %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %iv.inner, i64 %iv.outer - %vA = load i32, i32* %arrayidx5 - %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @C, i64 0, i64 %iv.inner, i64 %iv.outer - %vC = load i32, i32* %arrayidx9 - %add = add nsw i32 %vA, %vC - store i32 %add, i32* %ptr1 - %iv.inner.next = add nuw nsw i64 %iv.inner, 1 - %exitcond = icmp eq i64 %iv.inner.next, 100 - br i1 %exitcond, label %outer.inc, label %for.body3 - -outer.inc: ; preds = %for.body3, %outer.header - %sv = phi i64 [ 0, %outer.header ], [ 1, %for.body3 ] - %iv.outer.next = add nsw i64 %iv.outer, 1 - %cmp = icmp eq i64 %iv.outer.next, 100 - br i1 %cmp, label %outer.header, label %for.exit - -for.exit: ; preds = %outer.inc - %sv.lcssa = phi i64 [ %sv, %outer.inc ] - store i64 %sv.lcssa, i64* @Y - br label %for.end16 - -for.end16: ; preds = %for.exit - ret void -} - -; REMARK: Interchanged -; REMARK-NEXT: lcssa_07 -define void @lcssa_07() { -entry: - br label %outer.header - -outer.header: ; preds = %outer.inc, %entry - %iv.outer = phi i64 [ 1, %entry ], [ %iv.outer.next, %outer.inc ] - br label %for.body3 - -for.body3: ; preds = %for.body3, %outer.header - %iv.inner = phi i64 [ %iv.inner.next, %for.body3 ], [ 1, %outer.header ] - %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %iv.inner, i64 %iv.outer - %vA = load i32, i32* %arrayidx5 - %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @C, i64 0, i64 %iv.inner, i64 %iv.outer - %vC = load i32, i32* %arrayidx9 - %add = add nsw i32 %vA, %vC - store i32 %add, i32* %arrayidx5 - %iv.inner.next = add nuw nsw i64 %iv.inner, 1 - %exitcond = icmp eq i64 %iv.inner.next, 100 - br i1 %exitcond, label %outer.bb, label %for.body3 - -outer.bb: ; preds = %for.body3 - %iv.inner.lcssa = phi i64 [ %iv.inner, %for.body3 ] - br label %outer.inc - -outer.inc: ; preds = %outer.bb - %iv.outer.next = add nsw i64 %iv.outer, 1 - %cmp = icmp eq i64 %iv.outer.next, 100 - br i1 %cmp, label %outer.header, label %for.exit - -for.exit: ; preds = %outer.inc - %iv.inner.lcssa.lcssa = phi i64 [ %iv.inner.lcssa, %outer.inc ] - store i64 %iv.inner.lcssa.lcssa, i64* @Y - br label %for.end16 - -for.end16: ; preds = %for.exit - ret void -} diff --git a/llvm/test/Transforms/LoopInterchange/loop-interchange-optimization-remarks.ll b/llvm/test/Transforms/LoopInterchange/loop-interchange-optimization-remarks.ll deleted file mode 100644 index b19a4a4875b..00000000000 --- a/llvm/test/Transforms/LoopInterchange/loop-interchange-optimization-remarks.ll +++ /dev/null @@ -1,217 +0,0 @@ -; Test optimization remarks generated by the LoopInterchange pass. -; -; RUN: opt < %s -basicaa -loop-interchange -verify-dom-info -verify-loop-info \ -; RUN: -pass-remarks-output=%t -pass-remarks-missed='loop-interchange' \ -; RUN: -pass-remarks='loop-interchange' -S -; RUN: cat %t | FileCheck %s - -@A = common global [100 x [100 x i32]] zeroinitializer -@B = common global [100 x [100 x i32]] zeroinitializer -@C = common global [100 x i32] zeroinitializer - -;;---------------------------------------Test case 01--------------------------------- -;; Loops interchange is not profitable. -;; for(int i=1;i<N;i++) -;; for(int j=1;j<N;j++) -;; A[i-1][j-1] = A[i - 1][j-1] + B[i][j]; - -define void @test01(i32 %N){ -entry: - %cmp31 = icmp sgt i32 %N, 1 - br i1 %cmp31, label %for.cond1.preheader.lr.ph, label %for.end19 - -for.cond1.preheader.lr.ph: - %0 = add i32 %N, -1 - br label %for.body3.lr.ph - -for.body3.lr.ph: - %indvars.iv34 = phi i64 [ 1, %for.cond1.preheader.lr.ph ], [ %indvars.iv.next35, %for.inc17 ] - %1 = add nsw i64 %indvars.iv34, -1 - br label %for.body3 - -for.body3: - %indvars.iv = phi i64 [ 1, %for.body3.lr.ph ], [ %indvars.iv.next, %for.body3 ] - %2 = add nsw i64 %indvars.iv, -1 - %arrayidx6 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %1, i64 %2 - %3 = load i32, i32* %arrayidx6 - %arrayidx10 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @B, i64 0, i64 %indvars.iv34, i64 %indvars.iv - %4 = load i32, i32* %arrayidx10 - %add = add nsw i32 %4, %3 - store i32 %add, i32* %arrayidx6 - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %lftr.wideiv = trunc i64 %indvars.iv to i32 - %exitcond = icmp eq i32 %lftr.wideiv, %0 - br i1 %exitcond, label %for.inc17, label %for.body3 - -for.inc17: - %indvars.iv.next35 = add nuw nsw i64 %indvars.iv34, 1 - %lftr.wideiv37 = trunc i64 %indvars.iv34 to i32 - %exitcond38 = icmp eq i32 %lftr.wideiv37, %0 - br i1 %exitcond38, label %for.end19, label %for.body3.lr.ph - -for.end19: - ret void -} - -; CHECK: --- !Missed -; CHECK-NEXT: Pass: loop-interchange -; CHECK-NEXT: Name: Dependence -; CHECK-NEXT: Function: test01 -; CHECK-NEXT: Args: -; CHECK-NEXT: - String: Cannot interchange loops due to dependences. -; CHECK-NEXT: ... - -;;--------------------------------------Test case 02------------------------------------ -;; [FIXME] This loop though valid is currently not interchanged due to the -;; limitation that we cannot split the inner loop latch due to multiple use of inner induction -;; variable.(used to increment the loop counter and to access A[j+1][i+1] -;; for(int i=0;i<N-1;i++) -;; for(int j=1;j<N-1;j++) -;; A[j+1][i+1] = A[j+1][i+1] + k; - -define void @test02(i32 %k, i32 %N) { - entry: - %sub = add nsw i32 %N, -1 - %cmp26 = icmp sgt i32 %N, 1 - br i1 %cmp26, label %for.cond1.preheader.lr.ph, label %for.end17 - - for.cond1.preheader.lr.ph: - %cmp324 = icmp sgt i32 %sub, 1 - %0 = add i32 %N, -2 - %1 = sext i32 %sub to i64 - br label %for.cond1.preheader - - for.cond.loopexit: - %cmp = icmp slt i64 %indvars.iv.next29, %1 - br i1 %cmp, label %for.cond1.preheader, label %for.end17 - - for.cond1.preheader: - %indvars.iv28 = phi i64 [ 0, %for.cond1.preheader.lr.ph ], [ %indvars.iv.next29, %for.cond.loopexit ] - %indvars.iv.next29 = add nuw nsw i64 %indvars.iv28, 1 - br i1 %cmp324, label %for.body4, label %for.cond.loopexit - - for.body4: - %indvars.iv = phi i64 [ %indvars.iv.next, %for.body4 ], [ 1, %for.cond1.preheader ] - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %arrayidx7 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv.next, i64 %indvars.iv.next29 - %2 = load i32, i32* %arrayidx7 - %add8 = add nsw i32 %2, %k - store i32 %add8, i32* %arrayidx7 - %lftr.wideiv = trunc i64 %indvars.iv to i32 - %exitcond = icmp eq i32 %lftr.wideiv, %0 - br i1 %exitcond, label %for.cond.loopexit, label %for.body4 - - for.end17: - ret void -} - -; CHECK: --- !Missed -; CHECK-NEXT: Pass: loop-interchange -; CHECK-NEXT: Name: Dependence -; CHECK-NEXT: Function: test02 -; CHECK-NEXT: Args: -; CHECK-NEXT: - String: Cannot interchange loops due to dependences. -; CHECK-NEXT: ... - -;;-----------------------------------Test case 03------------------------------- -;; Test to make sure we can handle output dependencies. -;; -;; for (int i = 0; i < 2; ++i) -;; for(int j = 0; j < 3; ++j) { -;; A[j][i] = i; -;; A[j][i+1] = j; -;; } - -@A10 = local_unnamed_addr global [3 x [3 x i32]] zeroinitializer, align 16 - -define void @test03() { -entry: - br label %for.cond1.preheader - -for.cond.loopexit: ; preds = %for.body4 - %exitcond28 = icmp ne i64 %indvars.iv.next27, 2 - br i1 %exitcond28, label %for.cond1.preheader, label %for.cond.cleanup - -for.cond1.preheader: ; preds = %for.cond.loopexit, %entry - %indvars.iv26 = phi i64 [ 0, %entry ], [ %indvars.iv.next27, %for.cond.loopexit ] - %indvars.iv.next27 = add nuw nsw i64 %indvars.iv26, 1 - br label %for.body4 - -for.cond.cleanup: ; preds = %for.cond.loopexit - ret void - -for.body4: ; preds = %for.body4, %for.cond1.preheader - %indvars.iv = phi i64 [ 0, %for.cond1.preheader ], [ %indvars.iv.next, %for.body4 ] - %arrayidx6 = getelementptr inbounds [3 x [3 x i32]], [3 x [3 x i32]]* @A10, i64 0, i64 %indvars.iv, i64 %indvars.iv26 - %tmp = trunc i64 %indvars.iv26 to i32 - store i32 %tmp, i32* %arrayidx6, align 4 - %arrayidx10 = getelementptr inbounds [3 x [3 x i32]], [3 x [3 x i32]]* @A10, i64 0, i64 %indvars.iv, i64 %indvars.iv.next27 - %tmp1 = trunc i64 %indvars.iv to i32 - store i32 %tmp1, i32* %arrayidx10, align 4 - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %exitcond = icmp ne i64 %indvars.iv.next, 3 - br i1 %exitcond, label %for.body4, label %for.cond.loopexit -} - -; CHECK: --- !Missed -; CHECK-NEXT: Pass: loop-interchange -; CHECK-NEXT: Name: Dependence -; CHECK-NEXT: Function: test03 -; CHECK-NEXT: Args: -; CHECK-NEXT: - String: Cannot interchange loops due to dependences. -; CHECK-NEXT: ... - -;;--------------------------------------Test case 04------------------------------------- -;; Loops not tightly nested are not interchanged -;; for(int j=0;j<N;j++) { -;; B[j] = j+k; -;; for(int i=0;i<N;i++) -;; A[j][i] = A[j][i]+B[j]; -;; } - -define void @test04(i32 %k, i32 %N){ -entry: - %cmp30 = icmp sgt i32 %N, 0 - br i1 %cmp30, label %for.body.lr.ph, label %for.end17 - -for.body.lr.ph: - %0 = add i32 %N, -1 - %1 = zext i32 %k to i64 - br label %for.body - -for.body: - %indvars.iv32 = phi i64 [ 0, %for.body.lr.ph ], [ %indvars.iv.next33, %for.inc15 ] - %2 = add nsw i64 %indvars.iv32, %1 - %arrayidx = getelementptr inbounds [100 x i32], [100 x i32]* @C, i64 0, i64 %indvars.iv32 - %3 = trunc i64 %2 to i32 - store i32 %3, i32* %arrayidx - br label %for.body3 - -for.body3: - %indvars.iv = phi i64 [ 0, %for.body ], [ %indvars.iv.next, %for.body3 ] - %arrayidx7 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv32, i64 %indvars.iv - %4 = load i32, i32* %arrayidx7 - %add10 = add nsw i32 %3, %4 - store i32 %add10, i32* %arrayidx7 - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %lftr.wideiv = trunc i64 %indvars.iv to i32 - %exitcond = icmp eq i32 %lftr.wideiv, %0 - br i1 %exitcond, label %for.inc15, label %for.body3 - -for.inc15: - %indvars.iv.next33 = add nuw nsw i64 %indvars.iv32, 1 - %lftr.wideiv35 = trunc i64 %indvars.iv32 to i32 - %exitcond36 = icmp eq i32 %lftr.wideiv35, %0 - br i1 %exitcond36, label %for.end17, label %for.body - -for.end17: - ret void -} - -; CHECK: --- !Missed -; CHECK-NEXT: Pass: loop-interchange -; CHECK-NEXT: Name: Dependence -; CHECK-NEXT: Function: test04 -; CHECK-NEXT: Args: -; CHECK-NEXT: - String: Cannot interchange loops due to dependences. -; CHECK-NEXT: ... diff --git a/llvm/test/Transforms/LoopInterchange/not-interchanged-dependencies-1.ll b/llvm/test/Transforms/LoopInterchange/not-interchanged-dependencies-1.ll deleted file mode 100644 index 11010039f08..00000000000 --- a/llvm/test/Transforms/LoopInterchange/not-interchanged-dependencies-1.ll +++ /dev/null @@ -1,44 +0,0 @@ -; REQUIRES: asserts -; RUN: opt < %s -basicaa -loop-interchange -verify-dom-info -verify-loop-info \ -; RUN: -S -debug 2>&1 | FileCheck %s - -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -@A = common global [100 x [100 x i32]] zeroinitializer -@B = common global [100 x i32] zeroinitializer - -;; Loops should not be interchanged in this case as it is not legal due to dependency. -;; for(int j=0;j<99;j++) -;; for(int i=0;i<99;i++) -;; A[j][i+1] = A[j+1][i]+k; - -; CHECK: Not interchanging loops. Cannot prove legality. - -define void @interchange_04(i32 %k){ -entry: - br label %for.cond1.preheader - -for.cond1.preheader: - %indvars.iv23 = phi i64 [ 0, %entry ], [ %indvars.iv.next24, %for.inc12 ] - %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1 - br label %for.body3 - -for.body3: - %indvars.iv = phi i64 [ 0, %for.cond1.preheader ], [ %indvars.iv.next, %for.body3 ] - %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv.next24, i64 %indvars.iv - %0 = load i32, i32* %arrayidx5 - %add6 = add nsw i32 %0, %k - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %arrayidx11 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv23, i64 %indvars.iv.next - store i32 %add6, i32* %arrayidx11 - %exitcond = icmp eq i64 %indvars.iv.next, 99 - br i1 %exitcond, label %for.inc12, label %for.body3 - -for.inc12: - %exitcond25 = icmp eq i64 %indvars.iv.next24, 99 - br i1 %exitcond25, label %for.end14, label %for.cond1.preheader - -for.end14: - ret void -} diff --git a/llvm/test/Transforms/LoopInterchange/not-interchanged-loop-nest-3.ll b/llvm/test/Transforms/LoopInterchange/not-interchanged-loop-nest-3.ll deleted file mode 100644 index 7dfbe119537..00000000000 --- a/llvm/test/Transforms/LoopInterchange/not-interchanged-loop-nest-3.ll +++ /dev/null @@ -1,56 +0,0 @@ -; REQUIRES: asserts -; RUN: opt < %s -basicaa -loop-interchange -verify-dom-info -verify-loop-info \ -; RUN: -S -debug 2>&1 | FileCheck %s - -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -@D = common global [100 x [100 x [100 x i32]]] zeroinitializer - -;; Test for interchange in loop nest greater than 2. -;; for(int i=0;i<100;i++) -;; for(int j=0;j<100;j++) -;; for(int k=0;k<100;k++) -;; D[i][k][j] = D[i][k][j]+t; - -; CHECK: Processing Inner Loop Id = 2 and OuterLoopId = 1 -; CHECK: Loops interchanged. - -; CHECK: Processing Inner Loop Id = 1 and OuterLoopId = 0 -; CHECK: Interchanging loops not profitable. - -define void @interchange_08(i32 %t){ -entry: - br label %for.cond1.preheader - -for.cond1.preheader: ; preds = %for.inc15, %entry - %i.028 = phi i32 [ 0, %entry ], [ %inc16, %for.inc15 ] - br label %for.cond4.preheader - -for.cond4.preheader: ; preds = %for.inc12, %for.cond1.preheader - %j.027 = phi i32 [ 0, %for.cond1.preheader ], [ %inc13, %for.inc12 ] - br label %for.body6 - -for.body6: ; preds = %for.body6, %for.cond4.preheader - %k.026 = phi i32 [ 0, %for.cond4.preheader ], [ %inc, %for.body6 ] - %arrayidx8 = getelementptr inbounds [100 x [100 x [100 x i32]]], [100 x [100 x [100 x i32]]]* @D, i32 0, i32 %i.028, i32 %k.026, i32 %j.027 - %0 = load i32, i32* %arrayidx8 - %add = add nsw i32 %0, %t - store i32 %add, i32* %arrayidx8 - %inc = add nuw nsw i32 %k.026, 1 - %exitcond = icmp eq i32 %inc, 100 - br i1 %exitcond, label %for.inc12, label %for.body6 - -for.inc12: ; preds = %for.body6 - %inc13 = add nuw nsw i32 %j.027, 1 - %exitcond29 = icmp eq i32 %inc13, 100 - br i1 %exitcond29, label %for.inc15, label %for.cond4.preheader - -for.inc15: ; preds = %for.inc12 - %inc16 = add nuw nsw i32 %i.028, 1 - %exitcond30 = icmp eq i32 %inc16, 100 - br i1 %exitcond30, label %for.end17, label %for.cond1.preheader - -for.end17: ; preds = %for.inc15 - ret void -} diff --git a/llvm/test/Transforms/LoopInterchange/not-interchanged-tightly-nested.ll b/llvm/test/Transforms/LoopInterchange/not-interchanged-tightly-nested.ll deleted file mode 100644 index 13f6e38914c..00000000000 --- a/llvm/test/Transforms/LoopInterchange/not-interchanged-tightly-nested.ll +++ /dev/null @@ -1,105 +0,0 @@ -; REQUIRES: asserts -; RUN: opt < %s -basicaa -loop-interchange -verify-dom-info -verify-loop-info \ -; RUN: -S -debug 2>&1 | FileCheck %s - -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -@A = common global [100 x [100 x i32]] zeroinitializer -@B = common global [100 x i32] zeroinitializer -@C = common global [100 x [100 x i32]] zeroinitializer -@D = common global [100 x [100 x [100 x i32]]] zeroinitializer - -;; Loops not tightly nested are not interchanged -;; for(int j=0;j<N;j++) { -;; B[j] = j+k; -;; for(int i=0;i<N;i++) -;; A[j][i] = A[j][i]+B[j]; -;; } - -; CHECK: Not interchanging loops. Cannot prove legality. - -define void @interchange_05(i32 %k, i32 %N){ -entry: - %cmp30 = icmp sgt i32 %N, 0 - br i1 %cmp30, label %for.body.lr.ph, label %for.end17 - -for.body.lr.ph: - %0 = add i32 %N, -1 - %1 = zext i32 %k to i64 - br label %for.body - -for.body: - %indvars.iv32 = phi i64 [ 0, %for.body.lr.ph ], [ %indvars.iv.next33, %for.inc15 ] - %2 = add nsw i64 %indvars.iv32, %1 - %arrayidx = getelementptr inbounds [100 x i32], [100 x i32]* @B, i64 0, i64 %indvars.iv32 - %3 = trunc i64 %2 to i32 - store i32 %3, i32* %arrayidx - br label %for.body3 - -for.body3: - %indvars.iv = phi i64 [ 0, %for.body ], [ %indvars.iv.next, %for.body3 ] - %arrayidx7 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv32, i64 %indvars.iv - %4 = load i32, i32* %arrayidx7 - %add10 = add nsw i32 %3, %4 - store i32 %add10, i32* %arrayidx7 - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %lftr.wideiv = trunc i64 %indvars.iv to i32 - %exitcond = icmp eq i32 %lftr.wideiv, %0 - br i1 %exitcond, label %for.inc15, label %for.body3 - -for.inc15: - %indvars.iv.next33 = add nuw nsw i64 %indvars.iv32, 1 - %lftr.wideiv35 = trunc i64 %indvars.iv32 to i32 - %exitcond36 = icmp eq i32 %lftr.wideiv35, %0 - br i1 %exitcond36, label %for.end17, label %for.body - -for.end17: - ret void -} - -declare void @foo(...) readnone - -;; Loops not tightly nested are not interchanged -;; for(int j=0;j<N;j++) { -;; foo(); -;; for(int i=2;i<N;i++) -;; A[j][i] = A[j][i]+k; -;; } - -; CHECK: Not interchanging loops. Cannot prove legality. - -define void @interchange_06(i32 %k, i32 %N) { -entry: - %cmp22 = icmp sgt i32 %N, 0 - br i1 %cmp22, label %for.body.lr.ph, label %for.end12 - -for.body.lr.ph: - %0 = add i32 %N, -1 - br label %for.body - -for.body: - %indvars.iv24 = phi i64 [ 0, %for.body.lr.ph ], [ %indvars.iv.next25, %for.inc10 ] - tail call void (...) @foo() - br label %for.body3 - -for.body3: - %indvars.iv = phi i64 [ %indvars.iv.next, %for.body3 ], [ 2, %for.body ] - %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv24, i64 %indvars.iv - %1 = load i32, i32* %arrayidx5 - %add = add nsw i32 %1, %k - store i32 %add, i32* %arrayidx5 - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %lftr.wideiv = trunc i64 %indvars.iv to i32 - %exitcond = icmp eq i32 %lftr.wideiv, %0 - br i1 %exitcond, label %for.inc10, label %for.body3 - -for.inc10: - %indvars.iv.next25 = add nuw nsw i64 %indvars.iv24, 1 - %lftr.wideiv26 = trunc i64 %indvars.iv24 to i32 - %exitcond27 = icmp eq i32 %lftr.wideiv26, %0 - br i1 %exitcond27, label %for.end12, label %for.body - -for.end12: - ret void -} diff --git a/llvm/test/Transforms/LoopInterchange/outer-only-reductions.ll b/llvm/test/Transforms/LoopInterchange/outer-only-reductions.ll deleted file mode 100644 index c58e7d3d272..00000000000 --- a/llvm/test/Transforms/LoopInterchange/outer-only-reductions.ll +++ /dev/null @@ -1,52 +0,0 @@ -; RUN: opt < %s -basicaa -loop-interchange -pass-remarks-missed='loop-interchange' -pass-remarks-output=%t -S \ -; RUN: -verify-dom-info -verify-loop-info -verify-loop-lcssa 2>&1 | FileCheck -check-prefix=IR %s -; RUN: FileCheck --input-file=%t %s - -; Outer loop only reductions are not supported currently. - -@A = common global [500 x [500 x i32]] zeroinitializer - -;; global X - -;; for( int i=1;i<N;i++) { -;; for( int j=1;j<N;j++) -;; ; -;; X+=A[j][i]; -;; } - -; CHECK: --- !Missed -; CHECK-NEXT: Pass: loop-interchange -; CHECK-NEXT: Name: UnsupportedPHI -; CHECK-NEXT: Function: reduction_01 - -; IR-LABEL: @reduction_01( -; IR-NOT: split - -define i32 @reduction_01(i32 %N) { -entry: - br label %outer.header - -outer.header: ; preds = %for.cond1.for.inc6_crit_edge, %entry - %indvars.iv18 = phi i64 [ %indvars.iv.next19, %outer.inc ], [ 1, %entry ] - %add15 = phi i32 [ 0, %entry ], [ %add, %outer.inc ] - br label %for.body3 - -for.body3: ; preds = %for.body3, %for.body3.lr.ph - %indvars.iv = phi i64 [ 1, %outer.header ], [ %indvars.iv.next, %for.body3 ] - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %lftr.wideiv = trunc i64 %indvars.iv.next to i32 - %exitcond = icmp eq i32 %lftr.wideiv, %N - br i1 %exitcond, label %outer.inc, label %for.body3 - -outer.inc: ; preds = %for.body3 - %arrayidx5 = getelementptr inbounds [500 x [500 x i32]], [500 x [500 x i32]]* @A, i64 0, i64 %indvars.iv, i64 %indvars.iv18 - %0 = load i32, i32* %arrayidx5 - %add = add nsw i32 %add15, %0 - %indvars.iv.next19 = add nuw nsw i64 %indvars.iv18, 1 - %lftr.wideiv20 = trunc i64 %indvars.iv.next19 to i32 - %exitcond21 = icmp eq i32 %lftr.wideiv20, %N - br i1 %exitcond21, label %for.end8, label %outer.header - -for.end8: ; preds = %for.cond1.for.inc6_crit_edge, %entry - ret i32 %add -} diff --git a/llvm/test/Transforms/LoopInterchange/phi-ordering.ll b/llvm/test/Transforms/LoopInterchange/phi-ordering.ll deleted file mode 100644 index 2854fe19f7a..00000000000 --- a/llvm/test/Transforms/LoopInterchange/phi-ordering.ll +++ /dev/null @@ -1,94 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt < %s -loop-interchange -verify-dom-info -verify-loop-info -verify-scev -verify-loop-lcssa -loop-interchange-threshold=-1000 -S 2>&1 | FileCheck %s -;; Checks the order of the inner phi nodes does not cause havoc. -;; The inner loop has a reduction into c. The IV is not the first phi. - -target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" -target triple = "armv8--linux-gnueabihf" - - - -; Function Attrs: norecurse nounwind -define void @test(i32 %T, [90 x i32]* noalias nocapture %C, i16* noalias nocapture readonly %A, i16* noalias nocapture readonly %B) local_unnamed_addr #0 { -; CHECK-LABEL: @test( -; CHECK-NEXT: entry: -; CHECK-NEXT: br label [[FOR3_PREHEADER:%.*]] -; CHECK: for1.header.preheader: -; CHECK-NEXT: br label [[FOR1_HEADER:%.*]] -; CHECK: for1.header: -; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[INC20:%.*]], [[FOR1_INC19:%.*]] ], [ 0, [[FOR1_HEADER_PREHEADER:%.*]] ] -; CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[I]], 90 -; CHECK-NEXT: br label [[FOR2_HEADER_PREHEADER:%.*]] -; CHECK: for2.header.preheader: -; CHECK-NEXT: br label [[FOR2_HEADER:%.*]] -; CHECK: for2.header: -; CHECK-NEXT: [[J:%.*]] = phi i32 [ [[INC17:%.*]], [[FOR2_INC16:%.*]] ], [ 0, [[FOR2_HEADER_PREHEADER]] ] -; CHECK-NEXT: br label [[FOR3_SPLIT1:%.*]] -; CHECK: for3.preheader: -; CHECK-NEXT: br label [[FOR3:%.*]] -; CHECK: for3: -; CHECK-NEXT: [[K:%.*]] = phi i32 [ [[INC:%.*]], [[FOR3_SPLIT:%.*]] ], [ 1, [[FOR3_PREHEADER]] ] -; CHECK-NEXT: br label [[FOR1_HEADER_PREHEADER]] -; CHECK: for3.split1: -; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[K]], [[MUL]] -; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i16, i16* [[A:%.*]], i32 [[ADD]] -; CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* [[ARRAYIDX]], align 2 -; CHECK-NEXT: [[ADD15:%.*]] = add nsw i16 [[TMP0]], 1 -; CHECK-NEXT: store i16 [[ADD15]], i16* [[ARRAYIDX]] -; CHECK-NEXT: br label [[FOR2_INC16]] -; CHECK: for3.split: -; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[K]], 1 -; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 90 -; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR1_LOOPEXIT:%.*]], label [[FOR3]] -; CHECK: for2.inc16: -; CHECK-NEXT: [[INC17]] = add nuw nsw i32 [[J]], 1 -; CHECK-NEXT: [[EXITCOND47:%.*]] = icmp eq i32 [[INC17]], 90 -; CHECK-NEXT: br i1 [[EXITCOND47]], label [[FOR1_INC19]], label [[FOR2_HEADER]] -; CHECK: for1.inc19: -; CHECK-NEXT: [[INC20]] = add nuw nsw i32 [[I]], 1 -; CHECK-NEXT: [[EXITCOND48:%.*]] = icmp eq i32 [[INC20]], 90 -; CHECK-NEXT: br i1 [[EXITCOND48]], label [[FOR3_SPLIT]], label [[FOR1_HEADER]] -; CHECK: for1.loopexit: -; CHECK-NEXT: br label [[EXIT:%.*]] -; CHECK: exit: -; CHECK-NEXT: ret void -; -entry: - br label %for1.header - -for1.header: ; preds = %entry - %i = phi i32 [ %inc20, %for1.inc19 ], [ 0, %entry ] - %mul = mul nsw i32 %i, 90 - br label %for2.header - -for2.header: ; preds = %for2.inc16, %for1.header - %j = phi i32 [ 0, %for1.header ], [ %inc17, %for2.inc16 ] - br label %for3 - -for3: ; preds = %for3, %for2.header - %k = phi i32 [ 1, %for2.header ], [ %inc, %for3 ] - %add = add nsw i32 %k, %mul - %arrayidx = getelementptr inbounds i16, i16* %A, i32 %add - %0 = load i16, i16* %arrayidx, align 2 - %add15 = add nsw i16 %0, 1 - store i16 %add15, i16* %arrayidx - %inc = add nuw nsw i32 %k, 1 - %exitcond = icmp eq i32 %inc, 90 - br i1 %exitcond, label %for2.inc16, label %for3 - -for2.inc16: ; preds = %for.body6 - %inc17 = add nuw nsw i32 %j, 1 - %exitcond47 = icmp eq i32 %inc17, 90 - br i1 %exitcond47, label %for1.inc19, label %for2.header - -for1.inc19: ; preds = %for2.inc16 - %inc20 = add nuw nsw i32 %i, 1 - %exitcond48 = icmp eq i32 %inc20, 90 - br i1 %exitcond48, label %for1.loopexit, label %for1.header - -for1.loopexit: ; preds = %for1.inc19 - br label %exit - -exit: ; preds = %for1.loopexit - ret void -} diff --git a/llvm/test/Transforms/LoopInterchange/profitability.ll b/llvm/test/Transforms/LoopInterchange/profitability.ll deleted file mode 100644 index 9fd217434c7..00000000000 --- a/llvm/test/Transforms/LoopInterchange/profitability.ll +++ /dev/null @@ -1,165 +0,0 @@ -; RUN: opt < %s -loop-interchange -pass-remarks-output=%t -verify-dom-info -verify-loop-info \ -; RUN: -pass-remarks=loop-interchange -pass-remarks-missed=loop-interchange -; RUN: FileCheck -input-file %t %s - -;; We test profitability model in these test cases. - -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -@A = common global [100 x [100 x i32]] zeroinitializer -@B = common global [100 x [100 x i32]] zeroinitializer - -;;---------------------------------------Test case 01--------------------------------- -;; Loops interchange will result in code vectorization and hence profitable. Check for interchange. -;; for(int i=1;i<100;i++) -;; for(int j=1;j<100;j++) -;; A[j][i] = A[j - 1][i] + B[j][i]; -;; FIXME: DA misses this case after D35430 - -; CHECK: Name: Dependence -; CHECK-NEXT: Function: interchange_01 -define void @interchange_01() { -entry: - br label %for2.preheader - -for2.preheader: - %i30 = phi i64 [ 1, %entry ], [ %i.next31, %for1.inc14 ] - br label %for2 - -for2: - %j = phi i64 [ %i.next, %for2 ], [ 1, %for2.preheader ] - %j.prev = add nsw i64 %j, -1 - %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %j.prev, i64 %i30 - %lv1 = load i32, i32* %arrayidx5 - %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @B, i64 0, i64 %j, i64 %i30 - %lv2 = load i32, i32* %arrayidx9 - %add = add nsw i32 %lv1, %lv2 - %arrayidx13 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %j, i64 %i30 - store i32 %add, i32* %arrayidx13 - %i.next = add nuw nsw i64 %j, 1 - %exitcond = icmp eq i64 %j, 99 - br i1 %exitcond, label %for1.inc14, label %for2 - -for1.inc14: - %i.next31 = add nuw nsw i64 %i30, 1 - %exitcond33 = icmp eq i64 %i30, 99 - br i1 %exitcond33, label %for.end16, label %for2.preheader - -for.end16: - ret void -} - -;; ---------------------------------------Test case 02--------------------------------- -;; Check loop interchange profitability model. -;; This tests profitability model when operands of getelementpointer and not exactly the induction variable but some -;; arithmetic operation on them. -;; for(int i=1;i<N;i++) -;; for(int j=1;j<N;j++) -;; A[j-1][i-1] = A[j - 1][i-1] + B[j-1][i-1]; - -; CHECK: Name: Interchanged -; CHECK-NEXT: Function: interchange_02 -define void @interchange_02() { -entry: - br label %for1.header - -for1.header: - %i35 = phi i64 [ 1, %entry ], [ %i.next36, %for1.inc19 ] - %i.prev = add nsw i64 %i35, -1 - br label %for2 - -for2: - %j = phi i64 [ 1, %for1.header ], [ %i.next, %for2 ] - %j.prev = add nsw i64 %j, -1 - %arrayidx6 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %j.prev, i64 %i.prev - %lv1 = load i32, i32* %arrayidx6 - %arrayidx12 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @B, i64 0, i64 %j.prev, i64 %i.prev - %lv2 = load i32, i32* %arrayidx12 - %add = add nsw i32 %lv1, %lv2 - store i32 %add, i32* %arrayidx6 - %i.next = add nuw nsw i64 %j, 1 - %exitcond = icmp eq i64 %j, 99 - br i1 %exitcond, label %for1.inc19, label %for2 - -for1.inc19: - %i.next36 = add nuw nsw i64 %i35, 1 - %exitcond39 = icmp eq i64 %i35, 99 - br i1 %exitcond39, label %for.end21, label %for1.header - -for.end21: - ret void -} - -;;---------------------------------------Test case 03--------------------------------- -;; Loops interchange is not profitable. -;; for(int i=1;i<100;i++) -;; for(int j=1;j<100;j++) -;; A[i-1][j-1] = A[i - 1][j-1] + B[i][j]; - -; CHECK: Name: InterchangeNotProfitable -; CHECK-NEXT: Function: interchange_03 -define void @interchange_03(){ -entry: - br label %for1.header - -for1.header: - %i34 = phi i64 [ 1, %entry ], [ %i.next35, %for1.inc17 ] - %i.prev = add nsw i64 %i34, -1 - br label %for2 - -for2: - %j = phi i64 [ 1, %for1.header ], [ %i.next, %for2 ] - %j.prev = add nsw i64 %j, -1 - %arrayidx6 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %i.prev, i64 %j.prev - %lv1 = load i32, i32* %arrayidx6 - %arrayidx10 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @B, i64 0, i64 %i34, i64 %j - %lv2 = load i32, i32* %arrayidx10 - %add = add nsw i32 %lv1, %lv2 - store i32 %add, i32* %arrayidx6 - %i.next = add nuw nsw i64 %j, 1 - %exitcond = icmp eq i64 %j, 99 - br i1 %exitcond, label %for1.inc17, label %for2 - -for1.inc17: - %i.next35 = add nuw nsw i64 %i34, 1 - %exitcond38 = icmp eq i64 %i34, 99 - br i1 %exitcond38, label %for.end19, label %for1.header - -for.end19: - ret void -} - -;; Loops should not be interchanged in this case as it is not profitable. -;; for(int i=0;i<100;i++) -;; for(int j=0;j<100;j++) -;; A[i][j] = A[i][j]+k; - -; CHECK: Name: InterchangeNotProfitable -; CHECK-NEXT: Function: interchange_04 -define void @interchange_04(i32 %k) { -entry: - br label %for.cond1.preheader - -for.cond1.preheader: - %indvars.iv21 = phi i64 [ 0, %entry ], [ %indvars.iv.next22, %for.inc10 ] - br label %for.body3 - -for.body3: - %indvars.iv = phi i64 [ 0, %for.cond1.preheader ], [ %indvars.iv.next, %for.body3 ] - %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv21, i64 %indvars.iv - %0 = load i32, i32* %arrayidx5 - %add = add nsw i32 %0, %k - store i32 %add, i32* %arrayidx5 - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %exitcond = icmp eq i64 %indvars.iv.next, 100 - br i1 %exitcond, label %for.inc10, label %for.body3 - -for.inc10: - %indvars.iv.next22 = add nuw nsw i64 %indvars.iv21, 1 - %exitcond23 = icmp eq i64 %indvars.iv.next22, 100 - br i1 %exitcond23, label %for.end12, label %for.cond1.preheader - -for.end12: - ret void -} diff --git a/llvm/test/Transforms/LoopInterchange/reductions-across-inner-and-outer-loop.ll b/llvm/test/Transforms/LoopInterchange/reductions-across-inner-and-outer-loop.ll deleted file mode 100644 index 7ac96f14825..00000000000 --- a/llvm/test/Transforms/LoopInterchange/reductions-across-inner-and-outer-loop.ll +++ /dev/null @@ -1,150 +0,0 @@ -; RUN: opt < %s -basicaa -loop-interchange -pass-remarks-missed='loop-interchange' -pass-remarks-output=%t -S \ -; RUN: -verify-dom-info -verify-loop-info -verify-loop-lcssa -stats 2>&1 | FileCheck %s -; RUN: FileCheck --input-file=%t --check-prefix=REMARKS %s - - -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -; REMARKS: --- !Passed -; REMARKS-NEXT: Pass: loop-interchange -; REMARKS-NEXT: Name: Interchanged -; REMARKS-NEXT: Function: test1 - -define i64 @test1([100 x [100 x i64]]* %Arr) { -; CHECK-LABEL: @test1( -; CHECK-NEXT: entry: -; CHECK-NEXT: br label [[FOR2_PREHEADER:%.*]] -; CHECK: for1.header.preheader: -; CHECK-NEXT: br label [[FOR1_HEADER:%.*]] -; CHECK: for1.header: -; CHECK-NEXT: [[INDVARS_IV23:%.*]] = phi i64 [ [[INDVARS_IV_NEXT24:%.*]], [[FOR1_INC:%.*]] ], [ 0, [[FOR1_HEADER_PREHEADER:%.*]] ] -; CHECK-NEXT: [[SUM_INNER:%.*]] = phi i64 [ [[SUM_INC:%.*]], [[FOR1_INC]] ], [ [[SUM_OUTER:%.*]], [[FOR1_HEADER_PREHEADER]] ] -; CHECK-NEXT: br label [[FOR2_SPLIT1:%.*]] -; CHECK: for2.preheader: -; CHECK-NEXT: br label [[FOR2:%.*]] -; CHECK: for2: -; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT_3:%.*]], [[FOR2_SPLIT:%.*]] ], [ 0, [[FOR2_PREHEADER]] ] -; CHECK-NEXT: [[SUM_OUTER]] = phi i64 [ [[SUM_INC_LCSSA:%.*]], [[FOR2_SPLIT]] ], [ 0, [[FOR2_PREHEADER]] ] -; CHECK-NEXT: br label [[FOR1_HEADER_PREHEADER]] -; CHECK: for2.split1: -; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [100 x [100 x i64]], [100 x [100 x i64]]* [[ARR:%.*]], i64 0, i64 [[INDVARS_IV]], i64 [[INDVARS_IV23]] -; CHECK-NEXT: [[LV:%.*]] = load i64, i64* [[ARRAYIDX]], align 4 -; CHECK-NEXT: [[SUM_INC]] = add i64 [[SUM_INNER]], [[LV]] -; CHECK-NEXT: br label [[FOR1_INC]] -; CHECK: for2.split: -; CHECK-NEXT: [[SUM_INC_LCSSA]] = phi i64 [ [[SUM_INC]], %for1.inc ] -; CHECK-NEXT: [[INDVARS_IV_NEXT_3]] = add nuw nsw i64 [[INDVARS_IV]], 1 -; CHECK-NEXT: [[EXIT1:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT_3]], 100 -; CHECK-NEXT: br i1 [[EXIT1]], label [[FOR1_LOOPEXIT:%.*]], label [[FOR2]] -; CHECK: for1.inc: -; CHECK-NEXT: [[INDVARS_IV_NEXT24]] = add nuw nsw i64 [[INDVARS_IV23]], 1 -; CHECK-NEXT: [[EXIT2:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT24]], 100 -; CHECK-NEXT: br i1 [[EXIT2]], label [[FOR2_SPLIT]], label [[FOR1_HEADER]] -; CHECK: for1.loopexit: -; CHECK-NEXT: [[SUM_INC_LCSSA2:%.*]] = phi i64 [ [[SUM_INC_LCSSA]], [[FOR2_SPLIT]] ] -; CHECK-NEXT: ret i64 [[SUM_INC_LCSSA2]] -; -entry: - br label %for1.header - -for1.header: ; preds = %for1.inc, %entry - %indvars.iv23 = phi i64 [ 0, %entry ], [ %indvars.iv.next24, %for1.inc ] - %sum.outer = phi i64 [ 0, %entry ], [ %sum.inc.lcssa, %for1.inc ] - br label %for2 - -for2: ; preds = %for2, %for1.header - %indvars.iv = phi i64 [ 0, %for1.header ], [ %indvars.iv.next.3, %for2 ] - %sum.inner = phi i64 [ %sum.outer, %for1.header ], [ %sum.inc, %for2 ] - %arrayidx = getelementptr inbounds [100 x [100 x i64]], [100 x [100 x i64]]* %Arr, i64 0, i64 %indvars.iv, i64 %indvars.iv23 - %lv = load i64, i64* %arrayidx, align 4 - %sum.inc = add i64 %sum.inner, %lv - %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 1 - %exit1 = icmp eq i64 %indvars.iv.next.3, 100 - br i1 %exit1, label %for1.inc, label %for2 - -for1.inc: ; preds = %for2 - %sum.inc.lcssa = phi i64 [ %sum.inc, %for2 ] - %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1 - %exit2 = icmp eq i64 %indvars.iv.next24, 100 - br i1 %exit2, label %for1.loopexit, label %for1.header - -for1.loopexit: ; preds = %for1.inc - %sum.inc.lcssa2 = phi i64 [ %sum.inc.lcssa, %for1.inc ] - ret i64 %sum.inc.lcssa2 -} - -; In this test case, the inner reduction PHI %inner does not involve the outer -; reduction PHI %sum.outer, do not interchange. -; REMARKS: --- !Missed -; REMARKS-NEXT: Pass: loop-interchange -; REMARKS-NEXT: Name: UnsupportedPHIOuter -; REMARKS-NEXT: Function: test2 - -define i64 @test2([100 x [100 x i64]]* %Arr) { -entry: - br label %for1.header - -for1.header: ; preds = %for1.inc, %entry - %indvars.iv23 = phi i64 [ 0, %entry ], [ %indvars.iv.next24, %for1.inc ] - %sum.outer = phi i64 [ 0, %entry ], [ %sum.inc.lcssa, %for1.inc ] - br label %for2 - -for2: ; preds = %for2, %for1.header - %indvars.iv = phi i64 [ 0, %for1.header ], [ %indvars.iv.next.3, %for2 ] - %inner = phi i64 [ %indvars.iv23, %for1.header ], [ %sum.inc, %for2 ] - %arrayidx = getelementptr inbounds [100 x [100 x i64]], [100 x [100 x i64]]* %Arr, i64 0, i64 %indvars.iv, i64 %indvars.iv23 - %lv = load i64, i64* %arrayidx, align 4 - %sum.inc = add i64 %inner, %lv - %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 1 - %exit1 = icmp eq i64 %indvars.iv.next.3, 100 - br i1 %exit1, label %for1.inc, label %for2 - -for1.inc: ; preds = %for2 - %sum.inc.lcssa = phi i64 [ %sum.inc, %for2 ] - %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1 - %exit2 = icmp eq i64 %indvars.iv.next24, 100 - br i1 %exit2, label %for1.loopexit, label %for1.header - -for1.loopexit: ; preds = %for1.inc - %sum.inc.lcssa2 = phi i64 [ %sum.inc.lcssa, %for1.inc ] - ret i64 %sum.inc.lcssa2 -} - -; Check that we do not interchange if there is an additional instruction -; between the outer and inner reduction PHIs. -; REMARKS: --- !Missed -; REMARKS-NEXT: Pass: loop-interchange -; REMARKS-NEXT: Name: UnsupportedPHIOuter -; REMARKS-NEXT: Function: test3 - -define i64 @test3([100 x [100 x i64]]* %Arr) { -entry: - br label %for1.header - -for1.header: ; preds = %for1.inc, %entry - %indvars.iv23 = phi i64 [ 0, %entry ], [ %indvars.iv.next24, %for1.inc ] - %sum.outer = phi i64 [ 0, %entry ], [ %sum.inc.lcssa, %for1.inc ] - %so = add i64 %sum.outer, 10 - br label %for2 - -for2: ; preds = %for2, %for1.header - %indvars.iv = phi i64 [ 0, %for1.header ], [ %indvars.iv.next.3, %for2 ] - %sum.inner = phi i64 [ %so, %for1.header ], [ %sum.inc, %for2 ] - %arrayidx = getelementptr inbounds [100 x [100 x i64]], [100 x [100 x i64]]* %Arr, i64 0, i64 %indvars.iv, i64 %indvars.iv23 - %lv = load i64, i64* %arrayidx, align 4 - %sum.inc = add i64 %sum.inner, %lv - %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 1 - %exit1 = icmp eq i64 %indvars.iv.next.3, 100 - br i1 %exit1, label %for1.inc, label %for2 - -for1.inc: ; preds = %for2 - %sum.inc.lcssa = phi i64 [ %sum.inc, %for2 ] - %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1 - %exit2 = icmp eq i64 %indvars.iv.next24, 100 - br i1 %exit2, label %for1.loopexit, label %for1.header - -for1.loopexit: ; preds = %for1.inc - %sum.inc.lcssa2 = phi i64 [ %sum.inc.lcssa, %for1.inc ] - ret i64 %sum.inc.lcssa2 -} |

