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

Sanjay Patel via llvm-dev llvm-dev at lists.llvm.org
Wed Jul 20 14:59:27 PDT 2016


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>
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>
> 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> 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
>>> 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/20160720/b627c1e3/attachment.html>


More information about the llvm-dev mailing list