diff options
-rw-r--r-- | llvm/lib/Target/SystemZ/SystemZElimCompare.cpp | 40 | ||||
-rw-r--r-- | llvm/test/CodeGen/SystemZ/load-and-test.mir | 52 |
2 files changed, 15 insertions, 77 deletions
diff --git a/llvm/lib/Target/SystemZ/SystemZElimCompare.cpp b/llvm/lib/Target/SystemZ/SystemZElimCompare.cpp index 0619a47a14d..a8e0ba4fb15 100644 --- a/llvm/lib/Target/SystemZ/SystemZElimCompare.cpp +++ b/llvm/lib/Target/SystemZ/SystemZElimCompare.cpp @@ -86,11 +86,9 @@ private: SmallVectorImpl<MachineInstr *> &CCUsers); bool convertToLoadAndTrap(MachineInstr &MI, MachineInstr &Compare, SmallVectorImpl<MachineInstr *> &CCUsers); - bool convertToLoadAndTest(MachineInstr &MI, MachineInstr &Compare, - SmallVectorImpl<MachineInstr *> &CCUsers); + bool convertToLoadAndTest(MachineInstr &MI); bool adjustCCMasksForInstr(MachineInstr &MI, MachineInstr &Compare, - SmallVectorImpl<MachineInstr *> &CCUsers, - unsigned ConvOpc = 0); + SmallVectorImpl<MachineInstr *> &CCUsers); bool optimizeCompareZero(MachineInstr &Compare, SmallVectorImpl<MachineInstr *> &CCUsers); bool fuseCompareOperations(MachineInstr &Compare, @@ -284,13 +282,9 @@ bool SystemZElimCompare::convertToLoadAndTrap( // If MI is a load instruction, try to convert it into a LOAD AND TEST. // Return true on success. -bool SystemZElimCompare::convertToLoadAndTest( - MachineInstr &MI, MachineInstr &Compare, - SmallVectorImpl<MachineInstr *> &CCUsers) { - - // Try to adjust CC masks for a LOAD AND TEST opcode that could replace MI. +bool SystemZElimCompare::convertToLoadAndTest(MachineInstr &MI) { unsigned Opcode = TII->getLoadAndTest(MI.getOpcode()); - if (!Opcode || !adjustCCMasksForInstr(MI, Compare, CCUsers, Opcode)) + if (!Opcode) return false; MI.setDesc(TII->get(Opcode)); @@ -300,16 +294,14 @@ bool SystemZElimCompare::convertToLoadAndTest( } // The CC users in CCUsers are testing the result of a comparison of some -// value X against zero and we know that any CC value produced by MI would -// also reflect the value of X. ConvOpc may be used to pass the transfomed -// opcode MI will have if this succeeds. Try to adjust CCUsers so that they -// test the result of MI directly, returning true on success. Leave -// everything unchanged on failure. +// value X against zero and we know that any CC value produced by MI +// would also reflect the value of X. Try to adjust CCUsers so that +// they test the result of MI directly, returning true on success. +// Leave everything unchanged on failure. bool SystemZElimCompare::adjustCCMasksForInstr( MachineInstr &MI, MachineInstr &Compare, - SmallVectorImpl<MachineInstr *> &CCUsers, - unsigned ConvOpc) { - int Opcode = (ConvOpc ? ConvOpc : MI.getOpcode()); + SmallVectorImpl<MachineInstr *> &CCUsers) { + int Opcode = MI.getOpcode(); const MCInstrDesc &Desc = TII->get(Opcode); unsigned MIFlags = Desc.TSFlags; @@ -366,11 +358,9 @@ bool SystemZElimCompare::adjustCCMasksForInstr( } // CC is now live after MI. - if (!ConvOpc) { - int CCDef = MI.findRegisterDefOperandIdx(SystemZ::CC, false, true, TRI); - assert(CCDef >= 0 && "Couldn't find CC set"); - MI.getOperand(CCDef).setIsDead(false); - } + int CCDef = MI.findRegisterDefOperandIdx(SystemZ::CC, false, true, TRI); + assert(CCDef >= 0 && "Couldn't find CC set"); + MI.getOperand(CCDef).setIsDead(false); // Clear any intervening kills of CC. MachineBasicBlock::iterator MBBI = MI, MBBE = Compare; @@ -429,7 +419,7 @@ bool SystemZElimCompare::optimizeCompareZero( } } // Try to eliminate Compare by reusing a CC result from MI. - if ((!CCRefs && convertToLoadAndTest(MI, Compare, CCUsers)) || + if ((!CCRefs && convertToLoadAndTest(MI)) || (!CCRefs.Def && adjustCCMasksForInstr(MI, Compare, CCUsers))) { EliminatedComparisons += 1; return true; @@ -451,7 +441,7 @@ bool SystemZElimCompare::optimizeCompareZero( MachineInstr &MI = *MBBI; if (preservesValueOf(MI, SrcReg)) { // Try to eliminate Compare by reusing a CC result from MI. - if (convertToLoadAndTest(MI, Compare, CCUsers)) { + if (convertToLoadAndTest(MI)) { EliminatedComparisons += 1; return true; } diff --git a/llvm/test/CodeGen/SystemZ/load-and-test.mir b/llvm/test/CodeGen/SystemZ/load-and-test.mir deleted file mode 100644 index da01dbc79a9..00000000000 --- a/llvm/test/CodeGen/SystemZ/load-and-test.mir +++ /dev/null @@ -1,52 +0,0 @@ -# RUN: llc -mtriple=s390x-linux-gnu -mcpu=z13 -start-before=postrapseudos %s -o - \ -# RUN: | FileCheck %s -# -# Check that integer load and test instructions are not emitted for unsigned -# comparisons unless checking for equality. That would be wrong, since the -# operands are implicitly treated as signed values. - -# Not legal: Logical comparison used for >= (CCMask is 10). -# CHECK-LABEL: fun0 -# CHECK-NOT: lt ---- -name: fun0 -tracksRegLiveness: true -body: | - bb.0 (): - liveins: %r1d - renamable %r0l = L %r1d, 0, %noreg - CLFIMux killed renamable %r0l, 0, implicit-def %cc - BRC 14, 10, %bb.2, implicit %cc - - bb.1 (): - liveins: %r0l - ST killed renamable %r0l, %r15d, 164, %noreg - - bb.2 (): - liveins: %r0l - ST killed renamable %r0l, %r15d, 164, %noreg - Return -... - -# Legal: Logical comparison used for == (CCMask is 8). -# CHECK-LABEL: fun1 -# CHECK: lt ---- -name: fun1 -tracksRegLiveness: true -body: | - bb.0 (): - liveins: %r1d - renamable %r0l = L %r1d, 0, %noreg - CLFIMux killed renamable %r0l, 0, implicit-def %cc - BRC 14, 8, %bb.2, implicit %cc - - bb.1 (): - liveins: %r0l - ST killed renamable %r0l, %r15d, 164, %noreg - - bb.2 (): - liveins: %r0l - ST killed renamable %r0l, %r15d, 164, %noreg - Return -... |