[PATCH] D26323: [LoopStrengthReduce] Don't use a DenseSet<int64_t> when we might add any valid int64_t to the set.

Finkel, Hal J. via llvm-commits llvm-commits at lists.llvm.org
Sat Nov 5 11:00:25 PDT 2016


Sent from my Verizon Wireless 4G LTE DROID

On Nov 5, 2016 12:51 PM, Justin Lebar <jlebar at google.com<mailto:jlebar at google.com>> wrote:
>
> > We should probably also have some template specialization in the DenseMap implementation that causes us to have an assert that will catch this situation more-directly (i.e. with an easy-to-understand assertion message).
>
> It currently says
>
> > (!KeyInfoT::isEqual(Val, EmptyKey) && !KeyInfoT::isEqual(Val, TombstoneKey) && "Empty/Tombstone value shouldn't be inserted into map!"
>
> I find this pretty clear, but maybe I've been corrupted by working
> with this stuff too much.  What would you like it to say instead?

Indeed; you're right. That seems fine.

>
> I looked through the results of
>
>   cat <(git grep -l 'Dense\(Map\|Set\)<u\?int') <(git grep -l
> 'SetVector<u\?int')
>
> in the monorepo (i.e., across all llvm projects).  I only found three
> places that looked suspicious to me:
>
> * InstProfWriter's ProfilingData map, where the keys are uint64 hash
> codes generated elsewhere (so I presume have the full range)
>
> https://github.com/llvm-project/llvm-project/blob/master/llvm/include/llvm/ProfileData/InstrProfWriter.h#L32
>
> * TableGen's IntInit intern table, which seems like it would be happy
> to intern INT64_MAX if anyone wrote that in a tablegen file.
>
> https://github.com/llvm-project/llvm-project/blob/master/llvm/lib/TableGen/Record.cpp#L399
>
> * Cross-DSO CFI seems to assume that type-ids are never UINT64_MAX or
> UINT64_MAX - 1.  I don't know if this is a safe assumption to make in
> the face of inputs that llvm didn't itself generate.
>
> None of these seems critical, or even likely to be hit in real life.
> OTOH I'm not familiar with most of the code I audited, so it's
> possible my suspicions weren't raised in places where they should have
> been.  It's also possible my grep query wasn't strong enough.  So
> maybe someone else should check this too.

I suppose we'd really need to check typedefs to be thorough, but that's harder than grepping I suppose ;)

-Hal

>
> -Justin
>
> On Sat, Nov 5, 2016 at 9:57 AM, Justin Lebar <jlebar at google.com<mailto:jlebar at google.com>> wrote:
> > This revision was automatically updated to reflect the committed changes.
> > Closed by commit rL286038: [LoopStrengthReduce] Don't use a DenseSet<int64_t> when we might add any valid… (authored by jlebar).
> >
> > Changed prior to commit:
> >   https://reviews.llvm.org/D26323?vs=76965&id=76969#toc
> >
> > Repository:
> >   rL LLVM
> >
> > https://reviews.llvm.org/D26323
> >
> > Files:
> >   llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp<http://LoopStrengthReduce.cpp>
> >   llvm/trunk/test/CodeGen/X86/loop-strength-reduce-crash.ll<http://loop-strength-reduce-crash.ll>
> >
> >
> > Index: llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp<http://LoopStrengthReduce.cpp>
> > ===================================================================
> > --- llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp<http://LoopStrengthReduce.cpp>
> > +++ llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp<http://LoopStrengthReduce.cpp>
> > @@ -1646,7 +1646,12 @@
> >    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;
> > Index: llvm/trunk/test/CodeGen/X86/loop-strength-reduce-crash.ll<http://loop-strength-reduce-crash.ll>
> > ===================================================================
> > --- llvm/trunk/test/CodeGen/X86/loop-strength-reduce-crash.ll<http://loop-strength-reduce-crash.ll>
> > +++ llvm/trunk/test/CodeGen/X86/loop-strength-reduce-crash.ll<http://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
> > +}
> >
> >
>
> On Sat, Nov 5, 2016 at 9:57 AM, Justin Lebar <jlebar at google.com<mailto:jlebar at google.com>> wrote:
> > This revision was automatically updated to reflect the committed changes.
> > Closed by commit rL286038: [LoopStrengthReduce] Don't use a DenseSet<int64_t> when we might add any valid… (authored by jlebar).
> >
> > Changed prior to commit:
> >   https://reviews.llvm.org/D26323?vs=76965&id=76969#toc
> >
> > Repository:
> >   rL LLVM
> >
> > https://reviews.llvm.org/D26323
> >
> > Files:
> >   llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp<http://LoopStrengthReduce.cpp>
> >   llvm/trunk/test/CodeGen/X86/loop-strength-reduce-crash.ll<http://loop-strength-reduce-crash.ll>
> >
> >
> > Index: llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp<http://LoopStrengthReduce.cpp>
> > ===================================================================
> > --- llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp<http://LoopStrengthReduce.cpp>
> > +++ llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp<http://LoopStrengthReduce.cpp>
> > @@ -1646,7 +1646,12 @@
> >    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;
> > Index: llvm/trunk/test/CodeGen/X86/loop-strength-reduce-crash.ll<http://loop-strength-reduce-crash.ll>
> > ===================================================================
> > --- llvm/trunk/test/CodeGen/X86/loop-strength-reduce-crash.ll<http://loop-strength-reduce-crash.ll>
> > +++ llvm/trunk/test/CodeGen/X86/loop-strength-reduce-crash.ll<http://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
> > +}
> >
> >
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161105/1c64bd9c/attachment.html>


More information about the llvm-commits mailing list