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

Ismail Badawi (ibadawi) via llvm-dev llvm-dev at lists.llvm.org
Wed Jul 20 12:44:09 PDT 2016


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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160720/adc7dc19/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: repro.c
Type: application/octet-stream
Size: 275 bytes
Desc: repro.c
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160720/adc7dc19/attachment.obj>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160720/adc7dc19/attachment.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: repro.ll
Type: application/octet-stream
Size: 3529 bytes
Desc: repro.ll
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160720/adc7dc19/attachment-0001.obj>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160720/adc7dc19/attachment-0001.htm>


More information about the llvm-dev mailing list