[llvm-dev] Hitting assertion failure related to vectorization + instcombine

David Majnemer via llvm-dev llvm-dev at lists.llvm.org
Wed Jul 27 17:19:16 PDT 2016


LGTM

On Wednesday, July 27, 2016, Hans Wennborg <hans at chromium.org> wrote:

> David, Sanjay: ping?
>
> On Mon, Jul 25, 2016 at 11:07 AM, Hans Wennborg <hans at chromium.org
> <javascript:;>> wrote:
> > Sure. David, what do you think about merging this to 3.9?
> >
> > Sanjay: are you saying I'd just apply that diff to
> > InstructionSimplify.cpp, not InstCombineSelect.cpp?
> >
> > On Fri, Jul 22, 2016 at 7:08 AM, Sanjay Patel <spatel at rotateright.com
> <javascript:;>> wrote:
> >> Hi Hans -
> >>
> >> Yes, I think this is a good patch for 3.9 (cc'ing David Majnemer as code
> >> owner). The functional change was r276209. I made an NFC refactoring in
> >> InstSimplify at r275911 that isn't in the branch, so I don't think the
> patch
> >> will apply as-is. For safety, you could apply the one-line fix without
> >> pulling the refactoring into the branch with this diff:
> >>
> >> -    unsigned BitWidth = Q.DL.getTypeSizeInBits(TrueVal->getType());
> >> +    unsigned BitWidth =
> >> +        Q.DL.getTypeSizeInBits(TrueVal->getType()->getScalarType());
> >>
> >>
> >>
> >>
> >> On Fri, Jul 22, 2016 at 7:45 AM, Hans Wennborg <hans at chromium.org
> <javascript:;>> wrote:
> >>>
> >>> Sanjay: let me know if this is something that will apply to 3.9.
> >>>
> >>> Thanks,
> >>> Hans
> >>>
> >>> On Wed, Jul 20, 2016 at 5:59 PM, Sanjay Patel via llvm-dev
> >>> <llvm-dev at lists.llvm.org <javascript:;>> wrote:
> >>> > Quick update - the bug existed before I refactored that chunk in
> >>> > InstSimplify with:
> >>> > https://reviews.llvm.org/rL275911
> >>> >
> >>> > In fact, as discussed in https://reviews.llvm.org/D22537 - because
> we
> >>> > have a
> >>> > big pile of lazily copied code, the bug has an identical twin that
> >>> > exists in
> >>> > InstCombine. I swear I didn't touch that code...yet. :)
> >>> >
> >>> > define <2 x i32> @select_icmp_vec(<2 x i32> %x) {
> >>> >   %cmp = icmp slt <2 x i32> %x, zeroinitializer
> >>> >   %xor = xor <2 x i32> %x, <i32 2147483648, i32 2147483648>
> >>> >   %x.xor = select <2 x i1> %cmp, <2 x i32> %x, <2 x i32> %xor
> >>> >   ret <2 x i32> %x.xor
> >>> > }
> >>> >
> >>> > $ ./opt -instcombine selvec.ll -S
> >>> > Assertion failed: (BitWidth == RHS.BitWidth && "Comparison requires
> >>> > equal
> >>> > bit widths"), function operator==, file
> >>> > /Users/spatel/myllvm/llvm/include/llvm/ADT/APInt.h, line 983.
> >>> >
> >>> > I should have a patch up for review shortly.
> >>> >
> >>> >
> >>> > On Wed, Jul 20, 2016 at 2:03 PM, Sanjay Patel <
> spatel at rotateright.com <javascript:;>>
> >>> > wrote:
> >>> >>
> >>> >> Thanks for notifying me. Yes, this was a recent change. Taking a
> look
> >>> >> now.
> >>> >>
> >>> >> On Wed, Jul 20, 2016 at 1:49 PM, Michael Kuperstein <
> mkuper at google.com <javascript:;>>
> >>> >> wrote:
> >>> >>>
> >>> >>> +Sanjay, who touched this last. :-)
> >>> >>>
> >>> >>> On Wed, Jul 20, 2016 at 12:44 PM, Ismail Badawi (ibadawi) via
> llvm-dev
> >>> >>> <llvm-dev at lists.llvm.org <javascript:;>> wrote:
> >>> >>>>
> >>> >>>> Hi folks,
> >>> >>>>
> >>> >>>> I'm hitting the below assertion failure when compiling this small
> >>> >>>> piece
> >>> >>>> of C code (repro.c, attached).
> >>> >>>>
> >>> >>>> My command line is:
> >>> >>>>
> >>> >>>> bin/clang --target=aarch64-linux-gnu -c -O2 repro.c
> >>> >>>>
> >>> >>>> clang is built from top of trunk as of this morning. It only
> happens
> >>> >>>> at
> >>> >>>> -O2, and it doesn't happen with the default target (x86_64). I
> tried
> >>> >>>> to
> >>> >>>> reproduce using just 'llc -O2' but didn't manage -- but I do have
> >>> >>>> this
> >>> >>>> reduced opt command line (repro.ll also attached, just generated
> from
> >>> >>>> repro.c at -O0):
> >>> >>>>
> >>> >>>> bin/opt -instcombine -licm -simplifycfg -instcombine -loop-rotate
> >>> >>>> -loop-vectorize -instcombine < repro.ll
> >>> >>>>
> >>> >>>> The failure is:
> >>> >>>>
> >>> >>>> opt: /scratch/1/ismail/llvm-upstream/include/llvm/ADT/APInt.h:983:
> >>> >>>> bool
> >>> >>>> llvm::APInt::operator==(const llvm::APInt&) const: Assertion
> >>> >>>> `BitWidth ==
> >>> >>>> RHS.BitWidth && "Comparison requires equal bit widths"' failed.
> >>> >>>> ...snip...
> >>> >>>> #8 0x00000000013a8553 llvm::APInt::operator==(llvm::APInt const&)
> >>> >>>> const
> >>> >>>> /scratch/1/ismail/llvm-upstream/include/llvm/ADT/APInt.h:984:0
> >>> >>>> #9 0x0000000001f875b0 simplifySelectBitTest(llvm::Value*,
> >>> >>>> llvm::Value*,
> >>> >>>> llvm::Value*, llvm::APInt const*, bool)
> >>> >>>>
> >>> >>>>
> /scratch/1/ismail/llvm-upstream/lib/Analysis/InstructionSimplify.cpp:3388:0
> >>> >>>> #10 0x0000000001f87ad5 simplifySelectWithICmpCond(llvm::Value*,
> >>> >>>> llvm::Value*, llvm::Value*, (anonymous namespace)::Query const&,
> >>> >>>> unsigned
> >>> >>>> int)
> >>> >>>>
> >>> >>>>
> /scratch/1/ismail/llvm-upstream/lib/Analysis/InstructionSimplify.cpp:3434:0
> >>> >>>> #11 0x0000000001f87f6a SimplifySelectInst(llvm::Value*,
> llvm::Value*,
> >>> >>>> llvm::Value*, (anonymous namespace)::Query const&, unsigned int)
> >>> >>>>
> >>> >>>>
> /scratch/1/ismail/llvm-upstream/lib/Analysis/InstructionSimplify.cpp:3515:0
> >>> >>>> #12 0x0000000001f87fe3 llvm::SimplifySelectInst(llvm::Value*,
> >>> >>>> llvm::Value*, llvm::Value*, llvm::DataLayout const&,
> >>> >>>> llvm::TargetLibraryInfo
> >>> >>>> const*, llvm::DominatorTree const*, llvm::AssumptionCache*,
> >>> >>>> llvm::Instruction const*)
> >>> >>>>
> >>> >>>>
> /scratch/1/ismail/llvm-upstream/lib/Analysis/InstructionSimplify.cpp:3528:0
> >>> >>>> ...snip...
> >>> >>>> Stack dump:
> >>> >>>> 0.  Program arguments: debugbuild/bin/opt -instcombine -licm
> >>> >>>> -simplifycfg -instcombine -loop-rotate -loop-vectorize
> -instcombine
> >>> >>>> 1.  Running pass 'Function Pass Manager' on module '<stdin>'.
> >>> >>>> 2.  Running pass 'Combine redundant instructions' on function
> >>> >>>> '@strsave'
> >>> >>>>
> >>> >>>> ---
> >>> >>>>
> >>> >>>> Looking at the code, the issue is with this line:
> >>> >>>>
> >>> >>>>   if (TrueVal == X && match(FalseVal, m_And(m_Specific(X),
> >>> >>>> m_APInt(C)))
> >>> >>>> &&
> >>> >>>>         *Y == ~*C)
> >>> >>>>
> >>> >>>> In this case Y is a 128-bit APInt, and so is the value that C is
> >>> >>>> extracted from, but the m_APInt matcher has code that calls
> >>> >>>> getSplatValue()
> >>> >>>> if the matched expression has vector type. So C ends up as an
> 8-bit
> >>> >>>> value,
> >>> >>>> triggering the assertion failure on the call to ==.
> >>> >>>>
> >>> >>>> The issue is clear but I'm not sure what the correct fix should
> be --
> >>> >>>> whether this code is just not meant to work with vector types, or
> >>> >>>> whether
> >>> >>>> the call to getSplatValue() doesn't belong in the matcher, or
> whether
> >>> >>>> there
> >>> >>>> should be a corresponding call to getSplatValue() on the caller
> side,
> >>> >>>> or
> >>> >>>> something else.
> >>> >>>>
> >>> >>>> Any help from someone with more context would be appreciated.
> >>> >>>>
> >>> >>>> Thanks,
> >>> >>>> Ismail
> >>> >>>>
> >>> >>>>
> >>> >>>> _______________________________________________
> >>> >>>> LLVM Developers mailing list
> >>> >>>> llvm-dev at lists.llvm.org <javascript:;>
> >>> >>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> >>> >>>>
> >>> >>>
> >>> >>
> >>> >
> >>> >
> >>> > _______________________________________________
> >>> > LLVM Developers mailing list
> >>> > llvm-dev at lists.llvm.org <javascript:;>
> >>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> >>> >
> >>
> >>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160727/e1b151b6/attachment.html>


More information about the llvm-dev mailing list