diff options
| author | Weiming Zhao <weimingz@codeaurora.org> | 2014-05-13 00:40:58 +0000 |
|---|---|---|
| committer | Weiming Zhao <weimingz@codeaurora.org> | 2014-05-13 00:40:58 +0000 |
| commit | dd83691cc3f99670d6ae399e20954e2d52434ae3 (patch) | |
| tree | aa571ddd223dc08e0b27427a3ebff2a48e6d1b30 /llvm/lib/Target/ARM64 | |
| parent | cddb255b5dcf8c114df119e45b4e586d25ba7093 (diff) | |
| download | bcm5719-llvm-dd83691cc3f99670d6ae399e20954e2d52434ae3.tar.gz bcm5719-llvm-dd83691cc3f99670d6ae399e20954e2d52434ae3.zip | |
Folding into CSEL when there is ZEXT between SETCC and ADD
Normally, patterns like (add x, (setcc cc ...)) will be folded into
(csel x, x+1, not cc). However, if there is a ZEXT after SETCC, they
won't be folded. This patch recognizes the ZEXT and allows the
generation of CSINC.
This patch fixes bug 19680.
llvm-svn: 208660
Diffstat (limited to 'llvm/lib/Target/ARM64')
| -rw-r--r-- | llvm/lib/Target/ARM64/ARM64ISelLowering.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/llvm/lib/Target/ARM64/ARM64ISelLowering.cpp b/llvm/lib/Target/ARM64/ARM64ISelLowering.cpp index 1d27e86e215..546343a0feb 100644 --- a/llvm/lib/Target/ARM64/ARM64ISelLowering.cpp +++ b/llvm/lib/Target/ARM64/ARM64ISelLowering.cpp @@ -6600,8 +6600,16 @@ static bool isSetCC(SDValue Op, SetCCInfoAndKind &SetCCInfo) { return TValue->isOne() && FValue->isNullValue(); } +// Returns true if Op is setcc or zext of setcc. +static bool isSetCCOrZExtSetCC(const SDValue& Op, SetCCInfoAndKind &Info) { + if (isSetCC(Op, Info)) + return true; + return ((Op.getOpcode() == ISD::ZERO_EXTEND) && + isSetCC(Op->getOperand(0), Info)); +} + // The folding we want to perform is: -// (add x, (setcc cc ...) ) +// (add x, [zext] (setcc cc ...) ) // --> // (csel x, (add x, 1), !cc ...) // @@ -6613,9 +6621,9 @@ static SDValue performSetccAddFolding(SDNode *Op, SelectionDAG &DAG) { SetCCInfoAndKind InfoAndKind; // If neither operand is a SET_CC, give up. - if (!isSetCC(LHS, InfoAndKind)) { + if (!isSetCCOrZExtSetCC(LHS, InfoAndKind)) { std::swap(LHS, RHS); - if (!isSetCC(LHS, InfoAndKind)) + if (!isSetCCOrZExtSetCC(LHS, InfoAndKind)) return SDValue(); } |

