diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp | 28 | 
1 files changed, 16 insertions, 12 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp b/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp index 4ca731cfdf62..4d1449bc2751 100644 --- a/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp +++ b/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp @@ -75,6 +75,7 @@  #include "llvm/IR/DebugInfo.h"  #include "llvm/IR/DebugLoc.h"  #include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/DiagnosticInfo.h"  #include "llvm/IR/Function.h"  #include "llvm/IR/GetElementPtrTypeIterator.h"  #include "llvm/IR/GlobalValue.h" @@ -195,10 +196,8 @@ void FastISel::flushLocalValueMap() {          EmitStartPt ? MachineBasicBlock::reverse_iterator(EmitStartPt)                      : FuncInfo.MBB->rend();      MachineBasicBlock::reverse_iterator RI(LastLocalValue); -    for (; RI != RE;) { -      MachineInstr &LocalMI = *RI; -      // Increment before erasing what it points to. -      ++RI; +    for (MachineInstr &LocalMI : +         llvm::make_early_inc_range(llvm::make_range(RI, RE))) {        Register DefReg = findLocalRegDef(LocalMI);        if (!DefReg)          continue; @@ -622,7 +621,7 @@ bool FastISel::selectGetElementPtr(const User *I) {  bool FastISel::addStackMapLiveVars(SmallVectorImpl<MachineOperand> &Ops,                                     const CallInst *CI, unsigned StartIdx) { -  for (unsigned i = StartIdx, e = CI->getNumArgOperands(); i != e; ++i) { +  for (unsigned i = StartIdx, e = CI->arg_size(); i != e; ++i) {      Value *Val = CI->getArgOperand(i);      // Check for constants and encode them with a StackMaps::ConstantOp prefix.      if (const auto *C = dyn_cast<ConstantInt>(Val)) { @@ -784,7 +783,7 @@ bool FastISel::selectPatchpoint(const CallInst *I) {    // Skip the four meta args: <id>, <numNopBytes>, <target>, <numArgs>    // This includes all meta-operands up to but not including CC.    unsigned NumMetaOpers = PatchPointOpers::CCPos; -  assert(I->getNumArgOperands() >= NumMetaOpers + NumArgs && +  assert(I->arg_size() >= NumMetaOpers + NumArgs &&           "Not enough arguments provided to the patchpoint intrinsic");    // For AnyRegCC the arguments are lowered later on manually. @@ -1151,6 +1150,8 @@ bool FastISel::lowerCall(const CallInst *CI) {    CLI.setCallee(RetTy, FuncTy, CI->getCalledOperand(), std::move(Args), *CI)        .setTailCall(IsTailCall); +  diagnoseDontCall(*CI); +    return lowerCallTo(CLI);  } @@ -1264,7 +1265,7 @@ bool FastISel::selectIntrinsicCall(const IntrinsicInst *II) {        // 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()) { +      if (FuncInfo.MF->useDebugInstrRef() && Op->isReg()) {          Builder->setDesc(TII.get(TargetOpcode::DBG_INSTR_REF));          Builder->getOperand(1).ChangeToImmediate(0);          auto *NewExpr = @@ -1292,18 +1293,22 @@ bool FastISel::selectIntrinsicCall(const IntrinsicInst *II) {        BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II, false, 0U,                DI->getVariable(), DI->getExpression());      } else if (const auto *CI = dyn_cast<ConstantInt>(V)) { +      // See if there's an expression to constant-fold. +      DIExpression *Expr = DI->getExpression(); +      if (Expr) +        std::tie(Expr, CI) = Expr->constantFold(CI);        if (CI->getBitWidth() > 64)          BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II)              .addCImm(CI)              .addImm(0U)              .addMetadata(DI->getVariable()) -            .addMetadata(DI->getExpression()); +            .addMetadata(Expr);        else          BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II)              .addImm(CI->getZExtValue())              .addImm(0U)              .addMetadata(DI->getVariable()) -            .addMetadata(DI->getExpression()); +            .addMetadata(Expr);      } else if (const auto *CF = dyn_cast<ConstantFP>(V)) {        BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II)            .addFPImm(CF) @@ -1319,7 +1324,7 @@ bool FastISel::selectIntrinsicCall(const IntrinsicInst *II) {        // If using instruction referencing, mutate this into a DBG_INSTR_REF,        // to be later patched up by finalizeDebugInstrRefs. -      if (TM.Options.ValueTrackingVariableLocations) { +      if (FuncInfo.MF->useDebugInstrRef()) {          Builder->setDesc(TII.get(TargetOpcode::DBG_INSTR_REF));          Builder->getOperand(1).ChangeToImmediate(0);        } @@ -2303,8 +2308,7 @@ FastISel::createMachineMemOperandFor(const Instruction *I) const {    bool IsDereferenceable = I->hasMetadata(LLVMContext::MD_dereferenceable);    const MDNode *Ranges = I->getMetadata(LLVMContext::MD_range); -  AAMDNodes AAInfo; -  I->getAAMetadata(AAInfo); +  AAMDNodes AAInfo = I->getAAMetadata();    if (!Alignment) // Ensure that codegen never sees alignment 0.      Alignment = DL.getABITypeAlign(ValTy);  | 
