diff options
Diffstat (limited to 'llvm/lib/Target/ARM/ARMISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 36b669b8526..dd11ed6ede7 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -12989,22 +12989,26 @@ static SDValue PerformHWLoopCombine(SDNode *N, const ARMSubtarget *ST) { // Look for (brcond (xor test.set.loop.iterations, -1) SDValue CC = N->getOperand(1); + unsigned Opc = CC->getOpcode(); + SDValue Int; - if (CC->getOpcode() != ISD::XOR && CC->getOpcode() != ISD::SETCC) - return SDValue(); + if ((Opc == ISD::XOR || Opc == ISD::SETCC) && + (CC->getOperand(0)->getOpcode() == ISD::INTRINSIC_W_CHAIN)) { + + assert((isa<ConstantSDNode>(CC->getOperand(1)) && + cast<ConstantSDNode>(CC->getOperand(1))->isOne()) && + "Expected to compare against 1"); - if (CC->getOperand(0)->getOpcode() != ISD::INTRINSIC_W_CHAIN) + Int = CC->getOperand(0); + } else if (CC->getOpcode() == ISD::INTRINSIC_W_CHAIN) + Int = CC; + else return SDValue(); - SDValue Int = CC->getOperand(0); unsigned IntOp = cast<ConstantSDNode>(Int.getOperand(1))->getZExtValue(); if (IntOp != Intrinsic::test_set_loop_iterations) return SDValue(); - assert((isa<ConstantSDNode>(CC->getOperand(1)) && - cast<ConstantSDNode>(CC->getOperand(1))->isOne()) && - "Expected to compare against 1"); - SDLoc dl(Int); SDValue Chain = N->getOperand(0); SDValue Elements = Int.getOperand(2); |