diff options
| author | Nirav Dave <niravd@google.com> | 2018-02-05 18:58:58 +0000 |
|---|---|---|
| committer | Nirav Dave <niravd@google.com> | 2018-02-05 18:58:58 +0000 |
| commit | eedb663221b810ac398ccc792258be6078ce3bb9 (patch) | |
| tree | 3518e2b7235f694f8d81df404ebcd518495fe07c /llvm/lib/Target | |
| parent | 9a06f24704fc832931c2981d9ec4baa2ab895225 (diff) | |
| download | bcm5719-llvm-eedb663221b810ac398ccc792258be6078ce3bb9.tar.gz bcm5719-llvm-eedb663221b810ac398ccc792258be6078ce3bb9.zip | |
[X86] Teach DAG unfoldMemoryOperand to reconvert CMPs to tests
Summary:
Copy MI-level cmp->test conversion to SelectionDAG-level memory unfold.
This fixes a regression from upcoming D41293 change.
Reviewers: craig.topper, RKSimon
Reviewed By: craig.topper
Subscribers: llvm-commits, hiraditya
Differential Revision: https://reviews.llvm.org/D42808
llvm-svn: 324261
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp index 9c6c8600745..77310f0f06b 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.cpp +++ b/llvm/lib/Target/X86/X86InstrInfo.cpp @@ -9223,6 +9223,30 @@ X86InstrInfo::unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N, if (Load) BeforeOps.push_back(SDValue(Load, 0)); BeforeOps.insert(BeforeOps.end(), AfterOps.begin(), AfterOps.end()); + // Change CMP32ri r, 0 back to TEST32rr r, r, etc. + switch (Opc) { + default: break; + case X86::CMP64ri32: + case X86::CMP64ri8: + case X86::CMP32ri: + case X86::CMP32ri8: + case X86::CMP16ri: + case X86::CMP16ri8: + case X86::CMP8ri: + if (isNullConstant(BeforeOps[1])) { + switch (Opc) { + default: llvm_unreachable("Unreachable!"); + case X86::CMP64ri8: + case X86::CMP64ri32: Opc = X86::TEST64rr; break; + case X86::CMP32ri8: + case X86::CMP32ri: Opc = X86::TEST32rr; break; + case X86::CMP16ri8: + case X86::CMP16ri: Opc = X86::TEST16rr; break; + case X86::CMP8ri: Opc = X86::TEST8rr; break; + } + BeforeOps[1] = BeforeOps[0]; + } + } SDNode *NewNode= DAG.getMachineNode(Opc, dl, VTs, BeforeOps); NewNodes.push_back(NewNode); |

