@@ -19166,7 +19166,7 @@ SDValue X86TargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const {
1916619166
1916719167SDValue X86TargetLowering::LowerExternalSymbol(SDValue Op,
1916819168 SelectionDAG &DAG) const {
19169- return LowerGlobalOrExternal(Op, DAG, /*ForCall=*/false);
19169+ return LowerGlobalOrExternal(Op, DAG, /*ForCall=*/false, nullptr );
1917019170}
1917119171
1917219172SDValue
@@ -19194,7 +19194,8 @@ X86TargetLowering::LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const {
1919419194/// Creates target global address or external symbol nodes for calls or
1919519195/// other uses.
1919619196SDValue X86TargetLowering::LowerGlobalOrExternal(SDValue Op, SelectionDAG &DAG,
19197- bool ForCall) const {
19197+ bool ForCall,
19198+ bool *IsImpCall) const {
1919819199 // Unpack the global address or external symbol.
1919919200 SDLoc dl(Op);
1920019201 const GlobalValue *GV = nullptr;
@@ -19244,6 +19245,16 @@ SDValue X86TargetLowering::LowerGlobalOrExternal(SDValue Op, SelectionDAG &DAG,
1924419245 if (ForCall && !NeedsLoad && !HasPICReg && Offset == 0)
1924519246 return Result;
1924619247
19248+ // If Import Call Optimization is enabled and this is an imported function
19249+ // then make a note of it and return the global address without wrapping.
19250+ if (IsImpCall && (OpFlags == X86II::MO_DLLIMPORT) &&
19251+ Mod.getModuleFlag("import-call-optimization")) {
19252+ assert(ForCall && "Should only enable import call optimization if we are "
19253+ "lowering a call");
19254+ *IsImpCall = true;
19255+ return Result;
19256+ }
19257+
1924719258 Result = DAG.getNode(getGlobalWrapperKind(GV, OpFlags), dl, PtrVT, Result);
1924819259
1924919260 // With PIC, the address is actually $g + Offset.
@@ -19269,7 +19280,7 @@ SDValue X86TargetLowering::LowerGlobalOrExternal(SDValue Op, SelectionDAG &DAG,
1926919280
1927019281SDValue
1927119282X86TargetLowering::LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const {
19272- return LowerGlobalOrExternal(Op, DAG, /*ForCall=*/false);
19283+ return LowerGlobalOrExternal(Op, DAG, /*ForCall=*/false, nullptr );
1927319284}
1927419285
1927519286static SDValue GetTLSADDR(SelectionDAG &DAG, GlobalAddressSDNode *GA,
@@ -34807,6 +34818,7 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {
3480734818 NODE_NAME_CASE(FST)
3480834819 NODE_NAME_CASE(CALL)
3480934820 NODE_NAME_CASE(CALL_RVMARKER)
34821+ NODE_NAME_CASE(IMP_CALL)
3481034822 NODE_NAME_CASE(BT)
3481134823 NODE_NAME_CASE(CMP)
3481234824 NODE_NAME_CASE(FCMP)
@@ -62003,6 +62015,7 @@ X86TargetLowering::EmitKCFICheck(MachineBasicBlock &MBB,
6200362015 Register TargetReg;
6200462016 switch (MBBI->getOpcode()) {
6200562017 case X86::CALL64r:
62018+ case X86::CALL64r_ImpCall:
6200662019 case X86::CALL64r_NT:
6200762020 case X86::TAILJMPr64:
6200862021 case X86::TAILJMPr64_REX:
0 commit comments