diff options
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/FastISel.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/FastISel.cpp | 250 |
1 files changed, 101 insertions, 149 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp index 62f7f3d98ba6..4ca731cfdf62 100644 --- a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp @@ -238,38 +238,6 @@ void FastISel::flushLocalValueMap() { SavedInsertPt = FuncInfo.InsertPt; } -bool FastISel::hasTrivialKill(const Value *V) { - // Don't consider constants or arguments to have trivial kills. - const Instruction *I = dyn_cast<Instruction>(V); - if (!I) - return false; - - // No-op casts are trivially coalesced by fast-isel. - if (const auto *Cast = dyn_cast<CastInst>(I)) - if (Cast->isNoopCast(DL) && !hasTrivialKill(Cast->getOperand(0))) - return false; - - // Even the value might have only one use in the LLVM IR, it is possible that - // FastISel might fold the use into another instruction and now there is more - // than one use at the Machine Instruction level. - Register Reg = lookUpRegForValue(V); - if (Reg && !MRI.use_empty(Reg)) - return false; - - // GEPs with all zero indices are trivially coalesced by fast-isel. - if (const auto *GEP = dyn_cast<GetElementPtrInst>(I)) - if (GEP->hasAllZeroIndices() && !hasTrivialKill(GEP->getOperand(0))) - return false; - - // Only instructions with a single use in the same basic block are considered - // to have trivial kills. - return I->hasOneUse() && - !(I->getOpcode() == Instruction::BitCast || - I->getOpcode() == Instruction::PtrToInt || - I->getOpcode() == Instruction::IntToPtr) && - cast<Instruction>(*I->user_begin())->getParent() == I->getParent(); -} - Register FastISel::getRegForValue(const Value *V) { EVT RealVT = TLI.getValueType(DL, V->getType(), /*AllowUnknown=*/true); // Don't handle non-simple values in FastISel. @@ -342,8 +310,8 @@ Register FastISel::materializeConstant(const Value *V, MVT VT) { Register IntegerReg = getRegForValue(ConstantInt::get(V->getContext(), SIntVal)); if (IntegerReg) - Reg = fastEmit_r(IntVT.getSimpleVT(), VT, ISD::SINT_TO_FP, IntegerReg, - /*Op0IsKill=*/false); + Reg = fastEmit_r(IntVT.getSimpleVT(), VT, ISD::SINT_TO_FP, + IntegerReg); } } } else if (const auto *Op = dyn_cast<Operator>(V)) { @@ -415,27 +383,22 @@ void FastISel::updateValueMap(const Value *I, Register Reg, unsigned NumRegs) { } } -std::pair<Register, bool> FastISel::getRegForGEPIndex(const Value *Idx) { +Register FastISel::getRegForGEPIndex(const Value *Idx) { Register IdxN = getRegForValue(Idx); if (!IdxN) // Unhandled operand. Halt "fast" selection and bail. - return std::pair<Register, bool>(Register(), false); - - bool IdxNIsKill = hasTrivialKill(Idx); + return Register(); // If the index is smaller or larger than intptr_t, truncate or extend it. MVT PtrVT = TLI.getPointerTy(DL); EVT IdxVT = EVT::getEVT(Idx->getType(), /*HandleUnknown=*/false); if (IdxVT.bitsLT(PtrVT)) { - IdxN = fastEmit_r(IdxVT.getSimpleVT(), PtrVT, ISD::SIGN_EXTEND, IdxN, - IdxNIsKill); - IdxNIsKill = true; + IdxN = fastEmit_r(IdxVT.getSimpleVT(), PtrVT, ISD::SIGN_EXTEND, IdxN); } else if (IdxVT.bitsGT(PtrVT)) { IdxN = - fastEmit_r(IdxVT.getSimpleVT(), PtrVT, ISD::TRUNCATE, IdxN, IdxNIsKill); - IdxNIsKill = true; + fastEmit_r(IdxVT.getSimpleVT(), PtrVT, ISD::TRUNCATE, IdxN); } - return std::pair<Register, bool>(IdxN, IdxNIsKill); + return IdxN; } void FastISel::recomputeInsertPt() { @@ -513,11 +476,10 @@ bool FastISel::selectBinaryOp(const User *I, unsigned ISDOpcode) { Register Op1 = getRegForValue(I->getOperand(1)); if (!Op1) return false; - bool Op1IsKill = hasTrivialKill(I->getOperand(1)); Register ResultReg = - fastEmit_ri_(VT.getSimpleVT(), ISDOpcode, Op1, Op1IsKill, - CI->getZExtValue(), VT.getSimpleVT()); + fastEmit_ri_(VT.getSimpleVT(), ISDOpcode, Op1, CI->getZExtValue(), + VT.getSimpleVT()); if (!ResultReg) return false; @@ -529,7 +491,6 @@ bool FastISel::selectBinaryOp(const User *I, unsigned ISDOpcode) { Register Op0 = getRegForValue(I->getOperand(0)); if (!Op0) // Unhandled operand. Halt "fast" selection and bail. return false; - bool Op0IsKill = hasTrivialKill(I->getOperand(0)); // Check if the second operand is a constant and handle it appropriately. if (const auto *CI = dyn_cast<ConstantInt>(I->getOperand(1))) { @@ -549,8 +510,8 @@ bool FastISel::selectBinaryOp(const User *I, unsigned ISDOpcode) { ISDOpcode = ISD::AND; } - Register ResultReg = fastEmit_ri_(VT.getSimpleVT(), ISDOpcode, Op0, - Op0IsKill, Imm, VT.getSimpleVT()); + Register ResultReg = fastEmit_ri_(VT.getSimpleVT(), ISDOpcode, Op0, Imm, + VT.getSimpleVT()); if (!ResultReg) return false; @@ -562,11 +523,10 @@ bool FastISel::selectBinaryOp(const User *I, unsigned ISDOpcode) { Register Op1 = getRegForValue(I->getOperand(1)); if (!Op1) // Unhandled operand. Halt "fast" selection and bail. return false; - bool Op1IsKill = hasTrivialKill(I->getOperand(1)); // Now we have both operands in registers. Emit the instruction. Register ResultReg = fastEmit_rr(VT.getSimpleVT(), VT.getSimpleVT(), - ISDOpcode, Op0, Op0IsKill, Op1, Op1IsKill); + ISDOpcode, Op0, Op1); if (!ResultReg) // Target-specific code wasn't able to find a machine opcode for // the given ISD opcode and type. Halt "fast" selection and bail. @@ -587,8 +547,6 @@ bool FastISel::selectGetElementPtr(const User *I) { if (isa<VectorType>(I->getType())) return false; - bool NIsKill = hasTrivialKill(I->getOperand(0)); - // Keep a running tab of the total offset to coalesce multiple N = N + Offset // into a single N = N + TotalOffset. uint64_t TotalOffs = 0; @@ -604,10 +562,9 @@ bool FastISel::selectGetElementPtr(const User *I) { // N = N + Offset TotalOffs += DL.getStructLayout(StTy)->getElementOffset(Field); if (TotalOffs >= MaxOffs) { - N = fastEmit_ri_(VT, ISD::ADD, N, NIsKill, TotalOffs, VT); + N = fastEmit_ri_(VT, ISD::ADD, N, TotalOffs, VT); if (!N) // Unhandled operand. Halt "fast" selection and bail. return false; - NIsKill = true; TotalOffs = 0; } } @@ -622,43 +579,38 @@ bool FastISel::selectGetElementPtr(const User *I) { uint64_t IdxN = CI->getValue().sextOrTrunc(64).getSExtValue(); TotalOffs += DL.getTypeAllocSize(Ty) * IdxN; if (TotalOffs >= MaxOffs) { - N = fastEmit_ri_(VT, ISD::ADD, N, NIsKill, TotalOffs, VT); + N = fastEmit_ri_(VT, ISD::ADD, N, TotalOffs, VT); if (!N) // Unhandled operand. Halt "fast" selection and bail. return false; - NIsKill = true; TotalOffs = 0; } continue; } if (TotalOffs) { - N = fastEmit_ri_(VT, ISD::ADD, N, NIsKill, TotalOffs, VT); + N = fastEmit_ri_(VT, ISD::ADD, N, TotalOffs, VT); if (!N) // Unhandled operand. Halt "fast" selection and bail. return false; - NIsKill = true; TotalOffs = 0; } // N = N + Idx * ElementSize; uint64_t ElementSize = DL.getTypeAllocSize(Ty); - std::pair<Register, bool> Pair = getRegForGEPIndex(Idx); - Register IdxN = Pair.first; - bool IdxNIsKill = Pair.second; + Register IdxN = getRegForGEPIndex(Idx); if (!IdxN) // Unhandled operand. Halt "fast" selection and bail. return false; if (ElementSize != 1) { - IdxN = fastEmit_ri_(VT, ISD::MUL, IdxN, IdxNIsKill, ElementSize, VT); + IdxN = fastEmit_ri_(VT, ISD::MUL, IdxN, ElementSize, VT); if (!IdxN) // Unhandled operand. Halt "fast" selection and bail. return false; - IdxNIsKill = true; } - N = fastEmit_rr(VT, VT, ISD::ADD, N, NIsKill, IdxN, IdxNIsKill); + N = fastEmit_rr(VT, VT, ISD::ADD, N, IdxN); if (!N) // Unhandled operand. Halt "fast" selection and bail. return false; } } if (TotalOffs) { - N = fastEmit_ri_(VT, ISD::ADD, N, NIsKill, TotalOffs, VT); + N = fastEmit_ri_(VT, ISD::ADD, N, TotalOffs, VT); if (!N) // Unhandled operand. Halt "fast" selection and bail. return false; } @@ -1081,9 +1033,9 @@ bool FastISel::lowerCallTo(CallLoweringInfo &CLI) { for (auto &Arg : CLI.getArgs()) { Type *FinalType = Arg.Ty; if (Arg.IsByVal) - FinalType = cast<PointerType>(Arg.Ty)->getElementType(); + FinalType = Arg.IndirectType; bool NeedsRegBlock = TLI.functionArgumentNeedsConsecutiveRegisters( - FinalType, CLI.CallConv, CLI.IsVarArg); + FinalType, CLI.CallConv, CLI.IsVarArg, DL); ISD::ArgFlagsTy Flags; if (Arg.IsZExt) @@ -1096,6 +1048,8 @@ bool FastISel::lowerCallTo(CallLoweringInfo &CLI) { Flags.setSRet(); if (Arg.IsSwiftSelf) Flags.setSwiftSelf(); + if (Arg.IsSwiftAsync) + Flags.setSwiftAsync(); if (Arg.IsSwiftError) Flags.setSwiftError(); if (Arg.IsCFGuardTarget) @@ -1120,26 +1074,24 @@ bool FastISel::lowerCallTo(CallLoweringInfo &CLI) { // preallocated handling in the various CC lowering callbacks. Flags.setByVal(); } + MaybeAlign MemAlign = Arg.Alignment; if (Arg.IsByVal || Arg.IsInAlloca || Arg.IsPreallocated) { - PointerType *Ty = cast<PointerType>(Arg.Ty); - Type *ElementTy = Ty->getElementType(); - unsigned FrameSize = - DL.getTypeAllocSize(Arg.ByValType ? Arg.ByValType : ElementTy); + unsigned FrameSize = DL.getTypeAllocSize(Arg.IndirectType); // For ByVal, alignment should come from FE. BE will guess if this info // is not there, but there are cases it cannot get right. - MaybeAlign FrameAlign = Arg.Alignment; - if (!FrameAlign) - FrameAlign = Align(TLI.getByValTypeAlignment(ElementTy, DL)); + if (!MemAlign) + MemAlign = Align(TLI.getByValTypeAlignment(Arg.IndirectType, DL)); Flags.setByValSize(FrameSize); - Flags.setByValAlign(*FrameAlign); + } else if (!MemAlign) { + MemAlign = DL.getABITypeAlign(Arg.Ty); } + Flags.setMemAlign(*MemAlign); if (Arg.IsNest) Flags.setNest(); if (NeedsRegBlock) Flags.setInConsecutiveRegs(); Flags.setOrigAlign(DL.getABITypeAlign(Arg.Ty)); - CLI.OutVals.push_back(Arg.Val); CLI.OutFlags.push_back(Flags); } @@ -1192,7 +1144,7 @@ bool FastISel::lowerCall(const CallInst *CI) { IsTailCall = false; if (IsTailCall && MF->getFunction() .getFnAttribute("disable-tail-calls") - .getValueAsString() == "true") + .getValueAsBool()) IsTailCall = false; CallLoweringInfo CLI; @@ -1304,9 +1256,21 @@ bool FastISel::selectIntrinsicCall(const IntrinsicInst *II) { "Expected inlined-at fields to agree"); // A dbg.declare describes the address of a source variable, so lower it // into an indirect DBG_VALUE. - BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, - TII.get(TargetOpcode::DBG_VALUE), /*IsIndirect*/ true, - *Op, DI->getVariable(), DI->getExpression()); + auto Builder = + BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, + TII.get(TargetOpcode::DBG_VALUE), /*IsIndirect*/ true, *Op, + DI->getVariable(), DI->getExpression()); + + // If using instruction referencing, mutate this into a DBG_INSTR_REF, + // to be later patched up by finalizeDebugInstrRefs. Tack a deref onto + // the expression, we don't have an "indirect" flag in DBG_INSTR_REF. + if (TM.Options.ValueTrackingVariableLocations && Op->isReg()) { + Builder->setDesc(TII.get(TargetOpcode::DBG_INSTR_REF)); + Builder->getOperand(1).ChangeToImmediate(0); + auto *NewExpr = + DIExpression::prepend(DI->getExpression(), DIExpression::DerefBefore); + Builder->getOperand(3).setMetadata(NewExpr); + } } else { // We can't yet handle anything else here because it would require // generating code, thus altering codegen because of debug info. @@ -1322,9 +1286,9 @@ bool FastISel::selectIntrinsicCall(const IntrinsicInst *II) { const Value *V = DI->getValue(); assert(DI->getVariable()->isValidLocationForIntrinsic(DbgLoc) && "Expected inlined-at fields to agree"); - if (!V || isa<UndefValue>(V)) { - // Currently the optimizer can produce this; insert an undef to - // help debugging. + if (!V || isa<UndefValue>(V) || DI->hasArgList()) { + // DI is either undef or cannot produce a valid DBG_VALUE, so produce an + // undef DBG_VALUE to terminate any prior location. BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II, false, 0U, DI->getVariable(), DI->getExpression()); } else if (const auto *CI = dyn_cast<ConstantInt>(V)) { @@ -1349,8 +1313,16 @@ bool FastISel::selectIntrinsicCall(const IntrinsicInst *II) { } else if (Register Reg = lookUpRegForValue(V)) { // FIXME: This does not handle register-indirect values at offset 0. bool IsIndirect = false; - BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II, IsIndirect, Reg, - DI->getVariable(), DI->getExpression()); + auto Builder = + BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II, IsIndirect, Reg, + DI->getVariable(), DI->getExpression()); + + // If using instruction referencing, mutate this into a DBG_INSTR_REF, + // to be later patched up by finalizeDebugInstrRefs. + if (TM.Options.ValueTrackingVariableLocations) { + Builder->setDesc(TII.get(TargetOpcode::DBG_INSTR_REF)); + Builder->getOperand(1).ChangeToImmediate(0); + } } else { // We don't know how to handle other cases, so we drop. LLVM_DEBUG(dbgs() << "Dropping debug info for " << *DI << "\n"); @@ -1421,10 +1393,8 @@ bool FastISel::selectCast(const User *I, unsigned Opcode) { // Unhandled operand. Halt "fast" selection and bail. return false; - bool InputRegIsKill = hasTrivialKill(I->getOperand(0)); - Register ResultReg = fastEmit_r(SrcVT.getSimpleVT(), DstVT.getSimpleVT(), - Opcode, InputReg, InputRegIsKill); + Opcode, InputReg); if (!ResultReg) return false; @@ -1455,7 +1425,6 @@ bool FastISel::selectBitCast(const User *I) { Register Op0 = getRegForValue(I->getOperand(0)); if (!Op0) // Unhandled operand. Halt "fast" selection and bail. return false; - bool Op0IsKill = hasTrivialKill(I->getOperand(0)); // First, try to perform the bitcast by inserting a reg-reg copy. Register ResultReg; @@ -1472,7 +1441,7 @@ bool FastISel::selectBitCast(const User *I) { // If the reg-reg copy failed, select a BITCAST opcode. if (!ResultReg) - ResultReg = fastEmit_r(SrcVT, DstVT, ISD::BITCAST, Op0, Op0IsKill); + ResultReg = fastEmit_r(SrcVT, DstVT, ISD::BITCAST, Op0); if (!ResultReg) return false; @@ -1648,12 +1617,11 @@ bool FastISel::selectFNeg(const User *I, const Value *In) { Register OpReg = getRegForValue(In); if (!OpReg) return false; - bool OpRegIsKill = hasTrivialKill(In); // If the target has ISD::FNEG, use it. EVT VT = TLI.getValueType(DL, I->getType()); Register ResultReg = fastEmit_r(VT.getSimpleVT(), VT.getSimpleVT(), ISD::FNEG, - OpReg, OpRegIsKill); + OpReg); if (ResultReg) { updateValueMap(I, ResultReg); return true; @@ -1668,18 +1636,18 @@ bool FastISel::selectFNeg(const User *I, const Value *In) { return false; Register IntReg = fastEmit_r(VT.getSimpleVT(), IntVT.getSimpleVT(), - ISD::BITCAST, OpReg, OpRegIsKill); + ISD::BITCAST, OpReg); if (!IntReg) return false; Register IntResultReg = fastEmit_ri_( - IntVT.getSimpleVT(), ISD::XOR, IntReg, /*Op0IsKill=*/true, + IntVT.getSimpleVT(), ISD::XOR, IntReg, UINT64_C(1) << (VT.getSizeInBits() - 1), IntVT.getSimpleVT()); if (!IntResultReg) return false; ResultReg = fastEmit_r(IntVT.getSimpleVT(), VT.getSimpleVT(), ISD::BITCAST, - IntResultReg, /*Op0IsKill=*/true); + IntResultReg); if (!ResultReg) return false; @@ -1879,14 +1847,12 @@ bool FastISel::fastLowerIntrinsicCall(const IntrinsicInst * /*II*/) { unsigned FastISel::fastEmit_(MVT, MVT, unsigned) { return 0; } -unsigned FastISel::fastEmit_r(MVT, MVT, unsigned, unsigned /*Op0*/, - bool /*Op0IsKill*/) { +unsigned FastISel::fastEmit_r(MVT, MVT, unsigned, unsigned /*Op0*/) { return 0; } unsigned FastISel::fastEmit_rr(MVT, MVT, unsigned, unsigned /*Op0*/, - bool /*Op0IsKill*/, unsigned /*Op1*/, - bool /*Op1IsKill*/) { + unsigned /*Op1*/) { return 0; } @@ -1900,7 +1866,7 @@ unsigned FastISel::fastEmit_f(MVT, MVT, unsigned, } unsigned FastISel::fastEmit_ri(MVT, MVT, unsigned, unsigned /*Op0*/, - bool /*Op0IsKill*/, uint64_t /*Imm*/) { + uint64_t /*Imm*/) { return 0; } @@ -1909,7 +1875,7 @@ unsigned FastISel::fastEmit_ri(MVT, MVT, unsigned, unsigned /*Op0*/, /// If that fails, it materializes the immediate into a register and try /// fastEmit_rr instead. Register FastISel::fastEmit_ri_(MVT VT, unsigned Opcode, unsigned Op0, - bool Op0IsKill, uint64_t Imm, MVT ImmType) { + uint64_t Imm, MVT ImmType) { // If this is a multiply by a power of two, emit this as a shift left. if (Opcode == ISD::MUL && isPowerOf2_64(Imm)) { Opcode = ISD::SHL; @@ -1927,11 +1893,10 @@ Register FastISel::fastEmit_ri_(MVT VT, unsigned Opcode, unsigned Op0, return 0; // First check if immediate type is legal. If not, we can't use the ri form. - Register ResultReg = fastEmit_ri(VT, VT, Opcode, Op0, Op0IsKill, Imm); + Register ResultReg = fastEmit_ri(VT, VT, Opcode, Op0, Imm); if (ResultReg) return ResultReg; Register MaterialReg = fastEmit_i(ImmType, ImmType, ISD::Constant, Imm); - bool IsImmKill = true; if (!MaterialReg) { // This is a bit ugly/slow, but failing here means falling out of // fast-isel, which would be very slow. @@ -1940,15 +1905,8 @@ Register FastISel::fastEmit_ri_(MVT VT, unsigned Opcode, unsigned Op0, MaterialReg = getRegForValue(ConstantInt::get(ITy, Imm)); if (!MaterialReg) return 0; - // FIXME: If the materialized register here has no uses yet then this - // will be the first use and we should be able to mark it as killed. - // However, the local value area for materialising constant expressions - // grows down, not up, which means that any constant expressions we generate - // later which also use 'Imm' could be after this instruction and therefore - // after this kill. - IsImmKill = false; } - return fastEmit_rr(VT, VT, Opcode, Op0, Op0IsKill, MaterialReg, IsImmKill); + return fastEmit_rr(VT, VT, Opcode, Op0, MaterialReg); } Register FastISel::createResultReg(const TargetRegisterClass *RC) { @@ -1982,8 +1940,7 @@ Register FastISel::fastEmitInst_(unsigned MachineInstOpcode, } Register FastISel::fastEmitInst_r(unsigned MachineInstOpcode, - const TargetRegisterClass *RC, unsigned Op0, - bool Op0IsKill) { + const TargetRegisterClass *RC, unsigned Op0) { const MCInstrDesc &II = TII.get(MachineInstOpcode); Register ResultReg = createResultReg(RC); @@ -1991,10 +1948,10 @@ Register FastISel::fastEmitInst_r(unsigned MachineInstOpcode, if (II.getNumDefs() >= 1) BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II, ResultReg) - .addReg(Op0, getKillRegState(Op0IsKill)); + .addReg(Op0); else { BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II) - .addReg(Op0, getKillRegState(Op0IsKill)); + .addReg(Op0); BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(TargetOpcode::COPY), ResultReg).addReg(II.ImplicitDefs[0]); } @@ -2004,8 +1961,7 @@ Register FastISel::fastEmitInst_r(unsigned MachineInstOpcode, Register FastISel::fastEmitInst_rr(unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, - bool Op0IsKill, unsigned Op1, - bool Op1IsKill) { + unsigned Op1) { const MCInstrDesc &II = TII.get(MachineInstOpcode); Register ResultReg = createResultReg(RC); @@ -2014,12 +1970,12 @@ Register FastISel::fastEmitInst_rr(unsigned MachineInstOpcode, if (II.getNumDefs() >= 1) BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II, ResultReg) - .addReg(Op0, getKillRegState(Op0IsKill)) - .addReg(Op1, getKillRegState(Op1IsKill)); + .addReg(Op0) + .addReg(Op1); else { BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II) - .addReg(Op0, getKillRegState(Op0IsKill)) - .addReg(Op1, getKillRegState(Op1IsKill)); + .addReg(Op0) + .addReg(Op1); BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(TargetOpcode::COPY), ResultReg).addReg(II.ImplicitDefs[0]); } @@ -2028,9 +1984,7 @@ Register FastISel::fastEmitInst_rr(unsigned MachineInstOpcode, Register FastISel::fastEmitInst_rrr(unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, - bool Op0IsKill, unsigned Op1, - bool Op1IsKill, unsigned Op2, - bool Op2IsKill) { + unsigned Op1, unsigned Op2) { const MCInstrDesc &II = TII.get(MachineInstOpcode); Register ResultReg = createResultReg(RC); @@ -2040,14 +1994,14 @@ Register FastISel::fastEmitInst_rrr(unsigned MachineInstOpcode, if (II.getNumDefs() >= 1) BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II, ResultReg) - .addReg(Op0, getKillRegState(Op0IsKill)) - .addReg(Op1, getKillRegState(Op1IsKill)) - .addReg(Op2, getKillRegState(Op2IsKill)); + .addReg(Op0) + .addReg(Op1) + .addReg(Op2); else { BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II) - .addReg(Op0, getKillRegState(Op0IsKill)) - .addReg(Op1, getKillRegState(Op1IsKill)) - .addReg(Op2, getKillRegState(Op2IsKill)); + .addReg(Op0) + .addReg(Op1) + .addReg(Op2); BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(TargetOpcode::COPY), ResultReg).addReg(II.ImplicitDefs[0]); } @@ -2056,7 +2010,7 @@ Register FastISel::fastEmitInst_rrr(unsigned MachineInstOpcode, Register FastISel::fastEmitInst_ri(unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, - bool Op0IsKill, uint64_t Imm) { + uint64_t Imm) { const MCInstrDesc &II = TII.get(MachineInstOpcode); Register ResultReg = createResultReg(RC); @@ -2064,11 +2018,11 @@ Register FastISel::fastEmitInst_ri(unsigned MachineInstOpcode, if (II.getNumDefs() >= 1) BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II, ResultReg) - .addReg(Op0, getKillRegState(Op0IsKill)) + .addReg(Op0) .addImm(Imm); else { BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II) - .addReg(Op0, getKillRegState(Op0IsKill)) + .addReg(Op0) .addImm(Imm); BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(TargetOpcode::COPY), ResultReg).addReg(II.ImplicitDefs[0]); @@ -2078,8 +2032,7 @@ Register FastISel::fastEmitInst_ri(unsigned MachineInstOpcode, Register FastISel::fastEmitInst_rii(unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, - bool Op0IsKill, uint64_t Imm1, - uint64_t Imm2) { + uint64_t Imm1, uint64_t Imm2) { const MCInstrDesc &II = TII.get(MachineInstOpcode); Register ResultReg = createResultReg(RC); @@ -2087,12 +2040,12 @@ Register FastISel::fastEmitInst_rii(unsigned MachineInstOpcode, if (II.getNumDefs() >= 1) BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II, ResultReg) - .addReg(Op0, getKillRegState(Op0IsKill)) + .addReg(Op0) .addImm(Imm1) .addImm(Imm2); else { BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II) - .addReg(Op0, getKillRegState(Op0IsKill)) + .addReg(Op0) .addImm(Imm1) .addImm(Imm2); BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, @@ -2122,8 +2075,7 @@ Register FastISel::fastEmitInst_f(unsigned MachineInstOpcode, Register FastISel::fastEmitInst_rri(unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, - bool Op0IsKill, unsigned Op1, - bool Op1IsKill, uint64_t Imm) { + unsigned Op1, uint64_t Imm) { const MCInstrDesc &II = TII.get(MachineInstOpcode); Register ResultReg = createResultReg(RC); @@ -2132,13 +2084,13 @@ Register FastISel::fastEmitInst_rri(unsigned MachineInstOpcode, if (II.getNumDefs() >= 1) BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II, ResultReg) - .addReg(Op0, getKillRegState(Op0IsKill)) - .addReg(Op1, getKillRegState(Op1IsKill)) + .addReg(Op0) + .addReg(Op1) .addImm(Imm); else { BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II) - .addReg(Op0, getKillRegState(Op0IsKill)) - .addReg(Op1, getKillRegState(Op1IsKill)) + .addReg(Op0) + .addReg(Op1) .addImm(Imm); BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(TargetOpcode::COPY), ResultReg).addReg(II.ImplicitDefs[0]); @@ -2163,21 +2115,21 @@ Register FastISel::fastEmitInst_i(unsigned MachineInstOpcode, } Register FastISel::fastEmitInst_extractsubreg(MVT RetVT, unsigned Op0, - bool Op0IsKill, uint32_t Idx) { + uint32_t Idx) { Register ResultReg = createResultReg(TLI.getRegClassFor(RetVT)); assert(Register::isVirtualRegister(Op0) && "Cannot yet extract from physregs"); const TargetRegisterClass *RC = MRI.getRegClass(Op0); MRI.constrainRegClass(Op0, TRI.getSubClassWithSubReg(RC, Idx)); BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(TargetOpcode::COPY), - ResultReg).addReg(Op0, getKillRegState(Op0IsKill), Idx); + ResultReg).addReg(Op0, 0, Idx); return ResultReg; } /// Emit MachineInstrs to compute the value of Op with all but the least /// significant bit set to zero. -Register FastISel::fastEmitZExtFromI1(MVT VT, unsigned Op0, bool Op0IsKill) { - return fastEmit_ri(VT, VT, ISD::AND, Op0, Op0IsKill, 1); +Register FastISel::fastEmitZExtFromI1(MVT VT, unsigned Op0) { + return fastEmit_ri(VT, VT, ISD::AND, Op0, 1); } /// HandlePHINodesInSuccessorBlocks - Handle PHI nodes in successor blocks. |
