mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-01 00:33:09 +00:00
Now that ShrinkDemandedOps() is separated out from DAG combine. It sometimes leave some obvious nops which dag combine used to clean up afterwards e.g. (trunk (ext n)) -> n. Look for them and squash them.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95757 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
37145b6e4c
commit
046632f272
@ -457,6 +457,21 @@ public:
|
||||
};
|
||||
}
|
||||
|
||||
/// TrivialTruncElim - Eliminate some trivial nops that can result from
|
||||
/// ShrinkDemandedOps: (trunc (ext n)) -> n.
|
||||
static bool TrivialTruncElim(SDValue Op,
|
||||
TargetLowering::TargetLoweringOpt &TLO) {
|
||||
SDValue N0 = Op.getOperand(0);
|
||||
EVT VT = Op.getValueType();
|
||||
if ((N0.getOpcode() == ISD::ZERO_EXTEND ||
|
||||
N0.getOpcode() == ISD::SIGN_EXTEND ||
|
||||
N0.getOpcode() == ISD::ANY_EXTEND) &&
|
||||
N0.getOperand(0).getValueType() == VT) {
|
||||
return TLO.CombineTo(Op, N0.getOperand(0));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// ShrinkDemandedOps - A late transformation pass that shrink expressions
|
||||
/// using TargetLowering::TargetLoweringOpt::ShrinkDemandedOp. It converts
|
||||
/// x+y to (VT)((SmallVT)x+(SmallVT)y) if the casts are free.
|
||||
@ -489,7 +504,9 @@ void SelectionDAGISel::ShrinkDemandedOps() {
|
||||
APInt Demanded = APInt::getAllOnesValue(BitWidth);
|
||||
APInt KnownZero, KnownOne;
|
||||
if (TLI.SimplifyDemandedBits(SDValue(N, 0), Demanded,
|
||||
KnownZero, KnownOne, TLO)) {
|
||||
KnownZero, KnownOne, TLO) ||
|
||||
(N->getOpcode() == ISD::TRUNCATE &&
|
||||
TrivialTruncElim(SDValue(N, 0), TLO))) {
|
||||
// Revisit the node.
|
||||
Worklist.erase(std::remove(Worklist.begin(), Worklist.end(), N),
|
||||
Worklist.end());
|
||||
|
13
test/CodeGen/X86/zext-trunc.ll
Normal file
13
test/CodeGen/X86/zext-trunc.ll
Normal file
@ -0,0 +1,13 @@
|
||||
; RUN: llc < %s -march=x86-64 | FileCheck %s
|
||||
; rdar://7570931
|
||||
|
||||
define i64 @foo(i64 %a, i64 %b) nounwind {
|
||||
; CHECK: foo:
|
||||
; CHECK: leal
|
||||
; CHECK-NOT: movl
|
||||
; CHECK: ret
|
||||
%c = add i64 %a, %b
|
||||
%d = trunc i64 %c to i32
|
||||
%e = zext i32 %d to i64
|
||||
ret i64 %e
|
||||
}
|
Loading…
Reference in New Issue
Block a user