diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 278 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h | 5 | 
2 files changed, 145 insertions, 138 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 59fc0756837..81255749804 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -5550,11 +5550,18 @@ static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic) {    }  } -/// Lower the call to the specified intrinsic function. If we want to emit this -/// as a call to a named external function, return the name. Otherwise, lower it -/// and return null. -const char * -SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) { +void SelectionDAGBuilder::lowerCallToExternalSymbol(const CallInst &I, +                                           const char *FunctionName) { +  assert(FunctionName && "FunctionName must not be nullptr"); +  SDValue Callee = DAG.getExternalSymbol( +      FunctionName, +      DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout())); +  LowerCallTo(&I, Callee, I.isTailCall()); +} + +/// Lower the call to the specified intrinsic function. +void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, +                                             unsigned Intrinsic) {    const TargetLowering &TLI = DAG.getTargetLoweringInfo();    SDLoc sdl = getCurSDLoc();    DebugLoc dl = getCurDebugLoc(); @@ -5564,28 +5571,28 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {    default:      // By default, turn this into a target intrinsic node.      visitTargetIntrinsic(I, Intrinsic); -    return nullptr; -  case Intrinsic::vastart:  visitVAStart(I); return nullptr; -  case Intrinsic::vaend:    visitVAEnd(I); return nullptr; -  case Intrinsic::vacopy:   visitVACopy(I); return nullptr; +    return; +  case Intrinsic::vastart:  visitVAStart(I); return; +  case Intrinsic::vaend:    visitVAEnd(I); return; +  case Intrinsic::vacopy:   visitVACopy(I); return;    case Intrinsic::returnaddress:      setValue(&I, DAG.getNode(ISD::RETURNADDR, sdl,                               TLI.getPointerTy(DAG.getDataLayout()),                               getValue(I.getArgOperand(0)))); -    return nullptr; +    return;    case Intrinsic::addressofreturnaddress:      setValue(&I, DAG.getNode(ISD::ADDROFRETURNADDR, sdl,                               TLI.getPointerTy(DAG.getDataLayout()))); -    return nullptr; +    return;    case Intrinsic::sponentry:      setValue(&I, DAG.getNode(ISD::SPONENTRY, sdl,                               TLI.getPointerTy(DAG.getDataLayout()))); -    return nullptr; +    return;    case Intrinsic::frameaddress:      setValue(&I, DAG.getNode(ISD::FRAMEADDR, sdl,                               TLI.getPointerTy(DAG.getDataLayout()),                               getValue(I.getArgOperand(0)))); -    return nullptr; +    return;    case Intrinsic::read_register: {      Value *Reg = I.getArgOperand(0);      SDValue Chain = getRoot(); @@ -5596,7 +5603,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {        DAG.getVTList(VT, MVT::Other), Chain, RegName);      setValue(&I, Res);      DAG.setRoot(Res.getValue(1)); -    return nullptr; +    return;    }    case Intrinsic::write_register: {      Value *Reg = I.getArgOperand(0); @@ -5606,12 +5613,14 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {          DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));      DAG.setRoot(DAG.getNode(ISD::WRITE_REGISTER, sdl, MVT::Other, Chain,                              RegName, getValue(RegValue))); -    return nullptr; +    return;    }    case Intrinsic::setjmp: -    return &"_setjmp"[!TLI.usesUnderscoreSetJmp()]; +    lowerCallToExternalSymbol(I, &"_setjmp"[!TLI.usesUnderscoreSetJmp()]); +    return;    case Intrinsic::longjmp: -    return &"_longjmp"[!TLI.usesUnderscoreLongJmp()]; +    lowerCallToExternalSymbol(I, &"_longjmp"[!TLI.usesUnderscoreLongJmp()]); +    return;    case Intrinsic::memcpy: {      const auto &MCI = cast<MemCpyInst>(I);      SDValue Op1 = getValue(I.getArgOperand(0)); @@ -5630,7 +5639,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {                                 MachinePointerInfo(I.getArgOperand(0)),                                 MachinePointerInfo(I.getArgOperand(1)));      updateDAGForMaybeTailCall(MC); -    return nullptr; +    return;    }    case Intrinsic::memset: {      const auto &MSI = cast<MemSetInst>(I); @@ -5644,7 +5653,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      SDValue MS = DAG.getMemset(getRoot(), sdl, Op1, Op2, Op3, Align, isVol,                                 isTC, MachinePointerInfo(I.getArgOperand(0)));      updateDAGForMaybeTailCall(MS); -    return nullptr; +    return;    }    case Intrinsic::memmove: {      const auto &MMI = cast<MemMoveInst>(I); @@ -5663,7 +5672,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {                                  isTC, MachinePointerInfo(I.getArgOperand(0)),                                  MachinePointerInfo(I.getArgOperand(1)));      updateDAGForMaybeTailCall(MM); -    return nullptr; +    return;    }    case Intrinsic::memcpy_element_unordered_atomic: {      const AtomicMemCpyInst &MI = cast<AtomicMemCpyInst>(I); @@ -5681,7 +5690,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {                                       MachinePointerInfo(MI.getRawDest()),                                       MachinePointerInfo(MI.getRawSource()));      updateDAGForMaybeTailCall(MC); -    return nullptr; +    return;    }    case Intrinsic::memmove_element_unordered_atomic: {      auto &MI = cast<AtomicMemMoveInst>(I); @@ -5699,7 +5708,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {                                        MachinePointerInfo(MI.getRawDest()),                                        MachinePointerInfo(MI.getRawSource()));      updateDAGForMaybeTailCall(MC); -    return nullptr; +    return;    }    case Intrinsic::memset_element_unordered_atomic: {      auto &MI = cast<AtomicMemSetInst>(I); @@ -5715,7 +5724,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {                                       LengthTy, ElemSz, isTC,                                       MachinePointerInfo(MI.getRawDest()));      updateDAGForMaybeTailCall(MC); -    return nullptr; +    return;    }    case Intrinsic::dbg_addr:    case Intrinsic::dbg_declare: { @@ -5730,7 +5739,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      if (!Address || isa<UndefValue>(Address) ||          (Address->use_empty() && !isa<Argument>(Address))) {        LLVM_DEBUG(dbgs() << "Dropping debug info for " << DI << "\n"); -      return nullptr; +      return;      }      bool isParameter = Variable->isParameter() || isa<Argument>(Address); @@ -5759,7 +5768,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {              Variable, Expression, FI, /*IsIndirect*/ true, dl, SDNodeOrder);          DAG.AddDbgValue(SDV, getRoot().getNode(), isParameter);        } -      return nullptr; +      return;      }      SDValue &N = NodeMap[Address]; @@ -5781,7 +5790,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {          // Address is an argument, so try to emit its dbg value using          // virtual register info from the FuncInfo.ValueMap.          EmitFuncArgumentDbgValue(Address, Variable, Expression, dl, true, N); -        return nullptr; +        return;        } else {          SDV = DAG.getDbgValue(Variable, Expression, N.getNode(), N.getResNo(),                                true, dl, SDNodeOrder); @@ -5795,7 +5804,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {          LLVM_DEBUG(dbgs() << "Dropping debug info for " << DI << "\n");        }      } -    return nullptr; +    return;    }    case Intrinsic::dbg_label: {      const DbgLabelInst &DI = cast<DbgLabelInst>(I); @@ -5805,7 +5814,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      SDDbgLabel *SDV;      SDV = DAG.getDbgLabel(Label, dl, SDNodeOrder);      DAG.AddDbgLabel(SDV); -    return nullptr; +    return;    }    case Intrinsic::dbg_value: {      const DbgValueInst &DI = cast<DbgValueInst>(I); @@ -5816,11 +5825,11 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      dropDanglingDebugInfo(Variable, Expression);      const Value *V = DI.getValue();      if (!V) -      return nullptr; +      return;      if (handleDebugValue(V, Variable, Expression, dl, DI.getDebugLoc(),          SDNodeOrder)) -      return nullptr; +      return;      // TODO: Dangling debug info will eventually either be resolved or produce      // an Undef DBG_VALUE. However in the resolution case, a gap may appear @@ -5828,7 +5837,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      // we should ideally fill with an extra Undef DBG_VALUE.      DanglingDebugInfoMap[V].emplace_back(&DI, dl, SDNodeOrder); -    return nullptr; +    return;    }    case Intrinsic::eh_typeid_for: { @@ -5837,7 +5846,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      unsigned TypeID = DAG.getMachineFunction().getTypeIDFor(GV);      Res = DAG.getConstant(TypeID, sdl, MVT::i32);      setValue(&I, Res); -    return nullptr; +    return;    }    case Intrinsic::eh_return_i32: @@ -5848,15 +5857,15 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {                              getControlRoot(),                              getValue(I.getArgOperand(0)),                              getValue(I.getArgOperand(1)))); -    return nullptr; +    return;    case Intrinsic::eh_unwind_init:      DAG.getMachineFunction().setCallsUnwindInit(true); -    return nullptr; +    return;    case Intrinsic::eh_dwarf_cfa:      setValue(&I, DAG.getNode(ISD::EH_DWARF_CFA, sdl,                               TLI.getPointerTy(DAG.getDataLayout()),                               getValue(I.getArgOperand(0)))); -    return nullptr; +    return;    case Intrinsic::eh_sjlj_callsite: {      MachineModuleInfo &MMI = DAG.getMachineFunction().getMMI();      ConstantInt *CI = dyn_cast<ConstantInt>(I.getArgOperand(0)); @@ -5864,7 +5873,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      assert(MMI.getCurrentCallSite() == 0 && "Overlapping call sites!");      MMI.setCurrentCallSite(CI->getZExtValue()); -    return nullptr; +    return;    }    case Intrinsic::eh_sjlj_functioncontext: {      // Get and store the index of the function context. @@ -5873,7 +5882,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {        cast<AllocaInst>(I.getArgOperand(0)->stripPointerCasts());      int FI = FuncInfo.StaticAllocaMap[FnCtx];      MFI.setFunctionContextIndex(FI); -    return nullptr; +    return;    }    case Intrinsic::eh_sjlj_setjmp: {      SDValue Ops[2]; @@ -5883,34 +5892,34 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {                               DAG.getVTList(MVT::i32, MVT::Other), Ops);      setValue(&I, Op.getValue(0));      DAG.setRoot(Op.getValue(1)); -    return nullptr; +    return;    }    case Intrinsic::eh_sjlj_longjmp:      DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_LONGJMP, sdl, MVT::Other,                              getRoot(), getValue(I.getArgOperand(0)))); -    return nullptr; +    return;    case Intrinsic::eh_sjlj_setup_dispatch:      DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_SETUP_DISPATCH, sdl, MVT::Other,                              getRoot())); -    return nullptr; +    return;    case Intrinsic::masked_gather:      visitMaskedGather(I); -    return nullptr; +    return;    case Intrinsic::masked_load:      visitMaskedLoad(I); -    return nullptr; +    return;    case Intrinsic::masked_scatter:      visitMaskedScatter(I); -    return nullptr; +    return;    case Intrinsic::masked_store:      visitMaskedStore(I); -    return nullptr; +    return;    case Intrinsic::masked_expandload:      visitMaskedLoad(I, true /* IsExpanding */); -    return nullptr; +    return;    case Intrinsic::masked_compressstore:      visitMaskedStore(I, true /* IsCompressing */); -    return nullptr; +    return;    case Intrinsic::x86_mmx_pslli_w:    case Intrinsic::x86_mmx_pslli_d:    case Intrinsic::x86_mmx_pslli_q: @@ -5922,7 +5931,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      SDValue ShAmt = getValue(I.getArgOperand(1));      if (isa<ConstantSDNode>(ShAmt)) {        visitTargetIntrinsic(I, Intrinsic); -      return nullptr; +      return;      }      unsigned NewIntrinsic = 0;      EVT ShAmtVT = MVT::v2i32; @@ -5968,31 +5977,31 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {                         DAG.getConstant(NewIntrinsic, sdl, MVT::i32),                         getValue(I.getArgOperand(0)), ShAmt);      setValue(&I, Res); -    return nullptr; +    return;    }    case Intrinsic::powi:      setValue(&I, ExpandPowI(sdl, getValue(I.getArgOperand(0)),                              getValue(I.getArgOperand(1)), DAG)); -    return nullptr; +    return;    case Intrinsic::log:      setValue(&I, expandLog(sdl, getValue(I.getArgOperand(0)), DAG, TLI)); -    return nullptr; +    return;    case Intrinsic::log2:      setValue(&I, expandLog2(sdl, getValue(I.getArgOperand(0)), DAG, TLI)); -    return nullptr; +    return;    case Intrinsic::log10:      setValue(&I, expandLog10(sdl, getValue(I.getArgOperand(0)), DAG, TLI)); -    return nullptr; +    return;    case Intrinsic::exp:      setValue(&I, expandExp(sdl, getValue(I.getArgOperand(0)), DAG, TLI)); -    return nullptr; +    return;    case Intrinsic::exp2:      setValue(&I, expandExp2(sdl, getValue(I.getArgOperand(0)), DAG, TLI)); -    return nullptr; +    return;    case Intrinsic::pow:      setValue(&I, expandPow(sdl, getValue(I.getArgOperand(0)),                             getValue(I.getArgOperand(1)), DAG, TLI)); -    return nullptr; +    return;    case Intrinsic::sqrt:    case Intrinsic::fabs:    case Intrinsic::sin: @@ -6023,7 +6032,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      setValue(&I, DAG.getNode(Opcode, sdl,                               getValue(I.getArgOperand(0)).getValueType(),                               getValue(I.getArgOperand(0)))); -    return nullptr; +    return;    }    case Intrinsic::lround_i32:    case Intrinsic::lround_i64: @@ -6050,7 +6059,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      setValue(&I, DAG.getNode(Opc, sdl, VT,                               getValue(I.getArgOperand(0)),                               getValue(I.getArgOperand(1)))); -    return nullptr; +    return;    }    case Intrinsic::maxnum: {      auto VT = getValue(I.getArgOperand(0)).getValueType(); @@ -6061,33 +6070,33 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      setValue(&I, DAG.getNode(Opc, sdl, VT,                               getValue(I.getArgOperand(0)),                               getValue(I.getArgOperand(1)))); -    return nullptr; +    return;    }    case Intrinsic::minimum:      setValue(&I, DAG.getNode(ISD::FMINIMUM, sdl,                               getValue(I.getArgOperand(0)).getValueType(),                               getValue(I.getArgOperand(0)),                               getValue(I.getArgOperand(1)))); -    return nullptr; +    return;    case Intrinsic::maximum:      setValue(&I, DAG.getNode(ISD::FMAXIMUM, sdl,                               getValue(I.getArgOperand(0)).getValueType(),                               getValue(I.getArgOperand(0)),                               getValue(I.getArgOperand(1)))); -    return nullptr; +    return;    case Intrinsic::copysign:      setValue(&I, DAG.getNode(ISD::FCOPYSIGN, sdl,                               getValue(I.getArgOperand(0)).getValueType(),                               getValue(I.getArgOperand(0)),                               getValue(I.getArgOperand(1)))); -    return nullptr; +    return;    case Intrinsic::fma:      setValue(&I, DAG.getNode(ISD::FMA, sdl,                               getValue(I.getArgOperand(0)).getValueType(),                               getValue(I.getArgOperand(0)),                               getValue(I.getArgOperand(1)),                               getValue(I.getArgOperand(2)))); -    return nullptr; +    return;    case Intrinsic::experimental_constrained_fadd:    case Intrinsic::experimental_constrained_fsub:    case Intrinsic::experimental_constrained_fmul: @@ -6115,7 +6124,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {    case Intrinsic::experimental_constrained_round:    case Intrinsic::experimental_constrained_trunc:      visitConstrainedFPIntrinsic(cast<ConstrainedFPIntrinsic>(I)); -    return nullptr; +    return;    case Intrinsic::fmuladd: {      EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());      if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict && @@ -6137,7 +6146,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {                                  getValue(I.getArgOperand(2)));        setValue(&I, Add);      } -    return nullptr; +    return;    }    case Intrinsic::convert_to_fp16:      setValue(&I, DAG.getNode(ISD::BITCAST, sdl, MVT::i16, @@ -6145,17 +6154,17 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {                                           getValue(I.getArgOperand(0)),                                           DAG.getTargetConstant(0, sdl,                                                                 MVT::i32)))); -    return nullptr; +    return;    case Intrinsic::convert_from_fp16:      setValue(&I, DAG.getNode(ISD::FP_EXTEND, sdl,                               TLI.getValueType(DAG.getDataLayout(), I.getType()),                               DAG.getNode(ISD::BITCAST, sdl, MVT::f16,                                           getValue(I.getArgOperand(0))))); -    return nullptr; +    return;    case Intrinsic::pcmarker: {      SDValue Tmp = getValue(I.getArgOperand(0));      DAG.setRoot(DAG.getNode(ISD::PCMARKER, sdl, MVT::Other, getRoot(), Tmp)); -    return nullptr; +    return;    }    case Intrinsic::readcyclecounter: {      SDValue Op = getRoot(); @@ -6163,25 +6172,25 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {                        DAG.getVTList(MVT::i64, MVT::Other), Op);      setValue(&I, Res);      DAG.setRoot(Res.getValue(1)); -    return nullptr; +    return;    }    case Intrinsic::bitreverse:      setValue(&I, DAG.getNode(ISD::BITREVERSE, sdl,                               getValue(I.getArgOperand(0)).getValueType(),                               getValue(I.getArgOperand(0)))); -    return nullptr; +    return;    case Intrinsic::bswap:      setValue(&I, DAG.getNode(ISD::BSWAP, sdl,                               getValue(I.getArgOperand(0)).getValueType(),                               getValue(I.getArgOperand(0)))); -    return nullptr; +    return;    case Intrinsic::cttz: {      SDValue Arg = getValue(I.getArgOperand(0));      ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));      EVT Ty = Arg.getValueType();      setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTTZ : ISD::CTTZ_ZERO_UNDEF,                               sdl, Ty, Arg)); -    return nullptr; +    return;    }    case Intrinsic::ctlz: {      SDValue Arg = getValue(I.getArgOperand(0)); @@ -6189,13 +6198,13 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      EVT Ty = Arg.getValueType();      setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTLZ : ISD::CTLZ_ZERO_UNDEF,                               sdl, Ty, Arg)); -    return nullptr; +    return;    }    case Intrinsic::ctpop: {      SDValue Arg = getValue(I.getArgOperand(0));      EVT Ty = Arg.getValueType();      setValue(&I, DAG.getNode(ISD::CTPOP, sdl, Ty, Arg)); -    return nullptr; +    return;    }    case Intrinsic::fshl:    case Intrinsic::fshr: { @@ -6211,7 +6220,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      auto FunnelOpcode = IsFSHL ? ISD::FSHL : ISD::FSHR;      if (TLI.isOperationLegalOrCustom(FunnelOpcode, VT)) {        setValue(&I, DAG.getNode(FunnelOpcode, sdl, VT, X, Y, Z)); -      return nullptr; +      return;      }      // When X == Y, this is rotate. If the data type has a power-of-2 size, we @@ -6221,7 +6230,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {        auto RotateOpcode = IsFSHL ? ISD::ROTL : ISD::ROTR;        if (TLI.isOperationLegalOrCustom(RotateOpcode, VT)) {          setValue(&I, DAG.getNode(RotateOpcode, sdl, VT, X, Z)); -        return nullptr; +        return;        }        // Some targets only rotate one way. Try the opposite direction. @@ -6230,7 +6239,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {          // Negate the shift amount because it is safe to ignore the high bits.          SDValue NegShAmt = DAG.getNode(ISD::SUB, sdl, VT, Zero, Z);          setValue(&I, DAG.getNode(RotateOpcode, sdl, VT, X, NegShAmt)); -        return nullptr; +        return;        }        // fshl (rotl): (X << (Z % BW)) | (X >> ((0 - Z) % BW)) @@ -6240,7 +6249,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {        SDValue ShX = DAG.getNode(ISD::SHL, sdl, VT, X, IsFSHL ? ShAmt : NShAmt);        SDValue ShY = DAG.getNode(ISD::SRL, sdl, VT, X, IsFSHL ? NShAmt : ShAmt);        setValue(&I, DAG.getNode(ISD::OR, sdl, VT, ShX, ShY)); -      return nullptr; +      return;      }      // fshl: (X << (Z % BW)) | (Y >> (BW - (Z % BW))) @@ -6260,31 +6269,31 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      // For fshr, 0-shift returns the 2nd arg (Y).      SDValue IsZeroShift = DAG.getSetCC(sdl, CCVT, ShAmt, Zero, ISD::SETEQ);      setValue(&I, DAG.getSelect(sdl, VT, IsZeroShift, IsFSHL ? X : Y, Or)); -    return nullptr; +    return;    }    case Intrinsic::sadd_sat: {      SDValue Op1 = getValue(I.getArgOperand(0));      SDValue Op2 = getValue(I.getArgOperand(1));      setValue(&I, DAG.getNode(ISD::SADDSAT, sdl, Op1.getValueType(), Op1, Op2)); -    return nullptr; +    return;    }    case Intrinsic::uadd_sat: {      SDValue Op1 = getValue(I.getArgOperand(0));      SDValue Op2 = getValue(I.getArgOperand(1));      setValue(&I, DAG.getNode(ISD::UADDSAT, sdl, Op1.getValueType(), Op1, Op2)); -    return nullptr; +    return;    }    case Intrinsic::ssub_sat: {      SDValue Op1 = getValue(I.getArgOperand(0));      SDValue Op2 = getValue(I.getArgOperand(1));      setValue(&I, DAG.getNode(ISD::SSUBSAT, sdl, Op1.getValueType(), Op1, Op2)); -    return nullptr; +    return;    }    case Intrinsic::usub_sat: {      SDValue Op1 = getValue(I.getArgOperand(0));      SDValue Op2 = getValue(I.getArgOperand(1));      setValue(&I, DAG.getNode(ISD::USUBSAT, sdl, Op1.getValueType(), Op1, Op2)); -    return nullptr; +    return;    }    case Intrinsic::smul_fix:    case Intrinsic::umul_fix: { @@ -6293,7 +6302,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      SDValue Op3 = getValue(I.getArgOperand(2));      setValue(&I, DAG.getNode(FixedPointIntrinsicToOpcode(Intrinsic), sdl,                               Op1.getValueType(), Op1, Op2, Op3)); -    return nullptr; +    return;    }    case Intrinsic::stacksave: {      SDValue Op = getRoot(); @@ -6302,12 +6311,12 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {          DAG.getVTList(TLI.getPointerTy(DAG.getDataLayout()), MVT::Other), Op);      setValue(&I, Res);      DAG.setRoot(Res.getValue(1)); -    return nullptr; +    return;    }    case Intrinsic::stackrestore:      Res = getValue(I.getArgOperand(0));      DAG.setRoot(DAG.getNode(ISD::STACKRESTORE, sdl, MVT::Other, getRoot(), Res)); -    return nullptr; +    return;    case Intrinsic::get_dynamic_area_offset: {      SDValue Op = getRoot();      EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout()); @@ -6321,7 +6330,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {                        Op);      DAG.setRoot(Op);      setValue(&I, Res); -    return nullptr; +    return;    }    case Intrinsic::stackguard: {      EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout()); @@ -6341,7 +6350,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {        Res = TLI.emitStackGuardXorFP(DAG, Res, sdl);      DAG.setRoot(Chain);      setValue(&I, Res); -    return nullptr; +    return;    }    case Intrinsic::stackprotector: {      // Emit code into the DAG to store the stack guard onto the stack. @@ -6368,7 +6377,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {                         /* Alignment = */ 0, MachineMemOperand::MOVolatile);      setValue(&I, Res);      DAG.setRoot(Res); -    return nullptr; +    return;    }    case Intrinsic::objectsize: {      // If we don't know by now, we're never going to know. @@ -6385,14 +6394,14 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {        Res = DAG.getConstant(0, sdl, Ty);      setValue(&I, Res); -    return nullptr; +    return;    }    case Intrinsic::is_constant:      // If this wasn't constant-folded away by now, then it's not a      // constant.      setValue(&I, DAG.getConstant(0, sdl, MVT::i1)); -    return nullptr; +    return;    case Intrinsic::annotation:    case Intrinsic::ptr_annotation: @@ -6400,12 +6409,12 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {    case Intrinsic::strip_invariant_group:      // Drop the intrinsic, but forward the value      setValue(&I, getValue(I.getOperand(0))); -    return nullptr; +    return;    case Intrinsic::assume:    case Intrinsic::var_annotation:    case Intrinsic::sideeffect:      // Discard annotate attributes, assumptions, and artificial side-effects. -    return nullptr; +    return;    case Intrinsic::codeview_annotation: {      // Emit a label associated with this metadata. @@ -6416,7 +6425,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      MF.addCodeViewAnnotation(Label, cast<MDNode>(MD));      Res = DAG.getLabelNode(ISD::ANNOTATION_LABEL, sdl, getRoot(), Label);      DAG.setRoot(Res); -    return nullptr; +    return;    }    case Intrinsic::init_trampoline: { @@ -6433,13 +6442,13 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      Res = DAG.getNode(ISD::INIT_TRAMPOLINE, sdl, MVT::Other, Ops);      DAG.setRoot(Res); -    return nullptr; +    return;    }    case Intrinsic::adjust_trampoline:      setValue(&I, DAG.getNode(ISD::ADJUST_TRAMPOLINE, sdl,                               TLI.getPointerTy(DAG.getDataLayout()),                               getValue(I.getArgOperand(0)))); -    return nullptr; +    return;    case Intrinsic::gcroot: {      assert(DAG.getMachineFunction().getFunction().hasGC() &&             "only valid in functions with gc specified, enforced by Verifier"); @@ -6449,19 +6458,19 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      FrameIndexSDNode *FI = cast<FrameIndexSDNode>(getValue(Alloca).getNode());      GFI->addStackRoot(FI->getIndex(), TypeMap); -    return nullptr; +    return;    }    case Intrinsic::gcread:    case Intrinsic::gcwrite:      llvm_unreachable("GC failed to lower gcread/gcwrite intrinsics!");    case Intrinsic::flt_rounds:      setValue(&I, DAG.getNode(ISD::FLT_ROUNDS_, sdl, MVT::i32)); -    return nullptr; +    return;    case Intrinsic::expect:      // Just replace __builtin_expect(exp, c) with EXP.      setValue(&I, getValue(I.getArgOperand(0))); -    return nullptr; +    return;    case Intrinsic::debugtrap:    case Intrinsic::trap: { @@ -6473,7 +6482,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {        ISD::NodeType Op = (Intrinsic == Intrinsic::trap) ?          ISD::TRAP : ISD::DEBUGTRAP;        DAG.setRoot(DAG.getNode(Op, sdl,MVT::Other, getRoot())); -      return nullptr; +      return;      }      TargetLowering::ArgListTy Args; @@ -6486,7 +6495,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);      DAG.setRoot(Result.second); -    return nullptr; +    return;    }    case Intrinsic::uadd_with_overflow: @@ -6516,7 +6525,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      SDVTList VTs = DAG.getVTList(ResultVT, OverflowVT);      setValue(&I, DAG.getNode(Op, sdl, VTs, Op1, Op2)); -    return nullptr; +    return;    }    case Intrinsic::prefetch: {      SDValue Ops[5]; @@ -6539,14 +6548,14 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      PendingLoads.push_back(Result);      Result = getRoot();      DAG.setRoot(Result); -    return nullptr; +    return;    }    case Intrinsic::lifetime_start:    case Intrinsic::lifetime_end: {      bool IsStart = (Intrinsic == Intrinsic::lifetime_start);      // Stack coloring is not enabled in O0, discard region information.      if (TM.getOptLevel() == CodeGenOpt::None) -      return nullptr; +      return;      const int64_t ObjectSize =          cast<ConstantInt>(I.getArgOperand(0))->getSExtValue(); @@ -6566,7 +6575,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {        // valid frame index.        auto SI = FuncInfo.StaticAllocaMap.find(LifetimeObject);        if (SI == FuncInfo.StaticAllocaMap.end()) -        return nullptr; +        return;        const int FrameIndex = SI->second;        int64_t Offset; @@ -6577,36 +6586,39 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {                                  Offset);        DAG.setRoot(Res);      } -    return nullptr; +    return;    }    case Intrinsic::invariant_start:      // Discard region information.      setValue(&I, DAG.getUNDEF(TLI.getPointerTy(DAG.getDataLayout()))); -    return nullptr; +    return;    case Intrinsic::invariant_end:      // Discard region information. -    return nullptr; +    return;    case Intrinsic::clear_cache: -    return TLI.getClearCacheBuiltinName(); +    /// FunctionName may be null. +    if (const char *FunctionName = TLI.getClearCacheBuiltinName()) +      lowerCallToExternalSymbol(I, FunctionName); +    return;    case Intrinsic::donothing:      // ignore -    return nullptr; +    return;    case Intrinsic::experimental_stackmap:      visitStackmap(I); -    return nullptr; +    return;    case Intrinsic::experimental_patchpoint_void:    case Intrinsic::experimental_patchpoint_i64:      visitPatchpoint(&I); -    return nullptr; +    return;    case Intrinsic::experimental_gc_statepoint:      LowerStatepoint(ImmutableStatepoint(&I)); -    return nullptr; +    return;    case Intrinsic::experimental_gc_result:      visitGCResult(cast<GCResultInst>(I)); -    return nullptr; +    return;    case Intrinsic::experimental_gc_relocate:      visitGCRelocate(cast<GCRelocateInst>(I)); -    return nullptr; +    return;    case Intrinsic::instrprof_increment:      llvm_unreachable("instrprof failed to lower an increment");    case Intrinsic::instrprof_value_profile: @@ -6634,7 +6646,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {            .addFrameIndex(FI);      } -    return nullptr; +    return;    }    case Intrinsic::localrecover: { @@ -6663,7 +6675,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      SDValue Add = DAG.getNode(ISD::ADD, sdl, PtrVT, FPVal, OffsetVal);      setValue(&I, Add); -    return nullptr; +    return;    }    case Intrinsic::eh_exceptionpointer: @@ -6678,7 +6690,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      if (Intrinsic == Intrinsic::eh_exceptioncode)        N = DAG.getZExtOrTrunc(N, getCurSDLoc(), MVT::i32);      setValue(&I, N); -    return nullptr; +    return;    }    case Intrinsic::xray_customevent: {      // Here we want to make sure that the intrinsic behaves as if it has a @@ -6686,7 +6698,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      // FIXME: Support other platforms later.      const auto &Triple = DAG.getTarget().getTargetTriple();      if (Triple.getArch() != Triple::x86_64 || !Triple.isOSLinux()) -      return nullptr; +      return;      SDLoc DL = getCurSDLoc();      SmallVector<SDValue, 8> Ops; @@ -6709,7 +6721,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      SDValue patchableNode = SDValue(MN, 0);      DAG.setRoot(patchableNode);      setValue(&I, patchableNode); -    return nullptr; +    return;    }    case Intrinsic::xray_typedevent: {      // Here we want to make sure that the intrinsic behaves as if it has a @@ -6717,7 +6729,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      // FIXME: Support other platforms later.      const auto &Triple = DAG.getTarget().getTargetTriple();      if (Triple.getArch() != Triple::x86_64 || !Triple.isOSLinux()) -      return nullptr; +      return;      SDLoc DL = getCurSDLoc();      SmallVector<SDValue, 8> Ops; @@ -6744,11 +6756,11 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      SDValue patchableNode = SDValue(MN, 0);      DAG.setRoot(patchableNode);      setValue(&I, patchableNode); -    return nullptr; +    return;    }    case Intrinsic::experimental_deoptimize:      LowerDeoptimizeCall(&I); -    return nullptr; +    return;    case Intrinsic::experimental_vector_reduce_fadd:    case Intrinsic::experimental_vector_reduce_fmul: @@ -6764,7 +6776,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {    case Intrinsic::experimental_vector_reduce_fmax:    case Intrinsic::experimental_vector_reduce_fmin:      visitVectorReduce(I, Intrinsic); -    return nullptr; +    return;    case Intrinsic::icall_branch_funnel: {      SmallVector<SDValue, 16> Ops; @@ -6817,14 +6829,14 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      DAG.setRoot(N);      setValue(&I, N);      HasTailCall = true; -    return nullptr; +    return;    }    case Intrinsic::wasm_landingpad_index:      // Information this intrinsic contained has been transferred to      // MachineFunction in SelectionDAGISel::PrepareEHLandingPad. We can safely      // delete it now. -    return nullptr; +    return;    }  } @@ -7458,7 +7470,6 @@ void SelectionDAGBuilder::visitCall(const CallInst &I) {      return;    } -  const char *RenameFn = nullptr;    if (Function *F = I.getCalledFunction()) {      if (F->isDeclaration()) {        // Is this an LLVM intrinsic or a target-specific intrinsic? @@ -7468,9 +7479,8 @@ void SelectionDAGBuilder::visitCall(const CallInst &I) {            IID = II->getIntrinsicID(F);        if (IID) { -        RenameFn = visitIntrinsicCall(I, IID); -        if (!RenameFn) -          return; +        visitIntrinsicCall(I, IID); +        return;        }      } @@ -7619,20 +7629,14 @@ void SelectionDAGBuilder::visitCall(const CallInst &I) {      }    } -  SDValue Callee; -  if (!RenameFn) -    Callee = getValue(I.getCalledValue()); -  else -    Callee = DAG.getExternalSymbol( -        RenameFn, -        DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout())); -    // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't    // have to do anything here to lower funclet bundles.    assert(!I.hasOperandBundlesOtherThan(               {LLVMContext::OB_deopt, LLVMContext::OB_funclet}) &&           "Cannot lower calls with arbitrary operand bundles!"); +  SDValue Callee = getValue(I.getCalledValue()); +    if (I.countOperandBundlesOfType(LLVMContext::OB_deopt))      LowerCallSiteWithDeoptBundle(&I, Callee, nullptr);    else diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h index e9b94d9c860..176d726985d 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h @@ -947,7 +947,7 @@ private:    void visitStoreToSwiftError(const StoreInst &I);    void visitInlineAsm(ImmutableCallSite CS); -  const char *visitIntrinsicCall(const CallInst &I, unsigned Intrinsic); +  void visitIntrinsicCall(const CallInst &I, unsigned Intrinsic);    void visitTargetIntrinsic(const CallInst &I, unsigned Intrinsic);    void visitConstrainedFPIntrinsic(const ConstrainedFPIntrinsic &FPI); @@ -997,6 +997,9 @@ private:    SDDbgValue *getDbgValue(SDValue N, DILocalVariable *Variable,                            DIExpression *Expr, const DebugLoc &dl,                            unsigned DbgSDNodeOrder); + +  /// Lowers CallInst to an external symbol. +  void lowerCallToExternalSymbol(const CallInst &I, const char *FunctionName);  };  /// This struct represents the registers (physical or virtual)  | 

