[llvm-bugs] [Bug 43820] New: llvm.bitreverse.i1000 asserts "Invalid use of small shift amount with oversized value!""

via llvm-bugs llvm-bugs at lists.llvm.org
Sat Oct 26 15:07:20 PDT 2019


https://bugs.llvm.org/show_bug.cgi?id=43820

            Bug ID: 43820
           Summary: llvm.bitreverse.i1000 asserts "Invalid use of small
                    shift amount with oversized value!""
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: Backend: X86
          Assignee: unassignedbugs at nondot.org
          Reporter: m.gehre at gmx.de
                CC: craig.topper at gmail.com, llvm-bugs at lists.llvm.org,
                    llvm-dev at redking.me.uk, spatel+llvm at rotateright.com

The LLVM IR

target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

define i1000 @square(i1000 %A) {
  %Z = call i1000 @llvm.bitreverse.i1000(i1000 %A)
  ret i1000 %Z
}

declare i1000 @llvm.bitreverse.i1000(i1000)

causes the assertion
llc: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:5145: llvm::SDValue
llvm::SelectionDAG::getNode(unsigned int, const llvm::SDLoc &, llvm::EVT,
llvm::SDValue, llvm::SDValue, const llvm::SDNodeFlags): Assertion
`N2.getValueSizeInBits() >= Log2_32_Ceil(N1.getValueSizeInBits()) && "Invalid
use of small shift amount with oversized value!"' failed.
Stack dump:
0.      Program arguments: ./build/bin/llc test1000.ll 
1.      Running pass 'Function Pass Manager' on module
'/home/gehre/test1000.ll'.
2.      Running pass 'X86 DAG->DAG Instruction Selection' on function '@square'
 #0 0x000000000205f714 llvm::sys::PrintStackTrace(llvm::raw_ostream&)
llvm/lib/Support/Unix/Signals.inc:532:13
 #1 0x000000000205f714 PrintStackTraceSignalHandler(void*)
/llvm/lib/Support/Unix/Signals.inc:592:0
 #2 0x000000000205d41e llvm::sys::RunSignalHandlers()
llvm/lib/Support/Signals.cpp:69:18
 #3 0x000000000205fb28 SignalHandler(int)
llvm/lib/Support/Unix/Signals.inc:384:1
 #4 0x00007ffff7bc8890 __restore_rt
(/lib/x86_64-linux-gnu/libpthread.so.0+0x12890)
 #5 0x00007ffff689be97 raise
/build/glibc-OTsEL5/glibc-2.27/signal/../sysdeps/unix/sysv/linux/raise.c:51:0
 #6 0x00007ffff689d801 abort /build/glibc-OTsEL5/glibc-2.27/stdlib/abort.c:81:0
 #7 0x00007ffff688d39a __assert_fail_base
/build/glibc-OTsEL5/glibc-2.27/assert/assert.c:89:0
 #8 0x00007ffff688d412 (/lib/x86_64-linux-gnu/libc.so.6+0x30412)
 #9 0x0000000001e881e5 llvm::SelectionDAG::getNode(unsigned int, llvm::SDLoc
const&, llvm::EVT, llvm::SDValue, llvm::SDValue, llvm::SDNodeFlags)
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:0:0
#10 0x0000000001f33fab
llvm::DAGTypeLegalizer::PromoteIntRes_BITREVERSE(llvm::SDNode*)
llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp:399:14
#11 0x0000000001f32cb7
llvm::DAGTypeLegalizer::PromoteIntegerResult(llvm::SDNode*, unsigned int)
llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp:59:32

when running it through llc.

>From looking at it, getShiftAmountTyForConstant tries to avoid the assertion by
increasing the type of the shift amount based on how big the actual shift
amount is, but the assert in SelectionDAG checks if the type is big enough to
hold all possible shift amounts.
In the example above, the actual shift amount is 24 (promoting i1000 to i1024),
so i8 is enough to hold 24. Still SelectionDAG asserts because i8 cannot hold
all possible shift values of an i1000.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20191026/1a1826b5/attachment.html>


More information about the llvm-bugs mailing list