[llvm-bugs] [Bug 42397] New: SCEVExpander wrongly adds nsw to shl instruction
via llvm-bugs
llvm-bugs at lists.llvm.org
Tue Jun 25 14:51:00 PDT 2019
https://bugs.llvm.org/show_bug.cgi?id=42397
Bug ID: 42397
Summary: SCEVExpander wrongly adds nsw to shl instruction
Product: libraries
Version: trunk
Hardware: PC
OS: Linux
Status: NEW
Severity: normal
Priority: P
Component: Global Analyses
Assignee: unassignedbugs at nondot.org
Reporter: pankaj.chawla at intel.com
CC: llvm-bugs at lists.llvm.org
This SCEVExpander bug was exposed by a recent patch to add nuw/nsw flags when
generating code for SCEVMulExpr.
The test case IR looks like this-
%1 = load i16, i16* %arrayidx
%2 = and i16 %1, -32768
The SCEV form of %2 is this-
(-32768 * (%1 /u -32768))<nuw><nsw>
It has both nsw/nuw flags. The signed range of the second operand of
SCEVMulExpr (%1 /u -32768) is [0, 2). So it can be either 0 or 1.
But SCEVExpander uses shl to generate the multiply. The generated IR looks
something like this-
%7 = lshr i16 %gepload, 15
%8 = shl nuw nsw i16 %7, 15
%8 is later simplified to zero because according to langref it produces poison
otherwise -
If the nuw keyword is present, then the shift produces a poison value if it
shifts out any non-zero bits. If the nsw keyword is present, then the shift
produces a poison value if it shifts out any bits that disagree with the
resultant sign bit.
The shl instruction should not get nsw flag.
Here's instcombine checking for this edge condition when shifting by (bitwidth
- 1) -
https://github.com/llvm/llvm-project/blob/5e13cd2e61cb187f28d743c15141333530cc1adf/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp#L177
--
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/20190625/81f5dda3/attachment.html>
More information about the llvm-bugs
mailing list