summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorDavid Green <david.green@arm.com>2018-05-27 12:54:33 +0000
committerDavid Green <david.green@arm.com>2018-05-27 12:54:33 +0000
commitaee7ad0cde0702e1ce942b2fb598fc4fa0d1edbf (patch)
treee47d940504398418501fcf04ca3465e85011de05 /llvm/test
parent3034281b437d681664b72ddbab9178cfcf1f608e (diff)
downloadbcm5719-llvm-aee7ad0cde0702e1ce942b2fb598fc4fa0d1edbf.tar.gz
bcm5719-llvm-aee7ad0cde0702e1ce942b2fb598fc4fa0d1edbf.zip
Revert 333358 as it's failing on some builders.
I'm guessing the tests reply on the ARM backend being built. llvm-svn: 333359
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/Transforms/LoopUnrollAndJam/dependencies.ll466
-rw-r--r--llvm/test/Transforms/LoopUnrollAndJam/disable.ll751
-rw-r--r--llvm/test/Transforms/LoopUnrollAndJam/pragma.ll313
-rw-r--r--llvm/test/Transforms/LoopUnrollAndJam/unprofitable.ll224
-rw-r--r--llvm/test/Transforms/LoopUnrollAndJam/unroll-and-jam.ll744
5 files changed, 0 insertions, 2498 deletions
diff --git a/llvm/test/Transforms/LoopUnrollAndJam/dependencies.ll b/llvm/test/Transforms/LoopUnrollAndJam/dependencies.ll
deleted file mode 100644
index 6284f1366ab..00000000000
--- a/llvm/test/Transforms/LoopUnrollAndJam/dependencies.ll
+++ /dev/null
@@ -1,466 +0,0 @@
-; RUN: opt -basicaa -loop-unroll-and-jam -unroll-and-jam-count=4 < %s -S | FileCheck %s
-
-target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
-target triple = "thumbv8m.main-arm-none-eabi"
-
-; CHECK-LABEL: fore_aft_less
-; CHECK: %j = phi
-; CHECK: %j.1 = phi
-; CHECK: %j.2 = phi
-; CHECK: %j.3 = phi
-define void @fore_aft_less(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
-entry:
- %cmp = icmp sgt i32 %N, 0
- br i1 %cmp, label %for.outer, label %cleanup
-
-for.outer:
- %i = phi i32 [ %add7.us, %for.latch ], [ 0, %entry ]
- %arrayidx.us = getelementptr inbounds i32, i32* %A, i32 %i
- store i32 1, i32* %arrayidx.us, align 4
- br label %for.inner
-
-for.inner:
- %j = phi i32 [ %add6.us, %for.inner ], [ 0, %for.outer ]
- %sum = phi i32 [ %add.us, %for.inner ], [ 0, %for.outer ]
- %arrayidx5.us = getelementptr inbounds i32, i32* %B, i32 %j
- %0 = load i32, i32* %arrayidx5.us, align 4
- %mul.us = mul nsw i32 %0, %i
- %add.us = add nsw i32 %mul.us, %sum
- %add6.us = add nuw nsw i32 %j, 1
- %exitcond.us = icmp eq i32 %add6.us, %N
- br i1 %exitcond.us, label %for.latch, label %for.inner
-
-for.latch:
- %add7.us = add nuw nsw i32 %i, 1
- %add7.us2 = add nuw nsw i32 %i, -1
- %arrayidx8.us = getelementptr inbounds i32, i32* %A, i32 %add7.us2
- store i32 %add.us, i32* %arrayidx8.us, align 4
- %exitcond29.us = icmp eq i32 %add7.us, %N
- br i1 %exitcond29.us, label %cleanup, label %for.outer
-
-cleanup:
- ret void
-}
-
-; CHECK-LABEL: fore_aft_eq
-; CHECK: %j = phi
-; CHECK: %j.1 = phi
-; CHECK: %j.2 = phi
-; CHECK: %j.3 = phi
-define void @fore_aft_eq(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
-entry:
- %cmp = icmp sgt i32 %N, 0
- br i1 %cmp, label %for.outer, label %cleanup
-
-for.outer:
- %i = phi i32 [ %add7.us, %for.latch ], [ 0, %entry ]
- %arrayidx.us = getelementptr inbounds i32, i32* %A, i32 %i
- store i32 1, i32* %arrayidx.us, align 4
- br label %for.inner
-
-for.inner:
- %j = phi i32 [ %add6.us, %for.inner ], [ 0, %for.outer ]
- %sum = phi i32 [ %add.us, %for.inner ], [ 0, %for.outer ]
- %arrayidx5.us = getelementptr inbounds i32, i32* %B, i32 %j
- %0 = load i32, i32* %arrayidx5.us, align 4
- %mul.us = mul nsw i32 %0, %i
- %add.us = add nsw i32 %mul.us, %sum
- %add6.us = add nuw nsw i32 %j, 1
- %exitcond.us = icmp eq i32 %add6.us, %N
- br i1 %exitcond.us, label %for.latch, label %for.inner
-
-for.latch:
- %add7.us = add nuw nsw i32 %i, 1
- %add7.us2 = add nuw nsw i32 %i, 0
- %arrayidx8.us = getelementptr inbounds i32, i32* %A, i32 %i
- store i32 %add.us, i32* %arrayidx8.us, align 4
- %exitcond29.us = icmp eq i32 %add7.us, %N
- br i1 %exitcond29.us, label %cleanup, label %for.outer
-
-cleanup:
- ret void
-}
-
-
-; CHECK-LABEL: fore_aft_more
-; CHECK: %j = phi
-; CHECK-NOT: %j.1 = phi
-define void @fore_aft_more(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
-entry:
- %cmp = icmp sgt i32 %N, 0
- br i1 %cmp, label %for.outer, label %cleanup
-
-for.outer:
- %i = phi i32 [ %add7.us, %for.latch ], [ 0, %entry ]
- %arrayidx.us = getelementptr inbounds i32, i32* %A, i32 %i
- store i32 1, i32* %arrayidx.us, align 4
- br label %for.inner
-
-for.inner:
- %j = phi i32 [ %add6.us, %for.inner ], [ 0, %for.outer ]
- %sum = phi i32 [ %add.us, %for.inner ], [ 0, %for.outer ]
- %arrayidx5.us = getelementptr inbounds i32, i32* %B, i32 %j
- %0 = load i32, i32* %arrayidx5.us, align 4
- %mul.us = mul nsw i32 %0, %i
- %add.us = add nsw i32 %mul.us, %sum
- %add6.us = add nuw nsw i32 %j, 1
- %exitcond.us = icmp eq i32 %add6.us, %N
- br i1 %exitcond.us, label %for.latch, label %for.inner
-
-for.latch:
- %add7.us = add nuw nsw i32 %i, 1
- %add7.us2 = add nuw nsw i32 %i, 1
- %arrayidx8.us = getelementptr inbounds i32, i32* %A, i32 %add7.us2
- store i32 %add.us, i32* %arrayidx8.us, align 4
- %exitcond29.us = icmp eq i32 %add7.us, %N
- br i1 %exitcond29.us, label %cleanup, label %for.outer
-
-cleanup:
- ret void
-}
-
-
-; CHECK-LABEL: fore_sub_less
-; CHECK: %j = phi
-; CHECK: %j.1 = phi
-; CHECK: %j.2 = phi
-; CHECK: %j.3 = phi
-define void @fore_sub_less(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
-entry:
- %cmp = icmp sgt i32 %N, 0
- br i1 %cmp, label %for.outer, label %cleanup
-
-for.outer:
- %i = phi i32 [ %add7.us, %for.latch ], [ 0, %entry ]
- %arrayidx.us = getelementptr inbounds i32, i32* %A, i32 %i
- store i32 1, i32* %arrayidx.us, align 4
- br label %for.inner
-
-for.inner:
- %j = phi i32 [ %add6.us, %for.inner ], [ 0, %for.outer ]
- %sum = phi i32 [ %add.us, %for.inner ], [ 0, %for.outer ]
- %arrayidx5.us = getelementptr inbounds i32, i32* %B, i32 %j
- %0 = load i32, i32* %arrayidx5.us, align 4
- %mul.us = mul nsw i32 %0, %i
- %add.us = add nsw i32 %mul.us, %sum
- %add7.us2 = add nuw nsw i32 %i, -1
- %arrayidx8.us = getelementptr inbounds i32, i32* %A, i32 %add7.us2
- store i32 %add.us, i32* %arrayidx8.us, align 4
- %add6.us = add nuw nsw i32 %j, 1
- %exitcond.us = icmp eq i32 %add6.us, %N
- br i1 %exitcond.us, label %for.latch, label %for.inner
-
-for.latch:
- %add7.us = add nuw nsw i32 %i, 1
- %exitcond29.us = icmp eq i32 %add7.us, %N
- br i1 %exitcond29.us, label %cleanup, label %for.outer
-
-cleanup:
- ret void
-}
-
-; CHECK-LABEL: fore_eq_less
-; CHECK: %j = phi
-; CHECK: %j.1 = phi
-; CHECK: %j.2 = phi
-; CHECK: %j.3 = phi
-define void @fore_eq_less(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
-entry:
- %cmp = icmp sgt i32 %N, 0
- br i1 %cmp, label %for.outer, label %cleanup
-
-for.outer:
- %i = phi i32 [ %add7.us, %for.latch ], [ 0, %entry ]
- %arrayidx.us = getelementptr inbounds i32, i32* %A, i32 %i
- store i32 1, i32* %arrayidx.us, align 4
- br label %for.inner
-
-for.inner:
- %j = phi i32 [ %add6.us, %for.inner ], [ 0, %for.outer ]
- %sum = phi i32 [ %add.us, %for.inner ], [ 0, %for.outer ]
- %arrayidx5.us = getelementptr inbounds i32, i32* %B, i32 %j
- %0 = load i32, i32* %arrayidx5.us, align 4
- %mul.us = mul nsw i32 %0, %i
- %add.us = add nsw i32 %mul.us, %sum
- %add7.us2 = add nuw nsw i32 %i, 0
- %arrayidx8.us = getelementptr inbounds i32, i32* %A, i32 %add7.us2
- store i32 %add.us, i32* %arrayidx8.us, align 4
- %add6.us = add nuw nsw i32 %j, 1
- %exitcond.us = icmp eq i32 %add6.us, %N
- br i1 %exitcond.us, label %for.latch, label %for.inner
-
-for.latch:
- %add7.us = add nuw nsw i32 %i, 1
- %exitcond29.us = icmp eq i32 %add7.us, %N
- br i1 %exitcond29.us, label %cleanup, label %for.outer
-
-cleanup:
- ret void
-}
-
-; CHECK-LABEL: fore_sub_more
-; CHECK: %j = phi
-; CHECK-NOT: %j.1 = phi
-define void @fore_sub_more(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
-entry:
- %cmp = icmp sgt i32 %N, 0
- br i1 %cmp, label %for.outer, label %cleanup
-
-for.outer:
- %i = phi i32 [ %add7.us, %for.latch ], [ 0, %entry ]
- %arrayidx.us = getelementptr inbounds i32, i32* %A, i32 %i
- store i32 1, i32* %arrayidx.us, align 4
- br label %for.inner
-
-for.inner:
- %j = phi i32 [ %add6.us, %for.inner ], [ 0, %for.outer ]
- %sum = phi i32 [ %add.us, %for.inner ], [ 0, %for.outer ]
- %arrayidx5.us = getelementptr inbounds i32, i32* %B, i32 %j
- %0 = load i32, i32* %arrayidx5.us, align 4
- %mul.us = mul nsw i32 %0, %i
- %add.us = add nsw i32 %mul.us, %sum
- %add7.us2 = add nuw nsw i32 %i, 1
- %arrayidx8.us = getelementptr inbounds i32, i32* %A, i32 %add7.us2
- store i32 %add.us, i32* %arrayidx8.us, align 4
- %add6.us = add nuw nsw i32 %j, 1
- %exitcond.us = icmp eq i32 %add6.us, %N
- br i1 %exitcond.us, label %for.latch, label %for.inner
-
-for.latch:
- %add7.us = add nuw nsw i32 %i, 1
- %exitcond29.us = icmp eq i32 %add7.us, %N
- br i1 %exitcond29.us, label %cleanup, label %for.outer
-
-cleanup:
- ret void
-}
-
-; CHECK-LABEL: sub_aft_less
-; CHECK: %j = phi
-; CHECK: %j.1 = phi
-; CHECK: %j.2 = phi
-; CHECK: %j.3 = phi
-define void @sub_aft_less(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
-entry:
- %cmp = icmp sgt i32 %N, 0
- br i1 %cmp, label %for.outer, label %cleanup
-
-for.outer:
- %i = phi i32 [ %add7.us, %for.latch ], [ 0, %entry ]
- br label %for.inner
-
-for.inner:
- %j = phi i32 [ %add6.us, %for.inner ], [ 0, %for.outer ]
- %sum = phi i32 [ %add.us, %for.inner ], [ 0, %for.outer ]
- %arrayidx5.us = getelementptr inbounds i32, i32* %B, i32 %j
- %0 = load i32, i32* %arrayidx5.us, align 4
- %mul.us = mul nsw i32 %0, %i
- %add.us = add nsw i32 %mul.us, %sum
- %add6.us = add nuw nsw i32 %j, 1
- %arrayidx.us = getelementptr inbounds i32, i32* %A, i32 %i
- store i32 1, i32* %arrayidx.us, align 4
- %exitcond.us = icmp eq i32 %add6.us, %N
- br i1 %exitcond.us, label %for.latch, label %for.inner
-
-for.latch:
- %add7.us = add nuw nsw i32 %i, 1
- %add7.us2 = add nuw nsw i32 %i, -1
- %arrayidx8.us = getelementptr inbounds i32, i32* %A, i32 %add7.us2
- store i32 %add.us, i32* %arrayidx8.us, align 4
- %exitcond29.us = icmp eq i32 %add7.us, %N
- br i1 %exitcond29.us, label %cleanup, label %for.outer
-
-cleanup:
- ret void
-}
-
-; CHECK-LABEL: sub_aft_eq
-; CHECK: %j = phi
-; CHECK: %j.1 = phi
-; CHECK: %j.2 = phi
-; CHECK: %j.3 = phi
-define void @sub_aft_eq(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
-entry:
- %cmp = icmp sgt i32 %N, 0
- br i1 %cmp, label %for.outer, label %cleanup
-
-for.outer:
- %i = phi i32 [ %add7.us, %for.latch ], [ 0, %entry ]
- br label %for.inner
-
-for.inner:
- %j = phi i32 [ %add6.us, %for.inner ], [ 0, %for.outer ]
- %sum = phi i32 [ %add.us, %for.inner ], [ 0, %for.outer ]
- %arrayidx5.us = getelementptr inbounds i32, i32* %B, i32 %j
- %0 = load i32, i32* %arrayidx5.us, align 4
- %mul.us = mul nsw i32 %0, %i
- %add.us = add nsw i32 %mul.us, %sum
- %add6.us = add nuw nsw i32 %j, 1
- %arrayidx.us = getelementptr inbounds i32, i32* %A, i32 %i
- store i32 1, i32* %arrayidx.us, align 4
- %exitcond.us = icmp eq i32 %add6.us, %N
- br i1 %exitcond.us, label %for.latch, label %for.inner
-
-for.latch:
- %add7.us = add nuw nsw i32 %i, 1
- %add7.us2 = add nuw nsw i32 %i, 0
- %arrayidx8.us = getelementptr inbounds i32, i32* %A, i32 %i
- store i32 %add.us, i32* %arrayidx8.us, align 4
- %exitcond29.us = icmp eq i32 %add7.us, %N
- br i1 %exitcond29.us, label %cleanup, label %for.outer
-
-cleanup:
- ret void
-}
-
-
-; CHECK-LABEL: sub_aft_more
-; CHECK: %j = phi
-; CHECK-NOT: %j.1 = phi
-define void @sub_aft_more(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
-entry:
- %cmp = icmp sgt i32 %N, 0
- br i1 %cmp, label %for.outer, label %cleanup
-
-for.outer:
- %i = phi i32 [ %add7.us, %for.latch ], [ 0, %entry ]
- br label %for.inner
-
-for.inner:
- %j = phi i32 [ %add6.us, %for.inner ], [ 0, %for.outer ]
- %sum = phi i32 [ %add.us, %for.inner ], [ 0, %for.outer ]
- %arrayidx5.us = getelementptr inbounds i32, i32* %B, i32 %j
- %0 = load i32, i32* %arrayidx5.us, align 4
- %mul.us = mul nsw i32 %0, %i
- %add.us = add nsw i32 %mul.us, %sum
- %add6.us = add nuw nsw i32 %j, 1
- %arrayidx.us = getelementptr inbounds i32, i32* %A, i32 %i
- store i32 1, i32* %arrayidx.us, align 4
- %exitcond.us = icmp eq i32 %add6.us, %N
- br i1 %exitcond.us, label %for.latch, label %for.inner
-
-for.latch:
- %add7.us = add nuw nsw i32 %i, 1
- %add7.us2 = add nuw nsw i32 %i, 1
- %arrayidx8.us = getelementptr inbounds i32, i32* %A, i32 %add7.us2
- store i32 %add.us, i32* %arrayidx8.us, align 4
- %exitcond29.us = icmp eq i32 %add7.us, %N
- br i1 %exitcond29.us, label %cleanup, label %for.outer
-
-cleanup:
- ret void
-}
-
-
-; CHECK-LABEL: sub_sub_less
-; CHECK: %j = phi
-; CHECK-NOT: %j.1 = phi
-define void @sub_sub_less(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
-entry:
- %cmp = icmp sgt i32 %N, 0
- br i1 %cmp, label %for.outer, label %cleanup
-
-for.outer:
- %i = phi i32 [ %add7.us, %for.latch ], [ 0, %entry ]
- br label %for.inner
-
-for.inner:
- %j = phi i32 [ %add6.us, %for.inner ], [ 0, %for.outer ]
- %sum = phi i32 [ %add.us, %for.inner ], [ 0, %for.outer ]
- %arrayidx5.us = getelementptr inbounds i32, i32* %B, i32 %j
- %0 = load i32, i32* %arrayidx5.us, align 4
- %mul.us = mul nsw i32 %0, %i
- %add.us = add nsw i32 %mul.us, %sum
- %add6.us = add nuw nsw i32 %j, 1
- %arrayidx.us = getelementptr inbounds i32, i32* %A, i32 %i
- store i32 1, i32* %arrayidx.us, align 4
- %add7.us2 = add nuw nsw i32 %i, -1
- %arrayidx8.us = getelementptr inbounds i32, i32* %A, i32 %add7.us2
- store i32 %add.us, i32* %arrayidx8.us, align 4
- %exitcond.us = icmp eq i32 %add6.us, %N
- br i1 %exitcond.us, label %for.latch, label %for.inner
-
-for.latch:
- %add7.us = add nuw nsw i32 %i, 1
- %exitcond29.us = icmp eq i32 %add7.us, %N
- br i1 %exitcond29.us, label %cleanup, label %for.outer
-
-cleanup:
- ret void
-}
-
-
-; CHECK-LABEL: sub_sub_eq
-; CHECK: %j = phi
-; CHECK: %j.1 = phi
-define void @sub_sub_eq(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
-entry:
- %cmp = icmp sgt i32 %N, 0
- br i1 %cmp, label %for.outer, label %cleanup
-
-for.outer:
- %i = phi i32 [ %add7.us, %for.latch ], [ 0, %entry ]
- br label %for.inner
-
-for.inner:
- %j = phi i32 [ %add6.us, %for.inner ], [ 0, %for.outer ]
- %sum = phi i32 [ %add.us, %for.inner ], [ 0, %for.outer ]
- %arrayidx5.us = getelementptr inbounds i32, i32* %B, i32 %j
- %0 = load i32, i32* %arrayidx5.us, align 4
- %mul.us = mul nsw i32 %0, %i
- %add.us = add nsw i32 %mul.us, %sum
- %add6.us = add nuw nsw i32 %j, 1
- %arrayidx.us = getelementptr inbounds i32, i32* %A, i32 %i
- store i32 1, i32* %arrayidx.us, align 4
- %add7.us2 = add nuw nsw i32 %i, 0
- %arrayidx8.us = getelementptr inbounds i32, i32* %A, i32 %add7.us2
- store i32 %add.us, i32* %arrayidx8.us, align 4
- %exitcond.us = icmp eq i32 %add6.us, %N
- br i1 %exitcond.us, label %for.latch, label %for.inner
-
-for.latch:
- %add7.us = add nuw nsw i32 %i, 1
- %exitcond29.us = icmp eq i32 %add7.us, %N
- br i1 %exitcond29.us, label %cleanup, label %for.outer
-
-cleanup:
- ret void
-}
-
-
-; CHECK-LABEL: sub_sub_more
-; CHECK: %j = phi
-; CHECK-NOT: %j.1 = phi
-define void @sub_sub_more(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
-entry:
- %cmp = icmp sgt i32 %N, 0
- br i1 %cmp, label %for.outer, label %cleanup
-
-for.outer:
- %i = phi i32 [ %add7.us, %for.latch ], [ 0, %entry ]
- br label %for.inner
-
-for.inner:
- %j = phi i32 [ %add6.us, %for.inner ], [ 0, %for.outer ]
- %sum = phi i32 [ %add.us, %for.inner ], [ 0, %for.outer ]
- %arrayidx5.us = getelementptr inbounds i32, i32* %B, i32 %j
- %0 = load i32, i32* %arrayidx5.us, align 4
- %mul.us = mul nsw i32 %0, %i
- %add.us = add nsw i32 %mul.us, %sum
- %add6.us = add nuw nsw i32 %j, 1
- %arrayidx.us = getelementptr inbounds i32, i32* %A, i32 %i
- store i32 1, i32* %arrayidx.us, align 4
- %add7.us2 = add nuw nsw i32 %i, 1
- %arrayidx8.us = getelementptr inbounds i32, i32* %A, i32 %add7.us2
- store i32 %add.us, i32* %arrayidx8.us, align 4
- %exitcond.us = icmp eq i32 %add6.us, %N
- br i1 %exitcond.us, label %for.latch, label %for.inner
-
-for.latch:
- %add7.us = add nuw nsw i32 %i, 1
- %exitcond29.us = icmp eq i32 %add7.us, %N
- br i1 %exitcond29.us, label %cleanup, label %for.outer
-
-cleanup:
- ret void
-}
diff --git a/llvm/test/Transforms/LoopUnrollAndJam/disable.ll b/llvm/test/Transforms/LoopUnrollAndJam/disable.ll
deleted file mode 100644
index 258aabb3073..00000000000
--- a/llvm/test/Transforms/LoopUnrollAndJam/disable.ll
+++ /dev/null
@@ -1,751 +0,0 @@
-; RUN: opt -loop-unroll-and-jam -unroll-and-jam-count=4 -pass-remarks=loop-unroll-and-jam < %s -S 2>&1 | FileCheck %s
-
-target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
-target triple = "thumbv8m.main-arm-none-eabi"
-
-;; Common check for all tests. None should be unroll and jammed
-; CHECK-NOT: remark: {{.*}} unroll and jammed
-
-
-; CHECK-LABEL: disabled1
-; Tests for(i) { sum = A[i]; for(j) sum += B[j]; A[i+1] = sum; }
-; A[i] to A[i+1] dependency should block unrollandjam
-define void @disabled1(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-; CHECK: %i.029 = phi i32 [ %add10, %for.latch ], [ 0, %for.preheader ]
-; CHECK: %j.026 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp127 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp127, %cmp
- br i1 %or.cond, label %for.preheader, label %return
-
-for.preheader:
- br label %for.outer
-
-for.outer:
- %i.029 = phi i32 [ %add10, %for.latch ], [ 0, %for.preheader ]
- %b.028 = phi i32 [ %inc8, %for.latch ], [ 1, %for.preheader ]
- %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i.029
- %0 = load i32, i32* %arrayidx, align 4, !tbaa !5
- br label %for.inner
-
-for.inner:
- %j.026 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
- %sum1.025 = phi i32 [ %0, %for.outer ], [ %add, %for.inner ]
- %arrayidx6 = getelementptr inbounds i32, i32* %B, i32 %j.026
- %1 = load i32, i32* %arrayidx6, align 4, !tbaa !5
- %add = add i32 %1, %sum1.025
- %inc = add nuw i32 %j.026, 1
- %exitcond = icmp eq i32 %inc, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %arrayidx7 = getelementptr inbounds i32, i32* %A, i32 %b.028
- store i32 %add, i32* %arrayidx7, align 4, !tbaa !5
- %inc8 = add nuw nsw i32 %b.028, 1
- %add10 = add nuw nsw i32 %i.029, 1
- %exitcond30 = icmp eq i32 %add10, %I
- br i1 %exitcond30, label %return, label %for.outer
-
-return:
- ret void
-}
-
-
-; CHECK-LABEL: disabled2
-; Tests an incompatible block layout (for.outer jumps past for.inner)
-; FIXME: Make this work
-define void @disabled2(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-; CHECK: %i.032 = phi i32 [ %add13, %for.latch ], [ 0, %for.preheader ]
-; CHECK: %j.030 = phi i32 [ %inc, %for.inner ], [ 0, %for.inner.preheader ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp131 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp131, %cmp
- br i1 %or.cond, label %for.preheader, label %for.end14
-
-for.preheader:
- br label %for.outer
-
-for.outer:
- %i.032 = phi i32 [ %add13, %for.latch ], [ 0, %for.preheader ]
- %arrayidx = getelementptr inbounds i32, i32* %B, i32 %i.032
- %0 = load i32, i32* %arrayidx, align 4, !tbaa !5
- %tobool = icmp eq i32 %0, 0
- br i1 %tobool, label %for.latch, label %for.inner
-
-for.inner:
- %j.030 = phi i32 [ %inc, %for.inner ], [ 0, %for.outer ]
- %sum1.029 = phi i32 [ %sum1.1, %for.inner ], [ 0, %for.outer ]
- %arrayidx6 = getelementptr inbounds i32, i32* %B, i32 %j.030
- %1 = load i32, i32* %arrayidx6, align 4, !tbaa !5
- %tobool7 = icmp eq i32 %1, 0
- %sub = add i32 %sum1.029, 10
- %add = sub i32 %sub, %1
- %sum1.1 = select i1 %tobool7, i32 %sum1.029, i32 %add
- %inc = add nuw i32 %j.030, 1
- %exitcond = icmp eq i32 %inc, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %sum1.1.lcssa = phi i32 [ 0, %for.outer ], [ %sum1.1, %for.inner ]
- %arrayidx11 = getelementptr inbounds i32, i32* %A, i32 %i.032
- store i32 %sum1.1.lcssa, i32* %arrayidx11, align 4, !tbaa !5
- %add13 = add nuw i32 %i.032, 1
- %exitcond33 = icmp eq i32 %add13, %I
- br i1 %exitcond33, label %for.end14, label %for.outer
-
-for.end14:
- ret void
-}
-
-
-
-; CHECK-LABEL: disabled3
-; Tests loop carry dependencies in an array S
-define void @disabled3(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-; CHECK: %i.029 = phi i32 [ 0, %for.preheader ], [ %add12, %for.latch ]
-; CHECK: %j.027 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
-entry:
- %S = alloca [4 x i32], align 4
- %cmp = icmp eq i32 %J, 0
- br i1 %cmp, label %return, label %if.end
-
-if.end:
- %0 = bitcast [4 x i32]* %S to i8*
- %cmp128 = icmp eq i32 %I, 0
- br i1 %cmp128, label %for.cond.cleanup, label %for.preheader
-
-for.preheader:
- %arrayidx9 = getelementptr inbounds [4 x i32], [4 x i32]* %S, i32 0, i32 0
- br label %for.outer
-
-for.cond.cleanup:
- br label %return
-
-for.outer:
- %i.029 = phi i32 [ 0, %for.preheader ], [ %add12, %for.latch ]
- br label %for.inner
-
-for.inner:
- %j.027 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
- %arrayidx = getelementptr inbounds i32, i32* %B, i32 %j.027
- %l2 = load i32, i32* %arrayidx, align 4, !tbaa !5
- %add = add i32 %j.027, %i.029
- %rem = urem i32 %add, %J
- %arrayidx6 = getelementptr inbounds i32, i32* %B, i32 %rem
- %l3 = load i32, i32* %arrayidx6, align 4, !tbaa !5
- %mul = mul i32 %l3, %l2
- %rem7 = urem i32 %j.027, 3
- %arrayidx8 = getelementptr inbounds [4 x i32], [4 x i32]* %S, i32 0, i32 %rem7
- store i32 %mul, i32* %arrayidx8, align 4, !tbaa !5
- %inc = add nuw i32 %j.027, 1
- %exitcond = icmp eq i32 %inc, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %l1 = load i32, i32* %arrayidx9, align 4, !tbaa !5
- %arrayidx10 = getelementptr inbounds i32, i32* %A, i32 %i.029
- store i32 %l1, i32* %arrayidx10, align 4, !tbaa !5
- %add12 = add nuw i32 %i.029, 1
- %exitcond31 = icmp eq i32 %add12, %I
- br i1 %exitcond31, label %for.cond.cleanup, label %for.outer
-
-return:
- ret void
-}
-
-
-; CHECK-LABEL: disabled4
-; Inner looop induction variable in not consistent
-; ie for(i = 0..n) for (j = 0..i) sum+=B[j]
-define void @disabled4(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-; CHECK: %indvars.iv = phi i32 [ %indvars.iv.next, %for.latch ], [ 1, %for.preheader ]
-; CHECK: %j.021 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ugt i32 %I, 1
- %or.cond = and i1 %cmp122, %cmp
- br i1 %or.cond, label %for.preheader, label %for.end9
-
-for.preheader:
- br label %for.outer
-
-for.outer:
- %indvars.iv = phi i32 [ %indvars.iv.next, %for.latch ], [ 1, %for.preheader ]
- br label %for.inner
-
-for.inner:
- %j.021 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
- %sum1.020 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]
- %arrayidx = getelementptr inbounds i32, i32* %B, i32 %j.021
- %0 = load i32, i32* %arrayidx, align 4, !tbaa !5
- %add = add i32 %0, %sum1.020
- %inc = add nuw i32 %j.021, 1
- %exitcond = icmp eq i32 %inc, %indvars.iv
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %arrayidx6 = getelementptr inbounds i32, i32* %A, i32 %indvars.iv
- store i32 %add, i32* %arrayidx6, align 4, !tbaa !5
- %indvars.iv.next = add nuw i32 %indvars.iv, 1
- %exitcond24 = icmp eq i32 %indvars.iv.next, %I
- br i1 %exitcond24, label %for.end9, label %for.outer
-
-for.end9:
- ret void
-}
-
-
-; CHECK-LABEL: disabled5
-; Test odd uses of phi nodes where the outer IV cannot be moved into Fore as it hits a PHI
-@f = hidden global i32 0, align 4
-define i32 @disabled5() #0 {
-; CHECK: %0 = phi i32 [ %f.promoted10, %entry ], [ 2, %for.latch ]
-; CHECK: %1 = phi i32 [ %0, %for.outer ], [ 2, %for.inner ]
-entry:
- %f.promoted10 = load i32, i32* @f, align 4, !tbaa !5
- br label %for.outer
-
-for.outer:
- %0 = phi i32 [ %f.promoted10, %entry ], [ 2, %for.latch ]
- %d.018 = phi i16 [ 0, %entry ], [ %odd.lcssa, %for.latch ]
- %inc5.sink9 = phi i32 [ 2, %entry ], [ %inc5, %for.latch ]
- br label %for.inner
-
-for.inner:
- %1 = phi i32 [ %0, %for.outer ], [ 2, %for.inner ]
- %inc.sink8 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
- %inc = add nuw nsw i32 %inc.sink8, 1
- %exitcond = icmp ne i32 %inc, 7
- br i1 %exitcond, label %for.inner, label %for.latch
-
-for.latch:
- %.lcssa = phi i32 [ %1, %for.inner ]
- %odd.lcssa = phi i16 [ 1, %for.inner ]
- %inc5 = add nuw nsw i32 %inc5.sink9, 1
- %exitcond11 = icmp ne i32 %inc5, 7
- br i1 %exitcond11, label %for.outer, label %for.end
-
-for.end:
- %.lcssa.lcssa = phi i32 [ %.lcssa, %for.latch ]
- %inc.lcssa.lcssa = phi i32 [ 7, %for.latch ]
- ret i32 0
-}
-
-
-; CHECK-LABEL: disabled6
-; There is a dependency in here, between @d and %0 (=@f)
-@d6 = hidden global i16 5, align 2
-@f6 = hidden global i16* @d6, align 4
-define i32 @disabled6() #0 {
-; CHECK: %inc8.sink14.i = phi i16 [ 1, %entry ], [ %inc8.i, %for.cond.cleanup.i ]
-; CHECK: %c.013.i = phi i32 [ 0, %for.body.i ], [ %inc.i, %for.body6.i ]
-entry:
- store i16 1, i16* @d6, align 2
- %0 = load i16*, i16** @f6, align 4
- br label %for.body.i
-
-for.body.i:
- %inc8.sink14.i = phi i16 [ 1, %entry ], [ %inc8.i, %for.cond.cleanup.i ]
- %1 = load i16, i16* %0, align 2
- br label %for.body6.i
-
-for.cond.cleanup.i:
- %inc8.i = add nuw nsw i16 %inc8.sink14.i, 1
- store i16 %inc8.i, i16* @d6, align 2
- %cmp.i = icmp ult i16 %inc8.i, 6
- br i1 %cmp.i, label %for.body.i, label %test.exit
-
-for.body6.i:
- %c.013.i = phi i32 [ 0, %for.body.i ], [ %inc.i, %for.body6.i ]
- %inc.i = add nuw nsw i32 %c.013.i, 1
- %exitcond.i = icmp eq i32 %inc.i, 7
- br i1 %exitcond.i, label %for.cond.cleanup.i, label %for.body6.i
-
-test.exit:
- %conv2.i = sext i16 %1 to i32
- ret i32 0
-}
-
-
-
-; CHECK-LABEL: disabled7
-; Has negative output dependency
-define void @disabled7(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-; CHECK: %i.028 = phi i32 [ %add11, %for.cond3.for.cond.cleanup5_crit_edge ], [ 0, %for.body.preheader ]
-; CHECK: %j.026 = phi i32 [ 0, %for.body ], [ %add9, %for.body6 ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp127 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp127, %cmp
- br i1 %or.cond, label %for.body.preheader, label %for.end12
-
-for.body.preheader:
- br label %for.body
-
-for.body:
- %i.028 = phi i32 [ %add11, %for.cond3.for.cond.cleanup5_crit_edge ], [ 0, %for.body.preheader ]
- %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i.028
- store i32 0, i32* %arrayidx, align 4, !tbaa !5
- %sub = add i32 %i.028, -1
- %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %sub
- store i32 2, i32* %arrayidx2, align 4, !tbaa !5
- br label %for.body6
-
-for.cond3.for.cond.cleanup5_crit_edge:
- store i32 %add, i32* %arrayidx, align 4, !tbaa !5
- %add11 = add nuw i32 %i.028, 1
- %exitcond29 = icmp eq i32 %add11, %I
- br i1 %exitcond29, label %for.end12, label %for.body
-
-for.body6:
- %0 = phi i32 [ 0, %for.body ], [ %add, %for.body6 ]
- %j.026 = phi i32 [ 0, %for.body ], [ %add9, %for.body6 ]
- %arrayidx7 = getelementptr inbounds i32, i32* %B, i32 %j.026
- %1 = load i32, i32* %arrayidx7, align 4, !tbaa !5
- %add = add i32 %1, %0
- %add9 = add nuw i32 %j.026, 1
- %exitcond = icmp eq i32 %add9, %J
- br i1 %exitcond, label %for.cond3.for.cond.cleanup5_crit_edge, label %for.body6
-
-for.end12:
- ret void
-}
-
-
-; CHECK-LABEL: disabled8
-; Same as above with an extra outer loop nest
-define void @disabled8(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-; CHECK: %i.036 = phi i32 [ %add15, %for.latch ], [ 0, %for.body ]
-; CHECK: %j.034 = phi i32 [ 0, %for.outer ], [ %add13, %for.inner ]
-entry:
- %cmp = icmp eq i32 %J, 0
- %cmp335 = icmp eq i32 %I, 0
- %or.cond = or i1 %cmp, %cmp335
- br i1 %or.cond, label %for.end18, label %for.body.preheader
-
-for.body.preheader:
- br label %for.body
-
-for.body:
- %x.037 = phi i32 [ %inc, %for.cond.cleanup4 ], [ 0, %for.body.preheader ]
- br label %for.outer
-
-for.cond.cleanup4:
- %inc = add nuw nsw i32 %x.037, 1
- %exitcond40 = icmp eq i32 %inc, 5
- br i1 %exitcond40, label %for.end18, label %for.body
-
-for.outer:
- %i.036 = phi i32 [ %add15, %for.latch ], [ 0, %for.body ]
- %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i.036
- store i32 0, i32* %arrayidx, align 4, !tbaa !5
- %sub = add i32 %i.036, -1
- %arrayidx6 = getelementptr inbounds i32, i32* %A, i32 %sub
- store i32 2, i32* %arrayidx6, align 4, !tbaa !5
- br label %for.inner
-
-for.latch:
- store i32 %add, i32* %arrayidx, align 4, !tbaa !5
- %add15 = add nuw i32 %i.036, 1
- %exitcond38 = icmp eq i32 %add15, %I
- br i1 %exitcond38, label %for.cond.cleanup4, label %for.outer
-
-for.inner:
- %0 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]
- %j.034 = phi i32 [ 0, %for.outer ], [ %add13, %for.inner ]
- %arrayidx11 = getelementptr inbounds i32, i32* %B, i32 %j.034
- %1 = load i32, i32* %arrayidx11, align 4, !tbaa !5
- %add = add i32 %1, %0
- %add13 = add nuw i32 %j.034, 1
- %exitcond = icmp eq i32 %add13, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.end18:
- ret void
-}
-
-
-; CHECK-LABEL: disabled9
-; Can't prove alias between A and B
-define void @disabled9(i32 %I, i32 %J, i32* nocapture %A, i32* nocapture readonly %B) #0 {
-; CHECK: %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
-; CHECK: %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4, !tbaa !5
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4, !tbaa !5
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-
-; CHECK-LABEL: disable10
-; Simple call
-declare void @f10(i32, i32) #0
-define void @disable10(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-; CHECK: %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
-; CHECK: %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4, !tbaa !5
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- tail call void @f10(i32 %i.us, i32 %j.us) nounwind
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4, !tbaa !5
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-
-; CHECK-LABEL: disable11
-; volatile
-define void @disable11(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-; CHECK: %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
-; CHECK: %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load volatile i32, i32* %arrayidx.us, align 4, !tbaa !5
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4, !tbaa !5
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-
-; CHECK-LABEL: disable12
-; Multiple aft blocks
-define void @disable12(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-; CHECK: %i.us = phi i32 [ %add8.us, %for.latch3 ], [ 0, %for.outer.preheader ]
-; CHECK: %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch3 ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4, !tbaa !5
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4, !tbaa !5
- %cmpl = icmp eq i32 %add.us.lcssa, 10
- br i1 %cmpl, label %for.latch2, label %for.latch3
-
-for.latch2:
- br label %for.latch3
-
-for.latch3:
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-
-; CHECK-LABEL: disable13
-; Two subloops
-define void @disable13(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-; CHECK: %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
-; CHECK: %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
-; CHECK: %j.us2 = phi i32 [ %inc.us2, %for.inner2 ], [ 0, %for.inner2.preheader ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4, !tbaa !5
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.inner2, label %for.inner
-
-for.inner2:
- %j.us2 = phi i32 [ 0, %for.inner ], [ %inc.us2, %for.inner2 ]
- %sum1.us2 = phi i32 [ 0, %for.inner ], [ %add.us2, %for.inner2 ]
- %arrayidx.us2 = getelementptr inbounds i32, i32* %B, i32 %j.us2
- %l0 = load i32, i32* %arrayidx.us2, align 4, !tbaa !5
- %add.us2 = add i32 %l0, %sum1.us2
- %inc.us2 = add nuw i32 %j.us2, 1
- %exitcond2 = icmp eq i32 %inc.us2, %J
- br i1 %exitcond2, label %for.latch, label %for.inner2
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner2 ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4, !tbaa !5
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-
-; CHECK-LABEL: disable14
-; Multiple exits blocks
-define void @disable14(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-; CHECK: %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
-; CHECK: %j.us = phi i32 [ %inc.us, %for.inner ], [ 0, %for.inner.preheader ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- %add8.us = add nuw i32 %i.us, 1
- %exitcond23 = icmp eq i32 %add8.us, %I
- br i1 %exitcond23, label %for.end.loopexit, label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4, !tbaa !5
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4, !tbaa !5
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-
-; CHECK-LABEL: disable15
-; Latch != exit
-define void @disable15(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-; CHECK: %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
-; CHECK: %j.us = phi i32 [ %inc.us, %for.inner ], [ 0, %for.inner.preheader ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4, !tbaa !5
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4, !tbaa !5
- br label %for.outer
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-
-; CHECK-LABEL: disable16
-; Latch != exit
-define void @disable16(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-; CHECK: %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
-; CHECK: %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- %otherphi = phi i32 [ %other, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4, !tbaa !5
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4, !tbaa !5
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- %loadarr = getelementptr inbounds i32, i32* %A, i32 %i.us
- %load = load i32, i32* %arrayidx6.us, align 4, !tbaa !5
- %other = add i32 %otherphi, %load
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-
-attributes #0 = { "target-cpu"="cortex-m33" }
-
-!5 = !{!6, !6, i64 0}
-!6 = !{!"omnipotent char", !7, i64 0}
-!7 = !{!"Simple C/C++ TBAA"}
diff --git a/llvm/test/Transforms/LoopUnrollAndJam/pragma.ll b/llvm/test/Transforms/LoopUnrollAndJam/pragma.ll
deleted file mode 100644
index 0e1de74c1ed..00000000000
--- a/llvm/test/Transforms/LoopUnrollAndJam/pragma.ll
+++ /dev/null
@@ -1,313 +0,0 @@
-; RUN: opt -basicaa -tbaa -loop-unroll-and-jam < %s -S | FileCheck %s
-; RUN: opt -basicaa -tbaa -loop-unroll-and-jam -unroll-and-jam-threshold=15 < %s -S | FileCheck %s --check-prefix=CHECK-LOWTHRES
-
-target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
-target triple = "thumbv8m.main-arm-none-eabi"
-
-; CHECK-LABEL: test1
-; Basic check that these loops are by default UnJ'd
-define void @test1(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) {
-; CHECK: %i.us = phi i32 [ %add8.us.3, %for.latch ], [ 0, %for.outer.preheader.new ]
-; CHECK-LOWTHRES: %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-; CHECK-LABEL: nounroll_and_jam
-; #pragma nounroll_and_jam
-define void @nounroll_and_jam(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) {
-; CHECK: %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer, !llvm.loop !1
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-; CHECK-LABEL: unroll_and_jam_count
-; #pragma unroll_and_jam(8)
-define void @unroll_and_jam_count(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) {
-; CHECK: %i.us = phi i32 [ %add8.us.7, %for.latch ], [ 0, %for.outer.preheader.new ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer, !llvm.loop !3
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-; CHECK-LABEL: unroll_and_jam
-; #pragma unroll_and_jam
-define void @unroll_and_jam(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) {
-; CHECK: %i.us = phi i32 [ %add8.us.3, %for.latch ], [ 0, %for.outer.preheader.new ]
-; CHECK-LOWTHRES: %i.us = phi i32 [ %add8.us.3, %for.latch ], [ 0, %for.outer.preheader.new ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer, !llvm.loop !5
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-; CHECK-LABEL: nounroll
-; #pragma nounroll (which we take to mean disable unroll and jam too)
-define void @nounroll(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) {
-; CHECK: %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer, !llvm.loop !7
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-; CHECK-LABEL: unroll
-; #pragma unroll (which we take to mean disable unroll and jam)
-define void @unroll(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) {
-; CHECK: %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer, !llvm.loop !9
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-; CHECK-LABEL: nounroll_plus_unroll_and_jam
-; #pragma clang loop nounroll, unroll_and_jam (which we take to mean, do unroll_and_jam)
-define void @nounroll_plus_unroll_and_jam(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) {
-; CHECK: %i.us = phi i32 [ %add8.us.3, %for.latch ], [ 0, %for.outer.preheader.new ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer, !llvm.loop !11
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-!1 = distinct !{!1, !2}
-!2 = distinct !{!"llvm.loop.unroll_and_jam.disable"}
-!3 = distinct !{!3, !4}
-!4 = distinct !{!"llvm.loop.unroll_and_jam.count", i32 8}
-!5 = distinct !{!5, !6}
-!6 = distinct !{!"llvm.loop.unroll_and_jam.enable"}
-!7 = distinct !{!7, !8}
-!8 = distinct !{!"llvm.loop.unroll.disable"}
-!9 = distinct !{!9, !10}
-!10 = distinct !{!"llvm.loop.unroll.enable"}
-!11 = distinct !{!11, !8, !6} \ No newline at end of file
diff --git a/llvm/test/Transforms/LoopUnrollAndJam/unprofitable.ll b/llvm/test/Transforms/LoopUnrollAndJam/unprofitable.ll
deleted file mode 100644
index 36797d47be0..00000000000
--- a/llvm/test/Transforms/LoopUnrollAndJam/unprofitable.ll
+++ /dev/null
@@ -1,224 +0,0 @@
-; RUN: opt -loop-unroll-and-jam -pass-remarks=loop-unroll < %s -S 2>&1 | FileCheck %s
-
-target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
-target triple = "thumbv8m.main-arm-none-eabi"
-
-;; Common check for all tests. None should be unroll and jammed due to profitability
-; CHECK-NOT: remark: {{.*}} unroll and jammed
-
-
-; CHECK-LABEL: unprof1
-; Multiple inner loop blocks
-define void @unprof1(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-; CHECK: %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
-; CHECK: %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner2 ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner2 ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner2 ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4, !tbaa !5
- %add.us = add i32 %0, %sum1.us
-br label %for.inner2
-
-for.inner2:
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner2 ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4, !tbaa !5
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-
-; CHECK-LABEL: unprof2
-; Constant inner loop count
-define void @unprof2(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-; CHECK: %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
-; CHECK: %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4, !tbaa !5
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, 10
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4, !tbaa !5
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-
-; CHECK-LABEL: unprof3
-; Complex inner loop
-define void @unprof3(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-; CHECK: %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
-; CHECK: %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4, !tbaa !5
- %add.us = add i32 %0, %sum1.us
- %add.us0 = add i32 %0, %sum1.us
- %add.us1 = add i32 %0, %sum1.us
- %add.us2 = add i32 %0, %sum1.us
- %add.us3 = add i32 %0, %sum1.us
- %add.us4 = add i32 %0, %sum1.us
- %add.us5 = add i32 %0, %sum1.us
- %add.us6 = add i32 %0, %sum1.us
- %add.us7 = add i32 %0, %sum1.us
- %add.us8 = add i32 %0, %sum1.us
- %add.us9 = add i32 %0, %sum1.us
- %add.us10 = add i32 %0, %sum1.us
- %add.us11 = add i32 %0, %sum1.us
- %add.us12 = add i32 %0, %sum1.us
- %add.us13 = add i32 %0, %sum1.us
- %add.us14 = add i32 %0, %sum1.us
- %add.us15 = add i32 %0, %sum1.us
- %add.us16 = add i32 %0, %sum1.us
- %add.us17 = add i32 %0, %sum1.us
- %add.us18 = add i32 %0, %sum1.us
- %add.us19 = add i32 %0, %sum1.us
- %add.us20 = add i32 %0, %sum1.us
- %add.us21 = add i32 %0, %sum1.us
- %add.us22 = add i32 %0, %sum1.us
- %add.us23 = add i32 %0, %sum1.us
- %add.us24 = add i32 %0, %sum1.us
- %add.us25 = add i32 %0, %sum1.us
- %add.us26 = add i32 %0, %sum1.us
- %add.us27 = add i32 %0, %sum1.us
- %add.us28 = add i32 %0, %sum1.us
- %add.us29 = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4, !tbaa !5
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-
-; CHECK-LABEL: unprof4
-; No loop invariant loads
-define void @unprof4(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-; CHECK: %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
-; CHECK: %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %j2 = add i32 %j.us, %i.us
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j2
- %0 = load i32, i32* %arrayidx.us, align 4, !tbaa !5
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4, !tbaa !5
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-
-attributes #0 = { "target-cpu"="cortex-m33" }
-
-!5 = !{!6, !6, i64 0}
-!6 = !{!"omnipotent char", !7, i64 0}
-!7 = !{!"Simple C/C++ TBAA"}
diff --git a/llvm/test/Transforms/LoopUnrollAndJam/unroll-and-jam.ll b/llvm/test/Transforms/LoopUnrollAndJam/unroll-and-jam.ll
deleted file mode 100644
index 8bf04dac105..00000000000
--- a/llvm/test/Transforms/LoopUnrollAndJam/unroll-and-jam.ll
+++ /dev/null
@@ -1,744 +0,0 @@
-; RUN: opt -basicaa -tbaa -loop-unroll-and-jam -unroll-and-jam-count=4 < %s -S | FileCheck %s
-
-target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
-target triple = "thumbv8m.main-arm-none-eabi"
-
-; CHECK-LABEL: test1
-; Tests for(i) { sum = 0; for(j) sum += B[j]; A[i] = sum; }
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[J:%.*]], 0
-; CHECK-NEXT: [[CMP122:%.*]] = icmp ne i32 [[I:%.*]], 0
-; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[CMP]], [[CMP122]]
-; CHECK-NEXT: br i1 [[OR_COND]], label [[FOR_OUTER_PREHEADER:%.*]], label [[FOR_END:%.*]]
-; CHECK: for.outer.preheader:
-; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[I]], -1
-; CHECK-NEXT: [[XTRAITER:%.*]] = and i32 [[I]], 3
-; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i32 [[TMP0]], 3
-; CHECK-NEXT: br i1 [[TMP1]], label [[FOR_END_LOOPEXIT_UNR_LCSSA:%.*]], label [[FOR_OUTER_PREHEADER_NEW:%.*]]
-; CHECK: for.outer.preheader.new:
-; CHECK-NEXT: [[UNROLL_ITER:%.*]] = sub i32 [[I]], [[XTRAITER]]
-; CHECK-NEXT: br label [[FOR_OUTER:%.*]]
-; CHECK: for.outer:
-; CHECK-NEXT: [[I_US:%.*]] = phi i32 [ [[ADD8_US_3:%.*]], [[FOR_LATCH:%.*]] ], [ 0, [[FOR_OUTER_PREHEADER_NEW]] ]
-; CHECK-NEXT: [[NITER:%.*]] = phi i32 [ [[UNROLL_ITER]], [[FOR_OUTER_PREHEADER_NEW]] ], [ [[NITER_NSUB_3:%.*]], [[FOR_LATCH]] ]
-; CHECK-NEXT: [[ADD8_US:%.*]] = add nuw nsw i32 [[I_US]], 1
-; CHECK-NEXT: [[NITER_NSUB:%.*]] = sub i32 [[NITER]], 1
-; CHECK-NEXT: [[ADD8_US_1:%.*]] = add nuw nsw i32 [[ADD8_US]], 1
-; CHECK-NEXT: [[NITER_NSUB_1:%.*]] = sub i32 [[NITER_NSUB]], 1
-; CHECK-NEXT: [[ADD8_US_2:%.*]] = add nuw nsw i32 [[ADD8_US_1]], 1
-; CHECK-NEXT: [[NITER_NSUB_2:%.*]] = sub i32 [[NITER_NSUB_1]], 1
-; CHECK-NEXT: [[ADD8_US_3]] = add nuw i32 [[ADD8_US_2]], 1
-; CHECK-NEXT: [[NITER_NSUB_3]] = sub i32 [[NITER_NSUB_2]], 1
-; CHECK-NEXT: br label [[FOR_INNER:%.*]]
-; CHECK: for.inner:
-; CHECK-NEXT: [[J_US:%.*]] = phi i32 [ 0, [[FOR_OUTER]] ], [ [[INC_US:%.*]], [[FOR_INNER]] ]
-; CHECK-NEXT: [[SUM1_US:%.*]] = phi i32 [ 0, [[FOR_OUTER]] ], [ [[ADD_US:%.*]], [[FOR_INNER]] ]
-; CHECK-NEXT: [[J_US_1:%.*]] = phi i32 [ 0, [[FOR_OUTER]] ], [ [[INC_US_1:%.*]], [[FOR_INNER]] ]
-; CHECK-NEXT: [[SUM1_US_1:%.*]] = phi i32 [ 0, [[FOR_OUTER]] ], [ [[ADD_US_1:%.*]], [[FOR_INNER]] ]
-; CHECK-NEXT: [[J_US_2:%.*]] = phi i32 [ 0, [[FOR_OUTER]] ], [ [[INC_US_2:%.*]], [[FOR_INNER]] ]
-; CHECK-NEXT: [[SUM1_US_2:%.*]] = phi i32 [ 0, [[FOR_OUTER]] ], [ [[ADD_US_2:%.*]], [[FOR_INNER]] ]
-; CHECK-NEXT: [[J_US_3:%.*]] = phi i32 [ 0, [[FOR_OUTER]] ], [ [[INC_US_3:%.*]], [[FOR_INNER]] ]
-; CHECK-NEXT: [[SUM1_US_3:%.*]] = phi i32 [ 0, [[FOR_OUTER]] ], [ [[ADD_US_3:%.*]], [[FOR_INNER]] ]
-; CHECK-NEXT: [[ARRAYIDX_US:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i32 [[J_US]]
-; CHECK-NEXT: [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX_US]], align 4, !tbaa !0
-; CHECK-NEXT: [[ADD_US]] = add i32 [[TMP2]], [[SUM1_US]]
-; CHECK-NEXT: [[INC_US]] = add nuw i32 [[J_US]], 1
-; CHECK-NEXT: [[ARRAYIDX_US_1:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[J_US_1]]
-; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[ARRAYIDX_US_1]], align 4, !tbaa !0
-; CHECK-NEXT: [[ADD_US_1]] = add i32 [[TMP3]], [[SUM1_US_1]]
-; CHECK-NEXT: [[INC_US_1]] = add nuw i32 [[J_US_1]], 1
-; CHECK-NEXT: [[ARRAYIDX_US_2:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[J_US_2]]
-; CHECK-NEXT: [[TMP4:%.*]] = load i32, i32* [[ARRAYIDX_US_2]], align 4, !tbaa !0
-; CHECK-NEXT: [[ADD_US_2]] = add i32 [[TMP4]], [[SUM1_US_2]]
-; CHECK-NEXT: [[INC_US_2]] = add nuw i32 [[J_US_2]], 1
-; CHECK-NEXT: [[ARRAYIDX_US_3:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[J_US_3]]
-; CHECK-NEXT: [[TMP5:%.*]] = load i32, i32* [[ARRAYIDX_US_3]], align 4, !tbaa !0
-; CHECK-NEXT: [[ADD_US_3]] = add i32 [[TMP5]], [[SUM1_US_3]]
-; CHECK-NEXT: [[INC_US_3]] = add nuw i32 [[J_US_3]], 1
-; CHECK-NEXT: [[EXITCOND_3:%.*]] = icmp eq i32 [[INC_US_3]], [[J]]
-; CHECK-NEXT: br i1 [[EXITCOND_3]], label [[FOR_LATCH]], label [[FOR_INNER]]
-; CHECK: for.latch:
-; CHECK-NEXT: [[ADD_US_LCSSA:%.*]] = phi i32 [ [[ADD_US]], [[FOR_INNER]] ]
-; CHECK-NEXT: [[ADD_US_LCSSA_1:%.*]] = phi i32 [ [[ADD_US_1]], [[FOR_INNER]] ]
-; CHECK-NEXT: [[ADD_US_LCSSA_2:%.*]] = phi i32 [ [[ADD_US_2]], [[FOR_INNER]] ]
-; CHECK-NEXT: [[ADD_US_LCSSA_3:%.*]] = phi i32 [ [[ADD_US_3]], [[FOR_INNER]] ]
-; CHECK-NEXT: [[ARRAYIDX6_US:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i32 [[I_US]]
-; CHECK-NEXT: store i32 [[ADD_US_LCSSA]], i32* [[ARRAYIDX6_US]], align 4, !tbaa !0
-; CHECK-NEXT: [[ARRAYIDX6_US_1:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[ADD8_US]]
-; CHECK-NEXT: store i32 [[ADD_US_LCSSA_1]], i32* [[ARRAYIDX6_US_1]], align 4, !tbaa !0
-; CHECK-NEXT: [[ARRAYIDX6_US_2:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[ADD8_US_1]]
-; CHECK-NEXT: store i32 [[ADD_US_LCSSA_2]], i32* [[ARRAYIDX6_US_2]], align 4, !tbaa !0
-; CHECK-NEXT: [[ARRAYIDX6_US_3:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[ADD8_US_2]]
-; CHECK-NEXT: store i32 [[ADD_US_LCSSA_3]], i32* [[ARRAYIDX6_US_3]], align 4, !tbaa !0
-; CHECK-NEXT: [[NITER_NCMP_3:%.*]] = icmp eq i32 [[NITER_NSUB_3]], 0
-; CHECK-NEXT: br i1 [[NITER_NCMP_3]], label [[FOR_END_LOOPEXIT_UNR_LCSSA_LOOPEXIT:%.*]], label [[FOR_OUTER]], !llvm.loop !4
-; CHECK: for.end.loopexit.unr-lcssa.loopexit:
-; CHECK-NEXT: [[I_US_UNR_PH:%.*]] = phi i32 [ [[ADD8_US_3]], [[FOR_LATCH]] ]
-; CHECK-NEXT: br label [[FOR_END_LOOPEXIT_UNR_LCSSA]]
-; CHECK: for.end.loopexit.unr-lcssa:
-; CHECK-NEXT: [[I_US_UNR:%.*]] = phi i32 [ 0, [[FOR_OUTER_PREHEADER]] ], [ [[I_US_UNR_PH]], [[FOR_END_LOOPEXIT_UNR_LCSSA_LOOPEXIT]] ]
-; CHECK-NEXT: [[LCMP_MOD:%.*]] = icmp ne i32 [[XTRAITER]], 0
-; CHECK-NEXT: br i1 [[LCMP_MOD]], label [[FOR_OUTER_EPIL_PREHEADER:%.*]], label [[FOR_END_LOOPEXIT:%.*]]
-; CHECK: for.outer.epil.preheader:
-; CHECK-NEXT: br label [[FOR_OUTER_EPIL:%.*]]
-; CHECK: for.outer.epil:
-; CHECK-NEXT: br label [[FOR_INNER_EPIL:%.*]]
-; CHECK: for.inner.epil:
-; CHECK-NEXT: [[J_US_EPIL:%.*]] = phi i32 [ 0, [[FOR_OUTER_EPIL]] ], [ [[INC_US_EPIL:%.*]], [[FOR_INNER_EPIL]] ]
-; CHECK-NEXT: [[SUM1_US_EPIL:%.*]] = phi i32 [ 0, [[FOR_OUTER_EPIL]] ], [ [[ADD_US_EPIL:%.*]], [[FOR_INNER_EPIL]] ]
-; CHECK-NEXT: [[ARRAYIDX_US_EPIL:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[J_US_EPIL]]
-; CHECK-NEXT: [[TMP6:%.*]] = load i32, i32* [[ARRAYIDX_US_EPIL]], align 4, !tbaa !0
-; CHECK-NEXT: [[ADD_US_EPIL]] = add i32 [[TMP6]], [[SUM1_US_EPIL]]
-; CHECK-NEXT: [[INC_US_EPIL]] = add nuw i32 [[J_US_EPIL]], 1
-; CHECK-NEXT: [[EXITCOND_EPIL:%.*]] = icmp eq i32 [[INC_US_EPIL]], [[J]]
-; CHECK-NEXT: br i1 [[EXITCOND_EPIL]], label [[FOR_LATCH_EPIL:%.*]], label [[FOR_INNER_EPIL]]
-; CHECK: for.latch.epil:
-; CHECK-NEXT: [[ADD_US_LCSSA_EPIL:%.*]] = phi i32 [ [[ADD_US_EPIL]], [[FOR_INNER_EPIL]] ]
-; CHECK-NEXT: [[ARRAYIDX6_US_EPIL:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[I_US_UNR]]
-; CHECK-NEXT: store i32 [[ADD_US_LCSSA_EPIL]], i32* [[ARRAYIDX6_US_EPIL]], align 4, !tbaa !0
-; CHECK-NEXT: [[ADD8_US_EPIL:%.*]] = add nuw i32 [[I_US_UNR]], 1
-; CHECK-NEXT: [[EPIL_ITER_SUB:%.*]] = sub i32 [[XTRAITER]], 1
-; CHECK-NEXT: [[EPIL_ITER_CMP:%.*]] = icmp ne i32 [[EPIL_ITER_SUB]], 0
-; CHECK-NEXT: br i1 [[EPIL_ITER_CMP]], label [[FOR_OUTER_EPIL_1:%.*]], label [[FOR_END_LOOPEXIT_EPILOG_LCSSA:%.*]]
-; CHECK: for.end.loopexit.epilog-lcssa:
-; CHECK-NEXT: br label [[FOR_END_LOOPEXIT]]
-; CHECK: for.end.loopexit:
-; CHECK-NEXT: br label [[FOR_END]]
-; CHECK: for.end:
-; CHECK-NEXT: ret void
-; CHECK: for.outer.epil.1:
-; CHECK-NEXT: br label [[FOR_INNER_EPIL_1:%.*]]
-; CHECK: for.inner.epil.1:
-; CHECK-NEXT: [[J_US_EPIL_1:%.*]] = phi i32 [ 0, [[FOR_OUTER_EPIL_1]] ], [ [[INC_US_EPIL_1:%.*]], [[FOR_INNER_EPIL_1]] ]
-; CHECK-NEXT: [[SUM1_US_EPIL_1:%.*]] = phi i32 [ 0, [[FOR_OUTER_EPIL_1]] ], [ [[ADD_US_EPIL_1:%.*]], [[FOR_INNER_EPIL_1]] ]
-; CHECK-NEXT: [[ARRAYIDX_US_EPIL_1:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[J_US_EPIL_1]]
-; CHECK-NEXT: [[TMP7:%.*]] = load i32, i32* [[ARRAYIDX_US_EPIL_1]], align 4, !tbaa !0
-; CHECK-NEXT: [[ADD_US_EPIL_1]] = add i32 [[TMP7]], [[SUM1_US_EPIL_1]]
-; CHECK-NEXT: [[INC_US_EPIL_1]] = add nuw i32 [[J_US_EPIL_1]], 1
-; CHECK-NEXT: [[EXITCOND_EPIL_1:%.*]] = icmp eq i32 [[INC_US_EPIL_1]], [[J]]
-; CHECK-NEXT: br i1 [[EXITCOND_EPIL_1]], label [[FOR_LATCH_EPIL_1:%.*]], label [[FOR_INNER_EPIL_1]]
-; CHECK: for.latch.epil.1:
-; CHECK-NEXT: [[ADD_US_LCSSA_EPIL_1:%.*]] = phi i32 [ [[ADD_US_EPIL_1]], [[FOR_INNER_EPIL_1]] ]
-; CHECK-NEXT: [[ARRAYIDX6_US_EPIL_1:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[ADD8_US_EPIL]]
-; CHECK-NEXT: store i32 [[ADD_US_LCSSA_EPIL_1]], i32* [[ARRAYIDX6_US_EPIL_1]], align 4, !tbaa !0
-; CHECK-NEXT: [[ADD8_US_EPIL_1:%.*]] = add nuw i32 [[ADD8_US_EPIL]], 1
-; CHECK-NEXT: [[EPIL_ITER_SUB_1:%.*]] = sub i32 [[EPIL_ITER_SUB]], 1
-; CHECK-NEXT: [[EPIL_ITER_CMP_1:%.*]] = icmp ne i32 [[EPIL_ITER_SUB_1]], 0
-; CHECK-NEXT: br i1 [[EPIL_ITER_CMP_1]], label [[FOR_OUTER_EPIL_2:%.*]], label [[FOR_END_LOOPEXIT_EPILOG_LCSSA]]
-; CHECK: for.outer.epil.2:
-; CHECK-NEXT: br label [[FOR_INNER_EPIL_2:%.*]]
-; CHECK: for.inner.epil.2:
-; CHECK-NEXT: [[J_US_EPIL_2:%.*]] = phi i32 [ 0, [[FOR_OUTER_EPIL_2]] ], [ [[INC_US_EPIL_2:%.*]], [[FOR_INNER_EPIL_2]] ]
-; CHECK-NEXT: [[SUM1_US_EPIL_2:%.*]] = phi i32 [ 0, [[FOR_OUTER_EPIL_2]] ], [ [[ADD_US_EPIL_2:%.*]], [[FOR_INNER_EPIL_2]] ]
-; CHECK-NEXT: [[ARRAYIDX_US_EPIL_2:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[J_US_EPIL_2]]
-; CHECK-NEXT: [[TMP8:%.*]] = load i32, i32* [[ARRAYIDX_US_EPIL_2]], align 4, !tbaa !0
-; CHECK-NEXT: [[ADD_US_EPIL_2]] = add i32 [[TMP8]], [[SUM1_US_EPIL_2]]
-; CHECK-NEXT: [[INC_US_EPIL_2]] = add nuw i32 [[J_US_EPIL_2]], 1
-; CHECK-NEXT: [[EXITCOND_EPIL_2:%.*]] = icmp eq i32 [[INC_US_EPIL_2]], [[J]]
-; CHECK-NEXT: br i1 [[EXITCOND_EPIL_2]], label [[FOR_LATCH_EPIL_2:%.*]], label [[FOR_INNER_EPIL_2]]
-; CHECK: for.latch.epil.2:
-; CHECK-NEXT: [[ADD_US_LCSSA_EPIL_2:%.*]] = phi i32 [ [[ADD_US_EPIL_2]], [[FOR_INNER_EPIL_2]] ]
-; CHECK-NEXT: [[ARRAYIDX6_US_EPIL_2:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[ADD8_US_EPIL_1]]
-; CHECK-NEXT: store i32 [[ADD_US_LCSSA_EPIL_2]], i32* [[ARRAYIDX6_US_EPIL_2]], align 4, !tbaa !0
-; CHECK-NEXT: [[ADD8_US_EPIL_2:%.*]] = add nuw i32 [[ADD8_US_EPIL_1]], 1
-; CHECK-NEXT: [[EPIL_ITER_SUB_2:%.*]] = sub i32 [[EPIL_ITER_SUB_1]], 1
-; CHECK-NEXT: br label [[FOR_END_LOOPEXIT_EPILOG_LCSSA]]
-define void @test1(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %0 = load i32, i32* %arrayidx.us, align 4, !tbaa !5
- %add.us = add i32 %0, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4, !tbaa !5
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-; CHECK-LABEL: test2
-; Tests for(i) { sum = A[i]; for(j) sum += B[j]; A[i] = sum; }
-; A[i] load/store dependency should not block unroll-and-jam
-; CHECK: for.outer:
-; CHECK: %i.us = phi i32 [ %add9.us.3, %for.latch ], [ 0, %for.outer.preheader.new ]
-; CHECK: %niter = phi i32 [ %unroll_iter, %for.outer.preheader.new ], [ %niter.nsub.3, %for.latch ]
-; CHECK: br label %for.inner
-; CHECK: for.inner:
-; CHECK: %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
-; CHECK: %sum1.us = phi i32 [ %2, %for.outer ], [ %add.us, %for.inner ]
-; CHECK: %j.us.1 = phi i32 [ 0, %for.outer ], [ %inc.us.1, %for.inner ]
-; CHECK: %sum1.us.1 = phi i32 [ %3, %for.outer ], [ %add.us.1, %for.inner ]
-; CHECK: %j.us.2 = phi i32 [ 0, %for.outer ], [ %inc.us.2, %for.inner ]
-; CHECK: %sum1.us.2 = phi i32 [ %4, %for.outer ], [ %add.us.2, %for.inner ]
-; CHECK: %j.us.3 = phi i32 [ 0, %for.outer ], [ %inc.us.3, %for.inner ]
-; CHECK: %sum1.us.3 = phi i32 [ %5, %for.outer ], [ %add.us.3, %for.inner ]
-; CHECK: br i1 %exitcond.3, label %for.latch, label %for.inner
-; CHECK: for.latch:
-; CHECK: %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
-; CHECK: %add.us.lcssa.1 = phi i32 [ %add.us.1, %for.inner ]
-; CHECK: %add.us.lcssa.2 = phi i32 [ %add.us.2, %for.inner ]
-; CHECK: %add.us.lcssa.3 = phi i32 [ %add.us.3, %for.inner ]
-; CHECK: br i1 %niter.ncmp.3, label %for.end10.loopexit.unr-lcssa.loopexit, label %for.outer
-; CHECK: for.end10.loopexit.unr-lcssa.loopexit:
-define void @test2(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp125 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp125
- br i1 %or.cond, label %for.outer.preheader, label %for.end10
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add9.us, %for.latch ], [ 0, %for.outer.preheader ]
- %arrayidx.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- %0 = load i32, i32* %arrayidx.us, align 4, !tbaa !5
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ %0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %B, i32 %j.us
- %1 = load i32, i32* %arrayidx6.us, align 4, !tbaa !5
- %add.us = add i32 %1, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- store i32 %add.us.lcssa, i32* %arrayidx.us, align 4, !tbaa !5
- %add9.us = add nuw i32 %i.us, 1
- %exitcond28 = icmp eq i32 %add9.us, %I
- br i1 %exitcond28, label %for.end10.loopexit, label %for.outer
-
-for.end10.loopexit:
- br label %for.end10
-
-for.end10:
- ret void
-}
-
-
-; CHECK-LABEL: test3
-; Tests Complete unroll-and-jam of the outer loop
-; CHECK: for.outer:
-; CHECK: br label %for.inner
-; CHECK: for.inner:
-; CHECK: %j.021 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
-; CHECK: %sum1.020 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]
-; CHECK: %j.021.1 = phi i32 [ 0, %for.outer ], [ %inc.1, %for.inner ]
-; CHECK: %sum1.020.1 = phi i32 [ 0, %for.outer ], [ %add.1, %for.inner ]
-; CHECK: %j.021.2 = phi i32 [ 0, %for.outer ], [ %inc.2, %for.inner ]
-; CHECK: %sum1.020.2 = phi i32 [ 0, %for.outer ], [ %add.2, %for.inner ]
-; CHECK: %j.021.3 = phi i32 [ 0, %for.outer ], [ %inc.3, %for.inner ]
-; CHECK: %sum1.020.3 = phi i32 [ 0, %for.outer ], [ %add.3, %for.inner ]
-; CHECK: br i1 %exitcond.3, label %for.latch, label %for.inner
-; CHECK: for.latch:
-; CHECK: %add.lcssa = phi i32 [ %add, %for.inner ]
-; CHECK: %add.lcssa.1 = phi i32 [ %add.1, %for.inner ]
-; CHECK: %add.lcssa.2 = phi i32 [ %add.2, %for.inner ]
-; CHECK: %add.lcssa.3 = phi i32 [ %add.3, %for.inner ]
-; CHECK: br label %for.end
-; CHECK: for.end:
-define void @test3(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-entry:
- %cmp = icmp eq i32 %J, 0
- br i1 %cmp, label %for.end, label %for.preheader
-
-for.preheader:
- br label %for.outer
-
-for.outer:
- %i.022 = phi i32 [ %add8, %for.latch ], [ 0, %for.preheader ]
- br label %for.inner
-
-for.inner:
- %j.021 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
- %sum1.020 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]
- %arrayidx = getelementptr inbounds i32, i32* %B, i32 %j.021
- %0 = load i32, i32* %arrayidx, align 4, !tbaa !5
- %sub = add i32 %sum1.020, 10
- %add = sub i32 %sub, %0
- %inc = add nuw i32 %j.021, 1
- %exitcond = icmp eq i32 %inc, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %arrayidx6 = getelementptr inbounds i32, i32* %A, i32 %i.022
- store i32 %add, i32* %arrayidx6, align 4, !tbaa !5
- %add8 = add nuw nsw i32 %i.022, 1
- %exitcond23 = icmp eq i32 %add8, 4
- br i1 %exitcond23, label %for.end, label %for.outer
-
-for.end:
- ret void
-}
-
-; CHECK-LABEL: test4
-; Tests Complete unroll-and-jam with a trip count of 1
-; CHECK: for.outer:
-; CHECK: br label %for.inner
-; CHECK: for.inner:
-; CHECK: %j.021 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
-; CHECK: %sum1.020 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]
-; CHECK: br i1 %exitcond, label %for.latch, label %for.inner
-; CHECK: for.latch:
-; CHECK: %add.lcssa = phi i32 [ %add, %for.inner ]
-; CHECK: br label %for.end
-; CHECK: for.end:
-define void @test4(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-entry:
- %cmp = icmp eq i32 %J, 0
- br i1 %cmp, label %for.end, label %for.preheader
-
-for.preheader:
- br label %for.outer
-
-for.outer:
- %i.022 = phi i32 [ %add8, %for.latch ], [ 0, %for.preheader ]
- br label %for.inner
-
-for.inner:
- %j.021 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
- %sum1.020 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]
- %arrayidx = getelementptr inbounds i32, i32* %B, i32 %j.021
- %0 = load i32, i32* %arrayidx, align 4, !tbaa !5
- %sub = add i32 %sum1.020, 10
- %add = sub i32 %sub, %0
- %inc = add nuw i32 %j.021, 1
- %exitcond = icmp eq i32 %inc, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %arrayidx6 = getelementptr inbounds i32, i32* %A, i32 %i.022
- store i32 %add, i32* %arrayidx6, align 4, !tbaa !5
- %add8 = add nuw nsw i32 %i.022, 1
- %exitcond23 = icmp eq i32 %add8, 1
- br i1 %exitcond23, label %for.end, label %for.outer
-
-for.end:
- ret void
-}
-
-
-
-
-
-; CHECK-LABEL: test5
-; Multiple SubLoopBlocks
-; CHECK: for.outer:
-; CHECK: br label %for.inner
-; CHECK: for.inner:
-; CHECK: %inc8.sink15 = phi i32 [ 0, %for.outer ], [ %inc8, %for.inc.1 ]
-; CHECK: %inc8.sink15.1 = phi i32 [ 0, %for.outer ], [ %inc8.1, %for.inc.1 ]
-; CHECK: br label %for.inner2
-; CHECK: for.inner2:
-; CHECK: br i1 %tobool, label %for.cond4, label %for.inc
-; CHECK: for.cond4:
-; CHECK: br i1 %tobool.1, label %for.cond4a, label %for.inc
-; CHECK: for.cond4a:
-; CHECK: br label %for.inc
-; CHECK: for.inc:
-; CHECK: br i1 %tobool.11, label %for.cond4.1, label %for.inc.1
-; CHECK: for.latch:
-; CHECK: br label %for.end
-; CHECK: for.end:
-; CHECK: ret i32 0
-; CHECK: for.cond4.1:
-; CHECK: br i1 %tobool.1.1, label %for.cond4a.1, label %for.inc.1
-; CHECK: for.cond4a.1:
-; CHECK: br label %for.inc.1
-; CHECK: for.inc.1:
-; CHECK: br i1 %exitcond.1, label %for.latch, label %for.inner
-@a = hidden global [1 x i32] zeroinitializer, align 4
-define i32 @test5() #0 {
-entry:
- br label %for.outer
-
-for.outer:
- %.sink16 = phi i32 [ 0, %entry ], [ %add, %for.latch ]
- br label %for.inner
-
-for.inner:
- %inc8.sink15 = phi i32 [ 0, %for.outer ], [ %inc8, %for.inc ]
- br label %for.inner2
-
-for.inner2:
- %l1 = load i32, i32* getelementptr inbounds ([1 x i32], [1 x i32]* @a, i32 0, i32 0), align 4
- %tobool = icmp eq i32 %l1, 0
- br i1 %tobool, label %for.cond4, label %for.inc
-
-for.cond4:
- %l0 = load i32, i32* getelementptr inbounds ([1 x i32], [1 x i32]* @a, i32 1, i32 0), align 4
- %tobool.1 = icmp eq i32 %l0, 0
- br i1 %tobool.1, label %for.cond4a, label %for.inc
-
-for.cond4a:
- br label %for.inc
-
-for.inc:
- %l2 = phi i32 [ 0, %for.inner2 ], [ 1, %for.cond4 ], [ 2, %for.cond4a ]
- %inc8 = add nuw nsw i32 %inc8.sink15, 1
- %exitcond = icmp eq i32 %inc8, 3
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %.lcssa = phi i32 [ %l2, %for.inc ]
- %conv11 = and i32 %.sink16, 255
- %add = add nuw nsw i32 %conv11, 4
- %cmp = icmp eq i32 %add, 8
- br i1 %cmp, label %for.end, label %for.outer
-
-for.end:
- %.lcssa.lcssa = phi i32 [ %.lcssa, %for.latch ]
- ret i32 0
-}
-
-
-
-
-; CHECK-LABEL: test6
-; Test odd uses of phi nodes
-; CHECK: for.outer:
-; CHECK: br label %for.inner
-; CHECK: for.inner:
-; CHECK: br i1 %exitcond.3, label %for.inner, label %for.latch
-; CHECK: for.latch:
-; CHECK: br label %for.end
-; CHECK: for.end:
-; CHECK: ret i32 0
-@f = hidden global i32 0, align 4
-define i32 @test6() #0 {
-entry:
- %f.promoted10 = load i32, i32* @f, align 4, !tbaa !5
- br label %for.outer
-
-for.outer:
- %p0 = phi i32 [ %f.promoted10, %entry ], [ 2, %for.latch ]
- %inc5.sink9 = phi i32 [ 2, %entry ], [ %inc5, %for.latch ]
- br label %for.inner
-
-for.inner:
- %p1 = phi i32 [ %p0, %for.outer ], [ 2, %for.inner ]
- %inc.sink8 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
- %inc = add nuw nsw i32 %inc.sink8, 1
- %exitcond = icmp ne i32 %inc, 7
- br i1 %exitcond, label %for.inner, label %for.latch
-
-for.latch:
- %.lcssa = phi i32 [ %p1, %for.inner ]
- %inc5 = add nuw nsw i32 %inc5.sink9, 1
- %exitcond11 = icmp ne i32 %inc5, 7
- br i1 %exitcond11, label %for.outer, label %for.end
-
-for.end:
- %.lcssa.lcssa = phi i32 [ %.lcssa, %for.latch ]
- %inc.lcssa.lcssa = phi i32 [ 7, %for.latch ]
- ret i32 0
-}
-
-
-
-; CHECK-LABEL: test7
-; Has a positive dependency between two stores. Still valid.
-; The negative dependecy is in unroll-and-jam-disabled.ll
-; CHECK: for.outer:
-; CHECK: %i = phi i32 [ %add.3, %for.latch ], [ 0, %for.preheader.new ]
-; CHECK: %niter = phi i32 [ %unroll_iter, %for.preheader.new ], [ %niter.nsub.3, %for.latch ]
-; CHECK: br label %for.inner
-; CHECK: for.latch:
-; CHECK: %add9.lcssa = phi i32 [ %add9, %for.inner ]
-; CHECK: %add9.lcssa.1 = phi i32 [ %add9.1, %for.inner ]
-; CHECK: %add9.lcssa.2 = phi i32 [ %add9.2, %for.inner ]
-; CHECK: %add9.lcssa.3 = phi i32 [ %add9.3, %for.inner ]
-; CHECK: br i1 %niter.ncmp.3, label %for.end.loopexit.unr-lcssa.loopexit, label %for.outer
-; CHECK: for.inner:
-; CHECK: %sum = phi i32 [ 0, %for.outer ], [ %add9, %for.inner ]
-; CHECK: %j = phi i32 [ 0, %for.outer ], [ %add10, %for.inner ]
-; CHECK: %sum.1 = phi i32 [ 0, %for.outer ], [ %add9.1, %for.inner ]
-; CHECK: %j.1 = phi i32 [ 0, %for.outer ], [ %add10.1, %for.inner ]
-; CHECK: %sum.2 = phi i32 [ 0, %for.outer ], [ %add9.2, %for.inner ]
-; CHECK: %j.2 = phi i32 [ 0, %for.outer ], [ %add10.2, %for.inner ]
-; CHECK: %sum.3 = phi i32 [ 0, %for.outer ], [ %add9.3, %for.inner ]
-; CHECK: %j.3 = phi i32 [ 0, %for.outer ], [ %add10.3, %for.inner ]
-; CHECK: br i1 %exitcond.3, label %for.latch, label %for.inner
-; CHECK: for.end.loopexit.unr-lcssa.loopexit:
-define void @test7(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp128 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp128, %cmp
- br i1 %or.cond, label %for.preheader, label %for.end
-
-for.preheader:
- br label %for.outer
-
-for.outer:
- %i = phi i32 [ %add, %for.latch ], [ 0, %for.preheader ]
- %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i
- store i32 0, i32* %arrayidx, align 4, !tbaa !5
- %add = add nuw i32 %i, 1
- %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %add
- store i32 2, i32* %arrayidx2, align 4, !tbaa !5
- br label %for.inner
-
-for.latch:
- store i32 %add9, i32* %arrayidx, align 4, !tbaa !5
- %exitcond30 = icmp eq i32 %add, %I
- br i1 %exitcond30, label %for.end, label %for.outer
-
-for.inner:
- %sum = phi i32 [ 0, %for.outer ], [ %add9, %for.inner ]
- %j = phi i32 [ 0, %for.outer ], [ %add10, %for.inner ]
- %arrayidx7 = getelementptr inbounds i32, i32* %B, i32 %j
- %l1 = load i32, i32* %arrayidx7, align 4, !tbaa !5
- %add9 = add i32 %l1, %sum
- %add10 = add nuw i32 %j, 1
- %exitcond = icmp eq i32 %add10, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.end:
- ret void
-}
-
-
-
-; CHECK-LABEL: test8
-; Same as test7 with an extra outer loop nest
-; CHECK: for.outest:
-; CHECK: br label %for.outer
-; CHECK: for.outer:
-; CHECK: %i = phi i32 [ %add.3, %for.latch ], [ 0, %for.outest.new ]
-; CHECK: %niter = phi i32 [ %unroll_iter, %for.outest.new ], [ %niter.nsub.3, %for.latch ]
-; CHECK: br label %for.inner
-; CHECK: for.inner:
-; CHECK: %sum = phi i32 [ 0, %for.outer ], [ %add9, %for.inner ]
-; CHECK: %j = phi i32 [ 0, %for.outer ], [ %add10, %for.inner ]
-; CHECK: %sum.1 = phi i32 [ 0, %for.outer ], [ %add9.1, %for.inner ]
-; CHECK: %j.1 = phi i32 [ 0, %for.outer ], [ %add10.1, %for.inner ]
-; CHECK: %sum.2 = phi i32 [ 0, %for.outer ], [ %add9.2, %for.inner ]
-; CHECK: %j.2 = phi i32 [ 0, %for.outer ], [ %add10.2, %for.inner ]
-; CHECK: %sum.3 = phi i32 [ 0, %for.outer ], [ %add9.3, %for.inner ]
-; CHECK: %j.3 = phi i32 [ 0, %for.outer ], [ %add10.3, %for.inner ]
-; CHECK: br i1 %exitcond.3, label %for.latch, label %for.inner
-; CHECK: for.latch:
-; CHECK: %add9.lcssa = phi i32 [ %add9, %for.inner ]
-; CHECK: %add9.lcssa.1 = phi i32 [ %add9.1, %for.inner ]
-; CHECK: %add9.lcssa.2 = phi i32 [ %add9.2, %for.inner ]
-; CHECK: %add9.lcssa.3 = phi i32 [ %add9.3, %for.inner ]
-; CHECK: br i1 %niter.ncmp.3, label %for.cleanup.unr-lcssa.loopexit, label %for.outer
-; CHECK: for.cleanup.epilog-lcssa:
-; CHECK: br label %for.cleanup
-; CHECK: for.cleanup:
-; CHECK: br i1 %exitcond41, label %for.end.loopexit, label %for.outest
-; CHECK: for.end.loopexit:
-; CHECK: br label %for.end
-define void @test8(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
-entry:
- %cmp = icmp eq i32 %J, 0
- %cmp336 = icmp eq i32 %I, 0
- %or.cond = or i1 %cmp, %cmp336
- br i1 %or.cond, label %for.end, label %for.preheader
-
-for.preheader:
- br label %for.outest
-
-for.outest:
- %x.038 = phi i32 [ %inc, %for.cleanup ], [ 0, %for.preheader ]
- br label %for.outer
-
-for.outer:
- %i = phi i32 [ %add, %for.latch ], [ 0, %for.outest ]
- %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i
- store i32 0, i32* %arrayidx, align 4, !tbaa !5
- %add = add nuw i32 %i, 1
- %arrayidx6 = getelementptr inbounds i32, i32* %A, i32 %add
- store i32 2, i32* %arrayidx6, align 4, !tbaa !5
- br label %for.inner
-
-for.inner:
- %sum = phi i32 [ 0, %for.outer ], [ %add9, %for.inner ]
- %j = phi i32 [ 0, %for.outer ], [ %add10, %for.inner ]
- %arrayidx11 = getelementptr inbounds i32, i32* %B, i32 %j
- %l1 = load i32, i32* %arrayidx11, align 4, !tbaa !5
- %add9 = add i32 %l1, %sum
- %add10 = add nuw i32 %j, 1
- %exitcond = icmp eq i32 %add10, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- store i32 %add9, i32* %arrayidx, align 4, !tbaa !5
- %exitcond39 = icmp eq i32 %add, %I
- br i1 %exitcond39, label %for.cleanup, label %for.outer
-
-for.cleanup:
- %inc = add nuw nsw i32 %x.038, 1
- %exitcond41 = icmp eq i32 %inc, 5
- br i1 %exitcond41, label %for.end, label %for.outest
-
-
-for.end:
- ret void
-}
-
-; CHECK-LABEL: test9
-; Same as test1 with tbaa, not noalias
-; CHECK: for.outer:
-; CHECK: %i.us = phi i32 [ %add8.us.3, %for.latch ], [ 0, %for.outer.preheader.new ]
-; CHECK: %niter = phi i32 [ %unroll_iter, %for.outer.preheader.new ], [ %niter.nsub.3, %for.latch ]
-; CHECK: br label %for.inner
-; CHECK: for.inner:
-; CHECK: %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
-; CHECK: %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
-; CHECK: %j.us.1 = phi i32 [ 0, %for.outer ], [ %inc.us.1, %for.inner ]
-; CHECK: %sum1.us.1 = phi i32 [ 0, %for.outer ], [ %add.us.1, %for.inner ]
-; CHECK: %j.us.2 = phi i32 [ 0, %for.outer ], [ %inc.us.2, %for.inner ]
-; CHECK: %sum1.us.2 = phi i32 [ 0, %for.outer ], [ %add.us.2, %for.inner ]
-; CHECK: %j.us.3 = phi i32 [ 0, %for.outer ], [ %inc.us.3, %for.inner ]
-; CHECK: %sum1.us.3 = phi i32 [ 0, %for.outer ], [ %add.us.3, %for.inner ]
-; CHECK: br i1 %exitcond.3, label %for.latch, label %for.inner
-; CHECK: for.latch:
-; CHECK: %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
-; CHECK: %add.us.lcssa.1 = phi i32 [ %add.us.1, %for.inner ]
-; CHECK: %add.us.lcssa.2 = phi i32 [ %add.us.2, %for.inner ]
-; CHECK: %add.us.lcssa.3 = phi i32 [ %add.us.3, %for.inner ]
-; CHECK: br i1 %niter.ncmp.3, label %for.end.loopexit.unr-lcssa.loopexit, label %for.outer
-; CHECK: for.end.loopexit.unr-lcssa.loopexit:
-define void @test9(i32 %I, i32 %J, i32* nocapture %A, i16* nocapture readonly %B) #0 {
-entry:
- %cmp = icmp ne i32 %J, 0
- %cmp122 = icmp ne i32 %I, 0
- %or.cond = and i1 %cmp, %cmp122
- br i1 %or.cond, label %for.outer.preheader, label %for.end
-
-for.outer.preheader:
- br label %for.outer
-
-for.outer:
- %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
- br label %for.inner
-
-for.inner:
- %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
- %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
- %arrayidx.us = getelementptr inbounds i16, i16* %B, i32 %j.us
- %0 = load i16, i16* %arrayidx.us, align 4, !tbaa !9
- %sext = sext i16 %0 to i32
- %add.us = add i32 %sext, %sum1.us
- %inc.us = add nuw i32 %j.us, 1
- %exitcond = icmp eq i32 %inc.us, %J
- br i1 %exitcond, label %for.latch, label %for.inner
-
-for.latch:
- %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
- %arrayidx6.us = getelementptr inbounds i32, i32* %A, i32 %i.us
- store i32 %add.us.lcssa, i32* %arrayidx6.us, align 4, !tbaa !5
- %add8.us = add nuw i32 %i.us, 1
- %exitcond25 = icmp eq i32 %add8.us, %I
- br i1 %exitcond25, label %for.end.loopexit, label %for.outer
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- ret void
-}
-
-
-
-; CHECK-LABEL: test10
-; Be careful not to incorrectly update the exit phi nodes
-; CHECK: %dec19.lcssa.lcssa.lcssa.ph.ph = phi i64 [ 0, %for.inc24 ]
-%struct.a = type { i64 }
-@g = common global %struct.a zeroinitializer, align 8
-@c = common global [1 x i8] zeroinitializer, align 1
-; Function Attrs: noinline norecurse nounwind uwtable
-define signext i16 @test10(i32 %k) #0 {
-entry:
- %0 = load i8, i8* getelementptr inbounds ([1 x i8], [1 x i8]* @c, i64 0, i64 0), align 1
- %tobool9 = icmp eq i8 %0, 0
- %tobool13 = icmp ne i32 %k, 0
- br label %for.body
-
-for.body: ; preds = %entry, %for.inc24
- %storemerge82 = phi i64 [ 0, %entry ], [ %inc25, %for.inc24 ]
- br label %for.body2
-
-for.body2: ; preds = %for.body, %for.inc21
- %storemerge2881 = phi i64 [ 4, %for.body ], [ %dec22, %for.inc21 ]
- br i1 %tobool9, label %for.body2.split, label %for.body2.split.us
-
-for.body2.split.us: ; preds = %for.body2
- br i1 %tobool13, label %for.inc21, label %for.inc21.loopexit83
-
-for.body2.split: ; preds = %for.body2
- br i1 %tobool13, label %for.inc21, label %for.inc21.loopexit85
-
-for.inc21.loopexit83: ; preds = %for.body2.split.us
- %storemerge31.us37.lcssa.lcssa = phi i64 [ 0, %for.body2.split.us ]
- br label %for.inc21
-
-for.inc21.loopexit85: ; preds = %for.body2.split
- %storemerge31.lcssa.lcssa87 = phi i64 [ 0, %for.body2.split ]
- %storemerge30.lcssa.lcssa86 = phi i32 [ 0, %for.body2.split ]
- br label %for.inc21
-
-for.inc21: ; preds = %for.body2.split, %for.body2.split.us, %for.inc21.loopexit85, %for.inc21.loopexit83
- %storemerge31.lcssa.lcssa = phi i64 [ %storemerge31.us37.lcssa.lcssa, %for.inc21.loopexit83 ], [ %storemerge31.lcssa.lcssa87, %for.inc21.loopexit85 ], [ 4, %for.body2.split.us ], [ 4, %for.body2.split ]
- %storemerge30.lcssa.lcssa = phi i32 [ 0, %for.inc21.loopexit83 ], [ %storemerge30.lcssa.lcssa86, %for.inc21.loopexit85 ], [ 0, %for.body2.split.us ], [ 0, %for.body2.split ]
- %dec22 = add nsw i64 %storemerge2881, -1
- %tobool = icmp eq i64 %dec22, 0
- br i1 %tobool, label %for.inc24, label %for.body2
-
-for.inc24: ; preds = %for.inc21
- %storemerge31.lcssa.lcssa.lcssa = phi i64 [ %storemerge31.lcssa.lcssa, %for.inc21 ]
- %storemerge30.lcssa.lcssa.lcssa = phi i32 [ %storemerge30.lcssa.lcssa, %for.inc21 ]
- %inc25 = add nuw nsw i64 %storemerge82, 1
- %exitcond = icmp ne i64 %inc25, 5
- br i1 %exitcond, label %for.body, label %for.end26
-
-for.end26: ; preds = %for.inc24
- %dec19.lcssa.lcssa.lcssa = phi i64 [ 0, %for.inc24 ]
- %storemerge31.lcssa.lcssa.lcssa.lcssa = phi i64 [ %storemerge31.lcssa.lcssa.lcssa, %for.inc24 ]
- %storemerge30.lcssa.lcssa.lcssa.lcssa = phi i32 [ %storemerge30.lcssa.lcssa.lcssa, %for.inc24 ]
- store i64 %dec19.lcssa.lcssa.lcssa, i64* getelementptr inbounds (%struct.a, %struct.a* @g, i64 0, i32 0), align 8
- ret i16 0
-}
-
-
-attributes #0 = { "target-cpu"="cortex-m33" }
-
-!5 = !{!6, !6, i64 0}
-!6 = !{!"int", !7, i64 0}
-!7 = !{!"omnipotent char", !8, i64 0}
-!8 = !{!"Simple C/C++ TBAA"}
-!9 = !{!10, !10, i64 0}
-!10 = !{!"short", !7, i64 0}
OpenPOWER on IntegriCloud