Ismail Badawi (ibadawi) via llvm-dev
2016-Jul-20 19:44 UTC
[llvm-dev] Hitting assertion failure related to vectorization + instcombine
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>
Michael Kuperstein via llvm-dev
2016-Jul-20 19:49 UTC
[llvm-dev] Hitting assertion failure related to vectorization + instcombine
+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/695a3296/attachment.html>
Sanjay Patel via llvm-dev
2016-Jul-20 20:03 UTC
[llvm-dev] Hitting assertion failure related to vectorization + instcombine
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/5f3d4fcd/attachment.html>