forked from OSchip/llvm-project
[SelectionDAG] Fold abs(undef) to 0 instead of undef.
abs should only produce a positive value or the signed minimum value. This means we can't fold abs(undef) to undef as that would allow more values. Fold to 0 instead to match InstSimplify. Fixes test mentioned in comment on pr55271. Reviewed By: nikic Differential Revision: https://reviews.llvm.org/D126174
This commit is contained in:
parent
419e49621f
commit
768a1ca5ec
|
@ -5243,7 +5243,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
|
|||
assert(VT.isInteger() && VT == Operand.getValueType() &&
|
||||
"Invalid ABS!");
|
||||
if (OpOpcode == ISD::UNDEF)
|
||||
return getUNDEF(VT);
|
||||
return getConstant(0, DL, VT);
|
||||
break;
|
||||
case ISD::BSWAP:
|
||||
assert(VT.isInteger() && VT == Operand.getValueType() &&
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
|
||||
|
||||
; abs(undef) should fold to 0 not undef.
|
||||
|
||||
declare i32 @llvm.abs.i32(i32, i1 immarg) #0
|
||||
|
||||
define i32 @abs(i32 %0) {
|
||||
; CHECK-LABEL: abs:
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: xorl %eax, %eax
|
||||
; CHECK-NEXT: retq
|
||||
%2 = call i32 @llvm.abs.i32(i32 undef, i1 false)
|
||||
ret i32 %2
|
||||
}
|
Loading…
Reference in New Issue