mirror of
https://github.com/RPCSX/llvm.git
synced 2025-03-06 03:47:44 +00:00
[DAGCombiner] Preserve the exact bit when simplifying SRA to SRL.
Allows more aggressive folding of ashr/shl pairs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240788 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3791d56da6
commit
875007d3c4
@ -771,10 +771,13 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op,
|
||||
|
||||
// If the input sign bit is known to be zero, or if none of the top bits
|
||||
// are demanded, turn this into an unsigned shift right.
|
||||
if (KnownZero.intersects(SignBit) || (HighBits & ~NewMask) == HighBits)
|
||||
return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SRL, dl, VT,
|
||||
Op.getOperand(0),
|
||||
Op.getOperand(1)));
|
||||
if (KnownZero.intersects(SignBit) || (HighBits & ~NewMask) == HighBits) {
|
||||
SDNodeFlags Flags;
|
||||
Flags.setExact(cast<BinaryWithFlagsSDNode>(Op)->Flags.hasExact());
|
||||
return TLO.CombineTo(Op,
|
||||
TLO.DAG.getNode(ISD::SRL, dl, VT, Op.getOperand(0),
|
||||
Op.getOperand(1), &Flags));
|
||||
}
|
||||
|
||||
int Log2 = NewMask.exactLogBase2();
|
||||
if (Log2 >= 0) {
|
||||
|
@ -37,6 +37,16 @@ define i32* @test_exact2(i32 %a, i32 %b, i32* %x) {
|
||||
ret i32* %gep
|
||||
}
|
||||
|
||||
define i32* @test_exact3(i32 %a, i32 %b, i32* %x) {
|
||||
; CHECK-LABEL: test_exact3:
|
||||
; CHECK-NOT: sarl
|
||||
|
||||
%sub = sub i32 %b, %a
|
||||
%shr = ashr exact i32 %sub, 2
|
||||
%gep = getelementptr inbounds i32, i32* %x, i32 %shr
|
||||
ret i32* %gep
|
||||
}
|
||||
|
||||
define i32* @test_exact4(i32 %a, i32 %b, i32* %x) {
|
||||
; CHECK-LABEL: test_exact4:
|
||||
; CHECK: shrl %
|
||||
|
Loading…
x
Reference in New Issue
Block a user