From: Justin Lebar Date: Sat, 5 Nov 2016 16:47:25 +0000 (+0000) Subject: [LoopStrengthReduce] Don't use a DenseSet when we might add any valid int64_... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=de1867fd4388fdc6a8b8aa0a9d3eec6a08c9c4de;p=llvm [LoopStrengthReduce] Don't use a DenseSet 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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286038 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp index 9354d40b98c..e28c374549c 100644 --- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -1646,7 +1646,12 @@ class LSRInstance { Instruction *IVIncInsertPos; /// Interesting factors between use strides. - SmallSetVector 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, SmallSet> Factors; /// Interesting use types, to facilitate truncation reuse. SmallSetVector Types; diff --git a/test/CodeGen/X86/loop-strength-reduce-crash.ll b/test/CodeGen/X86/loop-strength-reduce-crash.ll new file mode 100644 index 00000000000..1117f978500 --- /dev/null +++ b/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 +}