summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/LoopStrengthReduce/X86
diff options
context:
space:
mode:
authorWei Mi <wmi@google.com>2017-05-18 17:21:22 +0000
committerWei Mi <wmi@google.com>2017-05-18 17:21:22 +0000
commit8848c1e3c7e94eac2b207fa4418419d8d6765e20 (patch)
treea9d18013ad759854f533f81d7e4a319a3678962f /llvm/test/Transforms/LoopStrengthReduce/X86
parent8b61764cbba4136e038fd94e035f1e965c82ba52 (diff)
downloadbcm5719-llvm-8848c1e3c7e94eac2b207fa4418419d8d6765e20.tar.gz
bcm5719-llvm-8848c1e3c7e94eac2b207fa4418419d8d6765e20.zip
[LSR] Call canonicalize after we generate a new Formula in GenerateTruncates. Fix PR33077.
The testcase in PR33077 generates a LSR Use Formula with two SCEVAddRecExprs for the same loop. Such uncommon formula will become non-canonical after GenerateTruncates adds sign extension to the ScaledReg of the Formula, and it will break the assertion that every Formula to be inserted is canonical. The fix is to call canonicalize for the raw Formula generated by GenerateTruncates before inserting it. llvm-svn: 303361
Diffstat (limited to 'llvm/test/Transforms/LoopStrengthReduce/X86')
-rw-r--r--llvm/test/Transforms/LoopStrengthReduce/X86/canonical-2.ll36
1 files changed, 36 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LoopStrengthReduce/X86/canonical-2.ll b/llvm/test/Transforms/LoopStrengthReduce/X86/canonical-2.ll
new file mode 100644
index 00000000000..69bae3a5115
--- /dev/null
+++ b/llvm/test/Transforms/LoopStrengthReduce/X86/canonical-2.ll
@@ -0,0 +1,36 @@
+; REQUIRES: asserts
+; RUN: opt -mtriple=x86_64-unknown-linux-gnu -loop-reduce -S < %s
+; PR33077. Check the LSR Use formula to be inserted is already canonicalized and
+; will not trigger assertion.
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+; Function Attrs: uwtable
+define void @foo() {
+cHeapLvb.exit:
+ br label %not_zero48.us
+
+not_zero48.us: ; preds = %not_zero48.us, %cHeapLvb.exit
+ %indvars.iv.us = phi i64 [ %indvars.iv.next.us.7, %not_zero48.us ], [ undef, %cHeapLvb.exit ]
+ %0 = phi i32 [ %13, %not_zero48.us ], [ undef, %cHeapLvb.exit ]
+ %indvars.iv.next.us = add nuw nsw i64 %indvars.iv.us, 1
+ %1 = add i32 %0, 2
+ %2 = getelementptr inbounds i32, i32 addrspace(1)* undef, i64 %indvars.iv.next.us
+ %3 = load i32, i32 addrspace(1)* %2, align 4
+ %4 = add i32 %0, 3
+ %5 = load i32, i32 addrspace(1)* undef, align 4
+ %6 = sub i32 undef, %5
+ %factor.us.2 = shl i32 %6, 1
+ %7 = add i32 %factor.us.2, %1
+ %8 = load i32, i32 addrspace(1)* undef, align 4
+ %9 = sub i32 %7, %8
+ %factor.us.3 = shl i32 %9, 1
+ %10 = add i32 %factor.us.3, %4
+ %11 = load i32, i32 addrspace(1)* undef, align 4
+ %12 = sub i32 %10, %11
+ %factor.us.4 = shl i32 %12, 1
+ %13 = add i32 %0, 8
+ %indvars.iv.next.us.7 = add nsw i64 %indvars.iv.us, 8
+ br label %not_zero48.us
+}
+
OpenPOWER on IntegriCloud