[llvm] r286038 - [LoopStrengthReduce] Don't use a DenseSet<int64_t> when we might add any valid int64_t to the set.

Justin Lebar via llvm-commits llvm-commits at lists.llvm.org
Sat Nov 5 09:47:26 PDT 2016


Author: jlebar
Date: Sat Nov  5 11:47:25 2016
New Revision: 286038

URL: http://llvm.org/viewvc/llvm-project?rev=286038&view=rev
Log:
[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

Added:
    llvm/trunk/test/CodeGen/X86/loop-strength-reduce-crash.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp?rev=286038&r1=286037&r2=286038&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp Sat Nov  5 11:47:25 2016
@@ -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;

Added: llvm/trunk/test/CodeGen/X86/loop-strength-reduce-crash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/loop-strength-reduce-crash.ll?rev=286038&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/loop-strength-reduce-crash.ll (added)
+++ llvm/trunk/test/CodeGen/X86/loop-strength-reduce-crash.ll Sat Nov  5 11:47:25 2016
@@ -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
+}




More information about the llvm-commits mailing list