From 47fcd72e246b8293bd64caaa152cddf629821fa1 Mon Sep 17 00:00:00 2001 From: Anton Korobeynikov Date: Sun, 3 May 2009 13:19:09 +0000 Subject: [PATCH] Make handling of conditional stuff much more straightforward llvm-svn: 70767 --- llvm/lib/Target/MSP430/MSP430ISelLowering.cpp | 113 +++++++----------- llvm/lib/Target/MSP430/MSP430ISelLowering.h | 15 +-- llvm/lib/Target/MSP430/MSP430InstrInfo.td | 21 ++-- 3 files changed, 57 insertions(+), 92 deletions(-) diff --git a/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp b/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp index acfc7c989dd0..2c7c38ff9c8e 100644 --- a/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp +++ b/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp @@ -78,13 +78,15 @@ MSP430TargetLowering::MSP430TargetLowering(MSP430TargetMachine &tm) : setOperationAction(ISD::ExternalSymbol, MVT::i16, Custom); setOperationAction(ISD::BR_JT, MVT::Other, Expand); setOperationAction(ISD::BRIND, MVT::Other, Expand); - setOperationAction(ISD::BR_CC, MVT::Other, Expand); - setOperationAction(ISD::BRCOND, MVT::Other, Custom); - setOperationAction(ISD::SETCC, MVT::i8, Custom); - setOperationAction(ISD::SETCC, MVT::i16, Custom); - setOperationAction(ISD::SELECT_CC, MVT::Other, Expand); - setOperationAction(ISD::SELECT, MVT::i8, Custom); - setOperationAction(ISD::SELECT, MVT::i16, Custom); + setOperationAction(ISD::BR_CC, MVT::i8, Custom); + setOperationAction(ISD::BR_CC, MVT::i16, Custom); + setOperationAction(ISD::BRCOND, MVT::Other, Expand); + setOperationAction(ISD::SETCC, MVT::i8, Expand); + setOperationAction(ISD::SETCC, MVT::i16, Expand); + setOperationAction(ISD::SELECT, MVT::i8, Expand); + setOperationAction(ISD::SELECT, MVT::i16, Expand); + setOperationAction(ISD::SELECT_CC, MVT::i8, Custom); + setOperationAction(ISD::SELECT_CC, MVT::i16, Custom); setOperationAction(ISD::SIGN_EXTEND, MVT::i16, Custom); // FIXME: Implement efficiently multiplication by a constant @@ -110,9 +112,8 @@ SDValue MSP430TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) { case ISD::CALL: return LowerCALL(Op, DAG); case ISD::GlobalAddress: return LowerGlobalAddress(Op, DAG); case ISD::ExternalSymbol: return LowerExternalSymbol(Op, DAG); - case ISD::SETCC: return LowerSETCC(Op, DAG); - case ISD::BRCOND: return LowerBRCOND(Op, DAG); - case ISD::SELECT: return LowerSELECT(Op, DAG); + case ISD::BR_CC: return LowerBR_CC(Op, DAG); + case ISD::SELECT_CC: return LowerSELECT_CC(Op, DAG); case ISD::SIGN_EXTEND: return LowerSIGN_EXTEND(Op, DAG); default: assert(0 && "unimplemented operand"); @@ -490,23 +491,14 @@ SDValue MSP430TargetLowering::LowerExternalSymbol(SDValue Op, return DAG.getNode(MSP430ISD::Wrapper, dl, getPointerTy(), Result);; } - -MVT MSP430TargetLowering::getSetCCResultType(MVT VT) const { - return MVT::i8; -} - -SDValue MSP430TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) { - assert(Op.getValueType() == MVT::i8 && "SetCC type must be 8-bit integer"); - SDValue LHS = Op.getOperand(0); - SDValue RHS = Op.getOperand(1); - DebugLoc dl = Op.getDebugLoc(); - ISD::CondCode CC = cast(Op.getOperand(2))->get(); - +static SDValue EmitCMP(SDValue &LHS, SDValue &RHS, unsigned &TargetCC, + ISD::CondCode CC, + DebugLoc dl, SelectionDAG &DAG) { // FIXME: Handle bittests someday assert(!LHS.getValueType().isFloatingPoint() && "We don't handle FP yet"); // FIXME: Handle jump negative someday - unsigned TargetCC = 0; + TargetCC = MSP430::COND_INVALID; switch (CC) { default: assert(0 && "Invalid integer condition!"); case ISD::SETEQ: @@ -537,66 +529,46 @@ SDValue MSP430TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) { break; } - SDValue Cond = DAG.getNode(MSP430ISD::CMP, dl, MVT::i16, LHS, RHS); - return DAG.getNode(MSP430ISD::SETCC, dl, MVT::i8, - DAG.getConstant(TargetCC, MVT::i8), Cond); + return DAG.getNode(MSP430ISD::CMP, dl, MVT::Flag, LHS, RHS); } -SDValue MSP430TargetLowering::LowerBRCOND(SDValue Op, SelectionDAG &DAG) { + +SDValue MSP430TargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) { SDValue Chain = Op.getOperand(0); - SDValue Cond = Op.getOperand(1); - SDValue Dest = Op.getOperand(2); - DebugLoc dl = Op.getDebugLoc(); - SDValue CC; + ISD::CondCode CC = cast(Op.getOperand(1))->get(); + SDValue LHS = Op.getOperand(2); + SDValue RHS = Op.getOperand(3); + SDValue Dest = Op.getOperand(4); + DebugLoc dl = Op.getDebugLoc(); - // Lower condition if not lowered yet - if (Cond.getOpcode() == ISD::SETCC) - Cond = LowerSETCC(Cond, DAG); + unsigned TargetCC = MSP430::COND_INVALID; + SDValue Flag = EmitCMP(LHS, RHS, TargetCC, CC, dl, DAG); - // If condition flag is set by a MSP430ISD::CMP, then use it as the condition - // setting operand in place of the MSP430ISD::SETCC. - if (Cond.getOpcode() == MSP430ISD::SETCC) { - CC = Cond.getOperand(0); - Cond = Cond.getOperand(1); - } else - assert(0 && "Unimplemented condition!"); - - return DAG.getNode(MSP430ISD::BRCOND, dl, Op.getValueType(), - Chain, Dest, CC, Cond); + return DAG.getNode(MSP430ISD::BR_CC, dl, Op.getValueType(), + Chain, + Dest, DAG.getConstant(TargetCC, MVT::i8), + Flag); } -SDValue MSP430TargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) { - SDValue Cond = Op.getOperand(0); - SDValue TrueV = Op.getOperand(1); - SDValue FalseV = Op.getOperand(2); +SDValue MSP430TargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) { + SDValue LHS = Op.getOperand(0); + SDValue RHS = Op.getOperand(1); + SDValue TrueV = Op.getOperand(2); + SDValue FalseV = Op.getOperand(3); + ISD::CondCode CC = cast(Op.getOperand(4))->get(); DebugLoc dl = Op.getDebugLoc(); - SDValue CC; - // Lower condition if not lowered yet - if (Cond.getOpcode() == ISD::SETCC) - Cond = LowerSETCC(Cond, DAG); - - // If condition flag is set by a MSP430ISD::CMP, then use it as the condition - // setting operand in place of the MSP430ISD::SETCC. - if (Cond.getOpcode() == MSP430ISD::SETCC) { - CC = Cond.getOperand(0); - Cond = Cond.getOperand(1); - TrueV = Cond.getOperand(0); - FalseV = Cond.getOperand(1); - } else { - CC = DAG.getConstant(MSP430::COND_NE, MVT::i16); - Cond = DAG.getNode(MSP430ISD::CMP, dl, MVT::i16, - Cond, DAG.getConstant(0, MVT::i16)); - } + unsigned TargetCC = MSP430::COND_INVALID; + SDValue Flag = EmitCMP(LHS, RHS, TargetCC, CC, dl, DAG); SDVTList VTs = DAG.getVTList(Op.getValueType(), MVT::Flag); SmallVector Ops; Ops.push_back(TrueV); Ops.push_back(FalseV); - Ops.push_back(CC); - Ops.push_back(Cond); + Ops.push_back(DAG.getConstant(TargetCC, MVT::i8)); + Ops.push_back(Flag); - return DAG.getNode(MSP430ISD::SELECT, dl, VTs, &Ops[0], Ops.size()); + return DAG.getNode(MSP430ISD::SELECT_CC, dl, VTs, &Ops[0], Ops.size()); } SDValue MSP430TargetLowering::LowerSIGN_EXTEND(SDValue Op, @@ -621,10 +593,9 @@ const char *MSP430TargetLowering::getTargetNodeName(unsigned Opcode) const { case MSP430ISD::RRC: return "MSP430ISD::RRC"; case MSP430ISD::CALL: return "MSP430ISD::CALL"; case MSP430ISD::Wrapper: return "MSP430ISD::Wrapper"; - case MSP430ISD::BRCOND: return "MSP430ISD::BRCOND"; + case MSP430ISD::BR_CC: return "MSP430ISD::BR_CC"; case MSP430ISD::CMP: return "MSP430ISD::CMP"; - case MSP430ISD::SETCC: return "MSP430ISD::SETCC"; - case MSP430ISD::SELECT: return "MSP430ISD::SELECT"; + case MSP430ISD::SELECT_CC: return "MSP430ISD::SELECT_CC"; } } diff --git a/llvm/lib/Target/MSP430/MSP430ISelLowering.h b/llvm/lib/Target/MSP430/MSP430ISelLowering.h index 32c990d84b04..404534dde89e 100644 --- a/llvm/lib/Target/MSP430/MSP430ISelLowering.h +++ b/llvm/lib/Target/MSP430/MSP430ISelLowering.h @@ -52,11 +52,11 @@ namespace llvm { /// is the block to branch if condition is true, operand 2 is the /// condition code, and operand 3 is the flag operand produced by a CMP /// instruction. - BRCOND, + BR_CC, - /// SELECT. Operand 0 and operand 1 are selection variable, operand 3 is - /// condition code and operand 4 is flag operand. - SELECT + /// SELECT_CC. Operand 0 and operand 1 are selection variable, operand 3 + /// is condition code and operand 4 is flag operand. + SELECT_CC }; } @@ -74,8 +74,6 @@ namespace llvm { /// DAG node. virtual const char *getTargetNodeName(unsigned Opcode) const; - virtual MVT getSetCCResultType(MVT VT) const; - SDValue LowerFORMAL_ARGUMENTS(SDValue Op, SelectionDAG &DAG); SDValue LowerCALL(SDValue Op, SelectionDAG &DAG); SDValue LowerRET(SDValue Op, SelectionDAG &DAG); @@ -83,9 +81,8 @@ namespace llvm { SDValue LowerShifts(SDValue Op, SelectionDAG &DAG); SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG); SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG); - SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG); - SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG); - SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG); + SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG); + SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG); SDValue LowerSIGN_EXTEND(SDValue Op, SelectionDAG &DAG); SDValue LowerCCCCallTo(SDValue Op, SelectionDAG &DAG, diff --git a/llvm/lib/Target/MSP430/MSP430InstrInfo.td b/llvm/lib/Target/MSP430/MSP430InstrInfo.td index 4dfda5d14d83..a7d9e79095a9 100644 --- a/llvm/lib/Target/MSP430/MSP430InstrInfo.td +++ b/llvm/lib/Target/MSP430/MSP430InstrInfo.td @@ -26,13 +26,11 @@ def SDT_MSP430Call : SDTypeProfile<0, -1, [SDTCisVT<0, iPTR>]>; def SDT_MSP430CallSeqStart : SDCallSeqStart<[SDTCisVT<0, i16>]>; def SDT_MSP430CallSeqEnd : SDCallSeqEnd<[SDTCisVT<0, i16>, SDTCisVT<1, i16>]>; def SDT_MSP430Wrapper : SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>, SDTCisPtrTy<0>]>; -def SDT_MSP430SetCC : SDTypeProfile<1, 2, [SDTCisVT<0, i8>, - SDTCisVT<1, i8>, SDTCisVT<2, i16>]>; def SDT_MSP430Cmp : SDTypeProfile<0, 2, [SDTCisSameAs<0, 1>]>; -def SDT_MSP430BrCond : SDTypeProfile<0, 3, [SDTCisVT<0, OtherVT>, - SDTCisVT<1, i8>, SDTCisVT<2, i16>]>; -def SDT_MSP430Select : SDTypeProfile<1, 4, [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, - SDTCisVT<3, i8>, SDTCisVT<4, i16>]>; +def SDT_MSP430BrCC : SDTypeProfile<0, 2, [SDTCisVT<0, OtherVT>, + SDTCisVT<1, i8>]>; +def SDT_MSP430SelectCC : SDTypeProfile<1, 3, [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, + SDTCisVT<3, i8>]>; //===----------------------------------------------------------------------===// // MSP430 Specific Node Definitions. @@ -53,10 +51,9 @@ def MSP430callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_MSP430CallSeqEnd, [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>; def MSP430Wrapper : SDNode<"MSP430ISD::Wrapper", SDT_MSP430Wrapper>; -def MSP430setcc : SDNode<"MSP430ISD::SETCC", SDT_MSP430SetCC>; -def MSP430cmp : SDNode<"MSP430ISD::CMP", SDT_MSP430Cmp>; -def MSP430brcond : SDNode<"MSP430ISD::BRCOND", SDT_MSP430BrCond, [SDNPHasChain]>; -def MSP430select : SDNode<"MSP430ISD::SELECT", SDT_MSP430Select>; +def MSP430cmp : SDNode<"MSP430ISD::CMP", SDT_MSP430Cmp, [SDNPOutFlag]>; +def MSP430brcc : SDNode<"MSP430ISD::BR_CC", SDT_MSP430BrCC, [SDNPHasChain, SDNPInFlag]>; +def MSP430selectcc: SDNode<"MSP430ISD::SELECT_CC", SDT_MSP430SelectCC, [SDNPInFlag]>; //===----------------------------------------------------------------------===// // MSP430 Operand Definitions. @@ -113,7 +110,7 @@ let usesCustomDAGSchedInserter = 1 in { def Select16 : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2, i8imm:$cc), "# Select16 PSEUDO", [(set GR16:$dst, - (MSP430select GR16:$src1, GR16:$src2, imm:$cc, SRW))]>; + (MSP430selectcc GR16:$src1, GR16:$src2, imm:$cc))]>; } let neverHasSideEffects = 1 in @@ -140,7 +137,7 @@ let isBarrier = 1 in let Uses = [SRW] in def JCC : Pseudo<(outs), (ins brtarget:$dst, cc:$cc), "j$cc $dst", - [(MSP430brcond bb:$dst, imm:$cc, SRW)]>; + [(MSP430brcc bb:$dst, imm:$cc)]>; } // isBranch, isTerminator //===----------------------------------------------------------------------===//