summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorAlina Sbirlea <asbirlea@google.com>2018-10-24 22:46:45 +0000
committerAlina Sbirlea <asbirlea@google.com>2018-10-24 22:46:45 +0000
commitad4d018202d7f967c56b6adcfc283f7273b9d356 (patch)
tree9e10f57e88dffe7575e33d94fd61fe0e58e2f559 /llvm/test
parentc8ae09673969e7b179fe419d780d1d0f2d2c2c19 (diff)
downloadbcm5719-llvm-ad4d018202d7f967c56b6adcfc283f7273b9d356.tar.gz
bcm5719-llvm-ad4d018202d7f967c56b6adcfc283f7273b9d356.zip
Update MemorySSA in LoopRotate.
Summary: Teach LoopRotate to preserve MemorySSA. Enable tests for correctness, dependency disabled by default. Subscribers: sanjoy, jlebar, Prazek, george.burgess.iv, llvm-commits Differential Revision: https://reviews.llvm.org/D51718 llvm-svn: 345216
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/Transforms/LoopRotate/2009-01-25-SingleEntryPhi.ll1
-rw-r--r--llvm/test/Transforms/LoopRotate/PhiRename-1.ll1
-rw-r--r--llvm/test/Transforms/LoopRotate/PhiSelfReference-1.ll1
-rw-r--r--llvm/test/Transforms/LoopRotate/alloca.ll1
-rw-r--r--llvm/test/Transforms/LoopRotate/basic.ll2
-rwxr-xr-xllvm/test/Transforms/LoopRotate/catchret.ll1
-rw-r--r--llvm/test/Transforms/LoopRotate/convergent.ll1
-rw-r--r--llvm/test/Transforms/LoopRotate/crash.ll1
-rw-r--r--llvm/test/Transforms/LoopRotate/dbg-value-duplicates.ll1
-rw-r--r--llvm/test/Transforms/LoopRotate/dbgvalue.ll1
-rw-r--r--llvm/test/Transforms/LoopRotate/indirectbr.ll1
-rw-r--r--llvm/test/Transforms/LoopRotate/loopexitinglatch.ll1
-rw-r--r--llvm/test/Transforms/LoopRotate/multiple-exits.ll1
-rw-r--r--llvm/test/Transforms/LoopRotate/phi-dbgvalue.ll1
-rw-r--r--llvm/test/Transforms/LoopRotate/phi-duplicate.ll1
-rw-r--r--llvm/test/Transforms/LoopRotate/pr22337.ll1
-rw-r--r--llvm/test/Transforms/LoopRotate/pr33701.ll1
-rw-r--r--llvm/test/Transforms/LoopRotate/pr35210.ll51
-rw-r--r--llvm/test/Transforms/LoopRotate/pr37205.ll1
-rw-r--r--llvm/test/Transforms/LoopRotate/preserve-mssa.ll109
-rw-r--r--llvm/test/Transforms/LoopRotate/preserve-scev.ll37
-rw-r--r--llvm/test/Transforms/LoopRotate/vect.omp.persistence.ll1
22 files changed, 215 insertions, 2 deletions
diff --git a/llvm/test/Transforms/LoopRotate/2009-01-25-SingleEntryPhi.ll b/llvm/test/Transforms/LoopRotate/2009-01-25-SingleEntryPhi.ll
index 7036d2d9c3a..a09a2290e0a 100644
--- a/llvm/test/Transforms/LoopRotate/2009-01-25-SingleEntryPhi.ll
+++ b/llvm/test/Transforms/LoopRotate/2009-01-25-SingleEntryPhi.ll
@@ -1,4 +1,5 @@
; RUN: opt < %s -loop-rotate -verify-dom-info -verify-loop-info -disable-output
+; RUN: opt < %s -loop-rotate -verify-dom-info -verify-loop-info -enable-mssa-loop-dependency=true -verify-memoryssa -disable-output
; PR3408
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
target triple = "x86_64-unknown-linux-gnu"
diff --git a/llvm/test/Transforms/LoopRotate/PhiRename-1.ll b/llvm/test/Transforms/LoopRotate/PhiRename-1.ll
index 6d75888d70d..8bece445cf4 100644
--- a/llvm/test/Transforms/LoopRotate/PhiRename-1.ll
+++ b/llvm/test/Transforms/LoopRotate/PhiRename-1.ll
@@ -1,4 +1,5 @@
; RUN: opt < %s -loop-rotate -verify-dom-info -verify-loop-info -S | FileCheck %s
+; RUN: opt < %s -loop-rotate -verify-dom-info -verify-loop-info -enable-mssa-loop-dependency=true -verify-memoryssa -S | FileCheck %s
; CHECK-NOT: [ {{.}}tmp224
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64"
diff --git a/llvm/test/Transforms/LoopRotate/PhiSelfReference-1.ll b/llvm/test/Transforms/LoopRotate/PhiSelfReference-1.ll
index ed494483391..7726c53e55e 100644
--- a/llvm/test/Transforms/LoopRotate/PhiSelfReference-1.ll
+++ b/llvm/test/Transforms/LoopRotate/PhiSelfReference-1.ll
@@ -1,4 +1,5 @@
; RUN: opt < %s -loop-rotate -verify-dom-info -verify-loop-info -disable-output
+; RUN: opt < %s -loop-rotate -verify-dom-info -verify-loop-info -enable-mssa-loop-dependency=true -verify-memoryssa -disable-output
; ModuleID = 'PhiSelfReference-1.bc'
define void @snrm2(i32 %incx) {
diff --git a/llvm/test/Transforms/LoopRotate/alloca.ll b/llvm/test/Transforms/LoopRotate/alloca.ll
index bbcfb39c372..59da33f8802 100644
--- a/llvm/test/Transforms/LoopRotate/alloca.ll
+++ b/llvm/test/Transforms/LoopRotate/alloca.ll
@@ -1,4 +1,5 @@
; RUN: opt < %s -loop-rotate -S | FileCheck %s
+; RUN: opt < %s -loop-rotate -enable-mssa-loop-dependency=true -verify-memoryssa -S | FileCheck %s
; Test alloca in -loop-rotate.
diff --git a/llvm/test/Transforms/LoopRotate/basic.ll b/llvm/test/Transforms/LoopRotate/basic.ll
index 299c18c871e..d01d19f7f12 100644
--- a/llvm/test/Transforms/LoopRotate/basic.ll
+++ b/llvm/test/Transforms/LoopRotate/basic.ll
@@ -1,5 +1,7 @@
; RUN: opt -S -loop-rotate < %s | FileCheck %s
+; RUN: opt -S -loop-rotate -enable-mssa-loop-dependency=true -verify-memoryssa < %s | FileCheck %s
; RUN: opt -S -passes='require<targetir>,require<assumptions>,loop(rotate)' < %s | FileCheck %s
+; RUN: opt -S -passes='require<targetir>,require<assumptions>,loop(rotate)' -enable-mssa-loop-dependency=true -verify-memoryssa < %s | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-apple-darwin10.0.0"
diff --git a/llvm/test/Transforms/LoopRotate/catchret.ll b/llvm/test/Transforms/LoopRotate/catchret.ll
index c035e49d79c..f28af8aed60 100755
--- a/llvm/test/Transforms/LoopRotate/catchret.ll
+++ b/llvm/test/Transforms/LoopRotate/catchret.ll
@@ -1,4 +1,5 @@
; RUN: opt < %s -loop-rotate -S | FileCheck %s
+; RUN: opt < %s -loop-rotate -enable-mssa-loop-dependency=true -verify-memoryssa -S | FileCheck %s
target triple = "x86_64-pc-windows-msvc"
diff --git a/llvm/test/Transforms/LoopRotate/convergent.ll b/llvm/test/Transforms/LoopRotate/convergent.ll
index c8b34fd75f0..37671562142 100644
--- a/llvm/test/Transforms/LoopRotate/convergent.ll
+++ b/llvm/test/Transforms/LoopRotate/convergent.ll
@@ -1,4 +1,5 @@
; RUN: opt -S -loop-rotate < %s | FileCheck %s
+; RUN: opt -S -loop-rotate -enable-mssa-loop-dependency=true -verify-memoryssa < %s | FileCheck %s
@e = global i32 10
diff --git a/llvm/test/Transforms/LoopRotate/crash.ll b/llvm/test/Transforms/LoopRotate/crash.ll
index 5e2b66d6803..2a45e370e18 100644
--- a/llvm/test/Transforms/LoopRotate/crash.ll
+++ b/llvm/test/Transforms/LoopRotate/crash.ll
@@ -1,4 +1,5 @@
; RUN: opt -loop-rotate -disable-output -verify-dom-info -verify-loop-info < %s
+; RUN: opt -loop-rotate -disable-output -verify-dom-info -verify-loop-info -enable-mssa-loop-dependency=true -verify-memoryssa < %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-apple-darwin10.0.0"
diff --git a/llvm/test/Transforms/LoopRotate/dbg-value-duplicates.ll b/llvm/test/Transforms/LoopRotate/dbg-value-duplicates.ll
index 2fea06b5afe..ce7157c571f 100644
--- a/llvm/test/Transforms/LoopRotate/dbg-value-duplicates.ll
+++ b/llvm/test/Transforms/LoopRotate/dbg-value-duplicates.ll
@@ -1,4 +1,5 @@
; RUN: opt -S -loop-rotate < %s | FileCheck %s
+; RUN: opt -S -loop-rotate -enable-mssa-loop-dependency=true -verify-memoryssa < %s | FileCheck %s
source_filename = "/tmp/loop.c"
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.13.0"
diff --git a/llvm/test/Transforms/LoopRotate/dbgvalue.ll b/llvm/test/Transforms/LoopRotate/dbgvalue.ll
index bc0b20d0fea..93e3c4c252c 100644
--- a/llvm/test/Transforms/LoopRotate/dbgvalue.ll
+++ b/llvm/test/Transforms/LoopRotate/dbgvalue.ll
@@ -1,4 +1,5 @@
; RUN: opt -S -loop-rotate < %s | FileCheck %s
+; RUN: opt -S -loop-rotate -enable-mssa-loop-dependency=true -verify-memoryssa < %s | FileCheck %s
declare void @llvm.dbg.declare(metadata, metadata, metadata) nounwind readnone
declare void @llvm.dbg.value(metadata, metadata, metadata) nounwind readnone
diff --git a/llvm/test/Transforms/LoopRotate/indirectbr.ll b/llvm/test/Transforms/LoopRotate/indirectbr.ll
index 8f059d50505..a26ec375953 100644
--- a/llvm/test/Transforms/LoopRotate/indirectbr.ll
+++ b/llvm/test/Transforms/LoopRotate/indirectbr.ll
@@ -1,4 +1,5 @@
; RUN: opt < %s -S -loop-rotate -o - -verify-loop-info -verify-dom-info | FileCheck %s
+; RUN: opt < %s -S -loop-rotate -o - -verify-loop-info -verify-dom-info -enable-mssa-loop-dependency=true -verify-memoryssa | FileCheck %s
; PR5502
define void @z80_do_opcodes() nounwind {
diff --git a/llvm/test/Transforms/LoopRotate/loopexitinglatch.ll b/llvm/test/Transforms/LoopRotate/loopexitinglatch.ll
index c05e512831e..dee29ec958e 100644
--- a/llvm/test/Transforms/LoopRotate/loopexitinglatch.ll
+++ b/llvm/test/Transforms/LoopRotate/loopexitinglatch.ll
@@ -1,5 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -S -loop-rotate < %s -verify-loop-info -verify-dom-info | FileCheck %s
+; RUN: opt -S -loop-rotate < %s -verify-loop-info -verify-dom-info -enable-mssa-loop-dependency=true -verify-memoryssa | FileCheck %s
target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
target triple = "thumbv8m.base-arm-none-eabi"
diff --git a/llvm/test/Transforms/LoopRotate/multiple-exits.ll b/llvm/test/Transforms/LoopRotate/multiple-exits.ll
index f38c855b9c8..c6f153b8ca3 100644
--- a/llvm/test/Transforms/LoopRotate/multiple-exits.ll
+++ b/llvm/test/Transforms/LoopRotate/multiple-exits.ll
@@ -1,4 +1,5 @@
; RUN: opt -S -loop-rotate < %s -verify-loop-info -verify-dom-info | FileCheck %s
+; RUN: opt -S -loop-rotate < %s -verify-loop-info -verify-dom-info -enable-mssa-loop-dependency=true -verify-memoryssa | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.8.0"
diff --git a/llvm/test/Transforms/LoopRotate/phi-dbgvalue.ll b/llvm/test/Transforms/LoopRotate/phi-dbgvalue.ll
index c4b2a6a76f2..1f7e129c26e 100644
--- a/llvm/test/Transforms/LoopRotate/phi-dbgvalue.ll
+++ b/llvm/test/Transforms/LoopRotate/phi-dbgvalue.ll
@@ -1,4 +1,5 @@
; RUN: opt -S -loop-rotate < %s | FileCheck %s
+; RUN: opt -S -loop-rotate -enable-mssa-loop-dependency=true -verify-memoryssa < %s | FileCheck %s
;CHECK-LABEL: func
;CHECK-LABEL: entry
diff --git a/llvm/test/Transforms/LoopRotate/phi-duplicate.ll b/llvm/test/Transforms/LoopRotate/phi-duplicate.ll
index 46ee5961ba5..d7f69d8c9cc 100644
--- a/llvm/test/Transforms/LoopRotate/phi-duplicate.ll
+++ b/llvm/test/Transforms/LoopRotate/phi-duplicate.ll
@@ -1,4 +1,5 @@
; RUN: opt -S -loop-rotate < %s | FileCheck %s
+; RUN: opt -S -loop-rotate -enable-mssa-loop-dependency=true -verify-memoryssa < %s | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-apple-darwin10.0"
diff --git a/llvm/test/Transforms/LoopRotate/pr22337.ll b/llvm/test/Transforms/LoopRotate/pr22337.ll
index 03e804b775e..8195affbcd3 100644
--- a/llvm/test/Transforms/LoopRotate/pr22337.ll
+++ b/llvm/test/Transforms/LoopRotate/pr22337.ll
@@ -1,4 +1,5 @@
; RUN: opt < %s -loop-rotate -S | FileCheck %s
+; RUN: opt < %s -loop-rotate -enable-mssa-loop-dependency=true -verify-memoryssa -S | FileCheck %s
@a = external global i8, align 4
@tmp = global i8* @a
diff --git a/llvm/test/Transforms/LoopRotate/pr33701.ll b/llvm/test/Transforms/LoopRotate/pr33701.ll
index ed162b12098..8535e317676 100644
--- a/llvm/test/Transforms/LoopRotate/pr33701.ll
+++ b/llvm/test/Transforms/LoopRotate/pr33701.ll
@@ -1,4 +1,5 @@
; RUN: opt < %s -loop-rotate -verify-dom-info -verify-loop-info -disable-output
+; RUN: opt < %s -loop-rotate -verify-dom-info -verify-loop-info -enable-mssa-loop-dependency=true -verify-memoryssa -disable-output
define void @func() {
bb0:
diff --git a/llvm/test/Transforms/LoopRotate/pr35210.ll b/llvm/test/Transforms/LoopRotate/pr35210.ll
index 3033ca84732..a705642c435 100644
--- a/llvm/test/Transforms/LoopRotate/pr35210.ll
+++ b/llvm/test/Transforms/LoopRotate/pr35210.ll
@@ -1,4 +1,5 @@
;RUN: opt %s -passes='adce,loop(rotate),adce' -S -debug-pass-manager -debug-only=loop-rotate 2>&1 | FileCheck %s
+;RUN: opt %s -passes='adce,loop(rotate),adce' -S -debug-pass-manager -debug-only=loop-rotate -enable-mssa-loop-dependency=true -verify-memoryssa 2>&1 | FileCheck %s --check-prefix=MSSA
;REQUIRES: asserts
; This test is to make sure we invalidate the post dominator pass after loop rotate simplifies the loop latch.
@@ -32,6 +33,36 @@
; CHECK-NEXT: Running analysis: PostDominatorTreeAnalysis on f
; CHECK-NEXT: Finished llvm::Function pass manager run.
+; MSSA: Starting llvm::Function pass manager run.
+; MSSA-NEXT: Running pass: ADCEPass on f
+; MSSA-NEXT: Running analysis: PostDominatorTreeAnalysis on f
+; MSSA-NEXT: Running pass: FunctionToLoopPassAdaptor{{.*}} on f
+; MSSA-NEXT: Starting llvm::Function pass manager run.
+; MSSA-NEXT: Running pass: LoopSimplifyPass on f
+; MSSA-NEXT: Running analysis: LoopAnalysis on f
+; MSSA-NEXT: Running analysis: DominatorTreeAnalysis on f
+; MSSA-NEXT: Running analysis: AssumptionAnalysis on f
+; MSSA-NEXT: Running pass: LCSSAPass on f
+; MSSA-NEXT: Finished llvm::Function pass manager run.
+; MSSA-NEXT: Running analysis: MemorySSAAnalysis on f
+; MSSA-NEXT: Running analysis: AAManager on f
+; MSSA-NEXT: Running analysis: TargetLibraryAnalysis on f
+; MSSA-NEXT: Running analysis: ScalarEvolutionAnalysis on f
+; MSSA-NEXT: Running analysis: TargetIRAnalysis on f
+; MSSA-NEXT: Running analysis: InnerAnalysisManagerProxy{{.*}} on f
+; MSSA-NEXT: Starting Loop pass manager run.
+; MSSA-NEXT: Running analysis: PassInstrumentationAnalysis on bb
+; MSSA-NEXT: Running pass: LoopRotatePass on Loop at depth 1 containing: %bb<header><exiting>,%bb4<latch>
+; MSSA-NEXT: Folding loop latch bb4 into bb
+; MSSA-NEXT: Invalidating all non-preserved analyses for: bb
+; MSSA-NEXT: Finished Loop pass manager run.
+; MSSA-NEXT: Invalidating all non-preserved analyses for: f
+; MSSA-NEXT: Invalidating analysis: PostDominatorTreeAnalysis on f
+; MSSA-NEXT: Running pass: ADCEPass on f
+; MSSA-NEXT: Running analysis: PostDominatorTreeAnalysis on f
+; MSSA-NEXT: Finished llvm::Function pass manager run.
+
+
; CHECK-LABEL: define i8 @f() {
; CHECK-NEXT : entry:
; CHECK-NEXT : br label %bb
@@ -52,6 +83,26 @@
; CHECK-NEXT :
; CHECK-NEXT : attributes #0 = { noreturn }
+; MSSA-LABEL: define i8 @f() {
+; MSSA-NEXT : entry:
+; MSSA-NEXT : br label %bb
+; MSSA-NEXT :
+; MSSA-NEXT : bb: ; preds = %bb, %entry
+; MSSA-NEXT : %mode.0 = phi i8 [ 0, %entry ], [ %indvar.next, %bb ]
+; MSSA-NEXT : %tmp5 = icmp eq i8 %mode.0, 1
+; MSSA-NEXT : %indvar.next = add i8 %mode.0, 1
+; MSSA-NEXT : br i1 %tmp5, label %bb5, label %bb
+; MSSA-NEXT :
+; MSSA-NEXT : bb5: ; preds = %bb
+; MSSA-NEXT : tail call void @raise_exception() #0
+; MSSA-NEXT : unreachable
+; MSSA-NEXT : }
+; MSSA-NEXT :
+; MSSA-NEXT : ; Function Attrs: noreturn
+; MSSA-NEXT : declare void @raise_exception() #0
+; MSSA-NEXT :
+; MSSA-NEXT : attributes #0 = { noreturn }
+
define i8 @f() {
entry:
br label %bb
diff --git a/llvm/test/Transforms/LoopRotate/pr37205.ll b/llvm/test/Transforms/LoopRotate/pr37205.ll
index 3ba6c04545f..20ad7568189 100644
--- a/llvm/test/Transforms/LoopRotate/pr37205.ll
+++ b/llvm/test/Transforms/LoopRotate/pr37205.ll
@@ -1,5 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -S -indvars -verify -loop-rotate -loop-idiom < %s | FileCheck %s
+; RUN: opt -S -indvars -verify -loop-rotate -loop-idiom -enable-mssa-loop-dependency=true -verify-memoryssa < %s | FileCheck %s
target triple = "x86_64-unknown-linux-gnu"
; Verify that we invalidate SCEV properly.
diff --git a/llvm/test/Transforms/LoopRotate/preserve-mssa.ll b/llvm/test/Transforms/LoopRotate/preserve-mssa.ll
new file mode 100644
index 00000000000..d975f80cd9e
--- /dev/null
+++ b/llvm/test/Transforms/LoopRotate/preserve-mssa.ll
@@ -0,0 +1,109 @@
+; RUN: opt -S -loop-rotate -enable-mssa-loop-dependency=true -verify-memoryssa < %s | FileCheck %s
+
+; CHECK-LABEL: @multiedge(
+define void @multiedge() {
+entry:
+ br label %retry
+
+retry: ; preds = %sw.epilog, %entry
+ br i1 undef, label %cleanup, label %if.end
+
+if.end: ; preds = %retry
+ switch i32 undef, label %sw.epilog [
+ i32 -3, label %cleanup
+ i32 -5, label %cleanup
+ i32 -16, label %cleanup
+ i32 -25, label %cleanup
+ ]
+
+sw.epilog: ; preds = %if.end
+ br label %retry
+
+cleanup: ; preds = %if.end, %if.end, %if.end, %if.end, %retry
+ ret void
+}
+
+; CHECK-LABEL: @read_line(
+define internal fastcc i32 @read_line(i8* nocapture %f) unnamed_addr {
+entry:
+ br label %for.cond
+
+for.cond: ; preds = %if.end, %entry
+ %call = call i8* @prepbuffer(i8* nonnull undef)
+ %call1 = call i8* @fgets(i8* %call, i32 8192, i8* %f)
+ br i1 undef, label %if.then, label %if.end
+
+if.then: ; preds = %for.cond
+ ret i32 undef
+
+if.end: ; preds = %for.cond
+ %call4 = call i64 @strlen(i8* %call)
+ br label %for.cond
+}
+
+declare dso_local i8* @prepbuffer(i8*) local_unnamed_addr
+declare dso_local i8* @fgets(i8*, i32, i8* nocapture) local_unnamed_addr
+declare dso_local i64 @strlen(i8* nocapture) local_unnamed_addr
+
+
+; CHECK-LABEL: @loop3
+define dso_local fastcc void @loop3() unnamed_addr {
+entry:
+ br label %for.cond
+
+for.cond: ; preds = %for.body, %entry
+ br i1 undef, label %for.body, label %for.end81
+
+for.body: ; preds = %for.cond
+ %.idx122.val = load i32, i32* undef, align 8
+ call fastcc void @cont()
+ br label %for.cond
+
+for.end81: ; preds = %for.cond
+ ret void
+}
+
+; CHECK-LABEL: @loop4
+define dso_local fastcc void @loop4() unnamed_addr {
+entry:
+ br label %while.cond
+
+while.cond: ; preds = %while.body, %entry
+ br i1 undef, label %while.end, label %while.body
+
+while.body: ; preds = %while.cond
+ call fastcc void @cont()
+ br label %while.cond
+
+while.end: ; preds = %while.cond
+ call fastcc void @cont()
+ call fastcc void @cont()
+ ret void
+}
+
+; Function Attrs: inlinehint nounwind uwtable
+declare dso_local fastcc void @cont() unnamed_addr
+
+@glob_array = internal unnamed_addr constant [3 x i32] [i32 1, i32 0, i32 2], align 4
+; Test against failure in MemorySSAUpdater, when rotate clones instructions as Value.
+; CHECK-LABEL: @loop5
+define dso_local fastcc void @loop5() unnamed_addr {
+entry:
+ br label %for.body
+
+do.cond: ; preds = %for.body
+ unreachable
+
+for.body: ; preds = %if.end, %entry
+ %indvar = phi i64 [ %indvar.next, %if.end ], [ 0, %entry ]
+ %array = getelementptr inbounds [3 x i32], [3 x i32]* @glob_array, i64 0, i64 %indvar
+ %0 = load i32, i32* %array, align 4
+ br i1 undef, label %do.cond, label %if.end
+
+if.end: ; preds = %for.body
+ store i32 undef, i32* undef, align 4
+ %indvar.next = add nuw nsw i64 %indvar, 1
+ br label %for.body
+}
+
+
diff --git a/llvm/test/Transforms/LoopRotate/preserve-scev.ll b/llvm/test/Transforms/LoopRotate/preserve-scev.ll
index 7bd22326864..2faf8ec487a 100644
--- a/llvm/test/Transforms/LoopRotate/preserve-scev.ll
+++ b/llvm/test/Transforms/LoopRotate/preserve-scev.ll
@@ -1,27 +1,48 @@
; RUN: opt < %s -loop-rotate -loop-reduce -verify-dom-info -verify-loop-info -disable-output
+; RUN: opt < %s -loop-rotate -loop-reduce -enable-mssa-loop-dependency=true -verify-memoryssa -verify-dom-info -verify-loop-info -disable-output
-define fastcc void @foo() nounwind {
+define fastcc void @foo(i32* %A, i64 %i) nounwind {
BB:
br label %BB1
BB1: ; preds = %BB19, %BB
+ %tttmp1 = getelementptr i32, i32* %A, i64 %i
+ %tttmp2 = load i32, i32* %tttmp1
+ %tttmp3 = add i32 %tttmp2, 1
+ store i32 %tttmp3, i32* %tttmp1
br label %BB4
BB2: ; preds = %BB4
%tmp = bitcast i32 undef to i32 ; <i32> [#uses=1]
+ %tttmp7 = getelementptr i32, i32* %A, i64 %i
+ %tttmp8 = load i32, i32* %tttmp7
+ %tttmp9 = add i32 %tttmp8, 3
+ store i32 %tttmp9, i32* %tttmp7
br label %BB4
-BB4: ; preds = %BB3, %BB1
+BB4: ; preds = %BB2, %BB1
%tmp5 = phi i32 [ undef, %BB1 ], [ %tmp, %BB2 ] ; <i32> [#uses=1]
+ %tttmp4 = getelementptr i32, i32* %A, i64 %i
+ %tttmp5 = load i32, i32* %tttmp4
+ %tttmp6 = add i32 %tttmp5, 3
+ store i32 %tttmp6, i32* %tttmp4
br i1 false, label %BB8, label %BB2
BB8: ; preds = %BB6
%tmp7 = bitcast i32 %tmp5 to i32 ; <i32> [#uses=2]
+ %tttmp10 = getelementptr i32, i32* %A, i64 %i
+ %tttmp11 = load i32, i32* %tttmp10
+ %tttmp12 = add i32 %tttmp11, 3
+ store i32 %tttmp12, i32* %tttmp10
br i1 false, label %BB9, label %BB13
BB9: ; preds = %BB12, %BB8
%tmp10 = phi i32 [ %tmp11, %BB12 ], [ %tmp7, %BB8 ] ; <i32> [#uses=2]
%tmp11 = add i32 %tmp10, 1 ; <i32> [#uses=1]
+ %tttmp13 = getelementptr i32, i32* %A, i64 %i
+ %tttmp14 = load i32, i32* %tttmp13
+ %tttmp15 = add i32 %tttmp14, 3
+ store i32 %tttmp15, i32* %tttmp13
br label %BB12
BB12: ; preds = %BB9
@@ -29,16 +50,28 @@ BB12: ; preds = %BB9
BB13: ; preds = %BB15, %BB8
%tmp14 = phi i32 [ %tmp16, %BB15 ], [ %tmp7, %BB8 ] ; <i32> [#uses=1]
+ %tttmp16 = getelementptr i32, i32* %A, i64 %i
+ %tttmp17 = load i32, i32* %tttmp16
+ %tttmp18 = add i32 %tttmp17, 3
+ store i32 %tttmp18, i32* %tttmp16
br label %BB15
BB15: ; preds = %BB13
%tmp16 = add i32 %tmp14, -1 ; <i32> [#uses=1]
+ %tttmp19 = getelementptr i32, i32* %A, i64 %i
+ %tttmp20 = load i32, i32* %tttmp19
+ %tttmp21 = add i32 %tttmp20, 3
+ store i32 %tttmp21, i32* %tttmp19
br i1 false, label %BB13, label %BB18
BB17: ; preds = %BB12
br label %BB19
BB18: ; preds = %BB15
+ %tttmp22 = getelementptr i32, i32* %A, i64 %i
+ %tttmp23 = load i32, i32* %tttmp22
+ %tttmp24 = add i32 %tttmp23, 3
+ store i32 %tttmp24, i32* %tttmp22
br label %BB19
BB19: ; preds = %BB18, %BB17
diff --git a/llvm/test/Transforms/LoopRotate/vect.omp.persistence.ll b/llvm/test/Transforms/LoopRotate/vect.omp.persistence.ll
index 6a1865499d3..c4c987e7b2b 100644
--- a/llvm/test/Transforms/LoopRotate/vect.omp.persistence.ll
+++ b/llvm/test/Transforms/LoopRotate/vect.omp.persistence.ll
@@ -1,4 +1,5 @@
; RUN: opt < %s -loop-rotate -S | FileCheck %s
+; RUN: opt < %s -loop-rotate -enable-mssa-loop-dependency=true -verify-memoryssa -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
OpenPOWER on IntegriCloud