summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustin Lebar <jlebar@google.com>2016-11-05 16:47:25 +0000
committerJustin Lebar <jlebar@google.com>2016-11-05 16:47:25 +0000
commit54b0be048e3e449aadf7206efa991ee3419188ac (patch)
tree97b913f7630436a86dfe534c5982f375993becd3
parent1af0fc1103591c35cca8048dae9776a6c329ecd1 (diff)
downloadbcm5719-llvm-54b0be048e3e449aadf7206efa991ee3419188ac.tar.gz
bcm5719-llvm-54b0be048e3e449aadf7206efa991ee3419188ac.zip
[LoopStrengthReduce] Don't use a DenseSet<int64_t> when we might add any valid int64_t to the set.
Summary: SmallSetVector uses DenseSet, but that means we need to reserve some values for the empty and tombstone keys. It seems to me we should have a general way to let us store full-range ints inside of DenseSets, and furthermore that we probably shouldn't silently let you add ints into DenseSets without explicitly promising that they're in range. But that's a battle for another day; for now, just fix this code, since we currently do something Very Bad when compiling ffmpeg. Fixes PR30914. Reviewers: jeremyhu Subscribers: llvm-commits, mzolotukhin Differential Revision: https://reviews.llvm.org/D26323 llvm-svn: 286038
-rw-r--r--llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp7
-rw-r--r--llvm/test/CodeGen/X86/loop-strength-reduce-crash.ll24
2 files changed, 30 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index 9354d40b98c..e28c374549c 100644
--- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -1646,7 +1646,12 @@ class LSRInstance {
Instruction *IVIncInsertPos;
/// Interesting factors between use strides.
- SmallSetVector<int64_t, 8> Factors;
+ ///
+ /// We explicitly use a SetVector which contains a SmallSet, instead of the
+ /// default, a SmallDenseSet, because we need to use the full range of
+ /// int64_ts, and there's currently no good way of doing that with
+ /// SmallDenseSet.
+ SetVector<int64_t, SmallVector<int64_t, 8>, SmallSet<int64_t, 8>> Factors;
/// Interesting use types, to facilitate truncation reuse.
SmallSetVector<Type *, 4> Types;
diff --git a/llvm/test/CodeGen/X86/loop-strength-reduce-crash.ll b/llvm/test/CodeGen/X86/loop-strength-reduce-crash.ll
new file mode 100644
index 00000000000..1117f978500
--- /dev/null
+++ b/llvm/test/CodeGen/X86/loop-strength-reduce-crash.ll
@@ -0,0 +1,24 @@
+; RUN: llc < %s -o /dev/null
+
+; Check that this doesn't crash (by virtue of using INT64_MAX as a constant in
+; the loop).
+
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.12.0"
+
+define void @foo() {
+entry:
+ br label %for
+
+for:
+ %0 = phi i64 [ %add, %for ], [ undef, %entry ]
+ %next = phi i32 [ %inc, %for ], [ undef, %entry ]
+ store i32 %next, i32* undef, align 4
+ %add = add i64 %0, 9223372036854775807
+ %inc = add nsw i32 %next, 1
+ br i1 undef, label %exit, label %for
+
+exit:
+ store i64 %add, i64* undef
+ ret void
+}
OpenPOWER on IntegriCloud