<div dir="ltr"><div><div>Quick update - the bug existed before I refactored that chunk in InstSimplify with:<br><a href="https://reviews.llvm.org/rL275911">https://reviews.llvm.org/rL275911</a><br></div><div><br></div>In fact, as discussed in <a href="https://reviews.llvm.org/D22537">https://reviews.llvm.org/D22537</a> - 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. :)<br><br>define <2 x i32> @select_icmp_vec(<2 x i32> %x) {<br>  %cmp = icmp slt <2 x i32> %x, zeroinitializer<br>  %xor = xor <2 x i32> %x, <i32 2147483648, i32 2147483648><br>  %x.xor = select <2 x i1> %cmp, <2 x i32> %x, <2 x i32> %xor<br>  ret <2 x i32> %x.xor<br>}<br><br>$ ./opt -instcombine selvec.ll -S<br>Assertion failed: (BitWidth == RHS.BitWidth && "Comparison requires equal bit widths"), function operator==, file /Users/spatel/myllvm/llvm/include/llvm/ADT/APInt.h, line 983.<br><br></div>I should have a patch up for review shortly.<br><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jul 20, 2016 at 2:03 PM, Sanjay Patel <span dir="ltr"><<a href="mailto:spatel@rotateright.com" target="_blank">spatel@rotateright.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Thanks for notifying me. Yes, this was a recent change. Taking a look now.<br></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jul 20, 2016 at 1:49 PM, Michael Kuperstein <span dir="ltr"><<a href="mailto:mkuper@google.com" target="_blank">mkuper@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">+Sanjay, who touched this last. :-)</div><div class="gmail_extra"><br><div class="gmail_quote"><div><div>On Wed, Jul 20, 2016 at 12:44 PM, Ismail Badawi (ibadawi) via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div>



<div style="word-wrap:break-word">
Hi folks,<br>
<br>
I'm hitting the below assertion failure when compiling this small piece of C code (repro.c, attached).<br>
<br>
My command line is:<br>
<br>
<font face="Courier">bin/clang --target=aarch64-linux-gnu -c -O2 repro.c<br>
</font><br>
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):<br>
<br>
<font face="Courier">bin/opt -instcombine -licm -simplifycfg -instcombine -loop-rotate -loop-vectorize -instcombine < repro.ll<br>
</font><br>
The failure is:<br>
<br>
<font face="Courier">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.<br>
...snip...<br>
#8 0x00000000013a8553 llvm::APInt::operator==(llvm::APInt const&) const /scratch/1/ismail/llvm-upstream/include/llvm/ADT/APInt.h:984:0<br>
#9 0x0000000001f875b0 simplifySelectBitTest(llvm::Value*, llvm::Value*, llvm::Value*, llvm::APInt const*, bool) /scratch/1/ismail/llvm-upstream/lib/Analysis/InstructionSimplify.cpp:3388:0<br>
#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<br>
#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<br>
#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<br>
...snip...<br>
Stack dump:<br>
0.  Program arguments: debugbuild/bin/opt -instcombine -licm -simplifycfg -instcombine -loop-rotate -loop-vectorize -instcombine<br>
1.  Running pass 'Function Pass Manager' on module '<stdin>'.<br>
2.  Running pass 'Combine redundant instructions' on function '@strsave'</font><br>
<br>
---<br>
<br>
Looking at the code, the issue is with this line:<br>
<br>
<font face="Courier">  if (TrueVal == X && match(FalseVal, m_And(m_Specific(X), m_APInt(C))) &&<br>
        *Y == ~*C)</font><br>
<br>
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 ==.<br>
<br>
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.<br>
<br>
Any help from someone with more context would be appreciated.<br>
<br>
Thanks,<br>
Ismail
<div><br>
</div>
<div></div>
</div>

<br></div></div>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>