@@ -2452,19 +2452,8 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2452
2452
return Ret;
2453
2453
}
2454
2454
2455
- // / This function inlines the called function into the basic block of the
2456
- // / caller. This returns false if it is not possible to inline this call.
2457
- // / The program is still in a well defined state if this occurs though.
2458
- // /
2459
- // / Note that this only does one level of inlining. For example, if the
2460
- // / instruction 'call B' is inlined, and 'B' calls 'C', then the call to 'C' now
2461
- // / exists in the instruction stream. Similarly this will inline a recursive
2462
- // / function by one level.
2463
- llvm::InlineResult llvm::InlineFunction (CallBase &CB, InlineFunctionInfo &IFI,
2464
- bool MergeAttributes,
2465
- AAResults *CalleeAAR,
2466
- bool InsertLifetime,
2467
- Function *ForwardVarArgsTo) {
2455
+ llvm::InlineResult llvm::CanInlineCallSite (const CallBase &CB,
2456
+ InlineFunctionInfo &IFI) {
2468
2457
assert (CB.getParent () && CB.getFunction () && " Instruction not in function!" );
2469
2458
2470
2459
// FIXME: we don't inline callbr yet.
@@ -2481,7 +2470,6 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2481
2470
2482
2471
// The inliner does not know how to inline through calls with operand bundles
2483
2472
// in general ...
2484
- Value *ConvergenceControlToken = nullptr ;
2485
2473
if (CB.hasOperandBundles ()) {
2486
2474
for (int i = 0 , e = CB.getNumOperandBundles (); i != e; ++i) {
2487
2475
auto OBUse = CB.getOperandBundleAt (i);
@@ -2497,7 +2485,7 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2497
2485
if (Tag == LLVMContext::OB_kcfi)
2498
2486
continue ;
2499
2487
if (Tag == LLVMContext::OB_convergencectrl) {
2500
- ConvergenceControlToken = OBUse.Inputs [0 ].get ();
2488
+ IFI. ConvergenceControlToken = OBUse.Inputs [0 ].get ();
2501
2489
continue ;
2502
2490
}
2503
2491
@@ -2515,28 +2503,22 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2515
2503
// fully implements convergence control tokens, there is no mixing of
2516
2504
// controlled and uncontrolled convergent operations in the whole program.
2517
2505
if (CB.isConvergent ()) {
2518
- if (!ConvergenceControlToken &&
2506
+ if (!IFI. ConvergenceControlToken &&
2519
2507
getConvergenceEntry (CalledFunc->getEntryBlock ())) {
2520
2508
return InlineResult::failure (
2521
2509
" convergent call needs convergencectrl operand" );
2522
2510
}
2523
2511
}
2524
2512
2525
- // If the call to the callee cannot throw, set the 'nounwind' flag on any
2526
- // calls that we inline.
2527
- bool MarkNoUnwind = CB.doesNotThrow ();
2528
-
2529
- BasicBlock *OrigBB = CB.getParent ();
2530
- Function *Caller = OrigBB->getParent ();
2513
+ const BasicBlock *OrigBB = CB.getParent ();
2514
+ const Function *Caller = OrigBB->getParent ();
2531
2515
2532
2516
// GC poses two hazards to inlining, which only occur when the callee has GC:
2533
2517
// 1. If the caller has no GC, then the callee's GC must be propagated to the
2534
2518
// caller.
2535
2519
// 2. If the caller has a differing GC, it is invalid to inline.
2536
2520
if (CalledFunc->hasGC ()) {
2537
- if (!Caller->hasGC ())
2538
- Caller->setGC (CalledFunc->getGC ());
2539
- else if (CalledFunc->getGC () != Caller->getGC ())
2521
+ if (Caller->hasGC () && CalledFunc->getGC () != Caller->getGC ())
2540
2522
return InlineResult::failure (" incompatible GC" );
2541
2523
}
2542
2524
@@ -2554,34 +2536,31 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2554
2536
? Caller->getPersonalityFn ()->stripPointerCasts ()
2555
2537
: nullptr ;
2556
2538
if (CalledPersonality) {
2557
- if (!CallerPersonality)
2558
- Caller->setPersonalityFn (CalledPersonality);
2559
2539
// If the personality functions match, then we can perform the
2560
2540
// inlining. Otherwise, we can't inline.
2561
2541
// TODO: This isn't 100% true. Some personality functions are proper
2562
2542
// supersets of others and can be used in place of the other.
2563
- else if (CalledPersonality != CallerPersonality)
2543
+ if (CallerPersonality && CalledPersonality != CallerPersonality)
2564
2544
return InlineResult::failure (" incompatible personality" );
2565
2545
}
2566
2546
2567
2547
// We need to figure out which funclet the callsite was in so that we may
2568
2548
// properly nest the callee.
2569
- Instruction *CallSiteEHPad = nullptr ;
2570
2549
if (CallerPersonality) {
2571
2550
EHPersonality Personality = classifyEHPersonality (CallerPersonality);
2572
2551
if (isScopedEHPersonality (Personality)) {
2573
2552
std::optional<OperandBundleUse> ParentFunclet =
2574
2553
CB.getOperandBundle (LLVMContext::OB_funclet);
2575
2554
if (ParentFunclet)
2576
- CallSiteEHPad = cast<FuncletPadInst>(ParentFunclet->Inputs .front ());
2555
+ IFI. CallSiteEHPad = cast<FuncletPadInst>(ParentFunclet->Inputs .front ());
2577
2556
2578
2557
// OK, the inlining site is legal. What about the target function?
2579
2558
2580
- if (CallSiteEHPad) {
2559
+ if (IFI. CallSiteEHPad ) {
2581
2560
if (Personality == EHPersonality::MSVC_CXX) {
2582
2561
// The MSVC personality cannot tolerate catches getting inlined into
2583
2562
// cleanup funclets.
2584
- if (isa<CleanupPadInst>(CallSiteEHPad)) {
2563
+ if (isa<CleanupPadInst>(IFI. CallSiteEHPad )) {
2585
2564
// Ok, the call site is within a cleanuppad. Let's check the callee
2586
2565
// for catchpads.
2587
2566
for (const BasicBlock &CalledBB : *CalledFunc) {
@@ -2601,13 +2580,33 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2601
2580
}
2602
2581
}
2603
2582
2583
+ return InlineResult::success ();
2584
+ }
2585
+
2586
+ // / This function inlines the called function into the basic block of the
2587
+ // / caller. This returns false if it is not possible to inline this call.
2588
+ // / The program is still in a well defined state if this occurs though.
2589
+ // /
2590
+ // / Note that this only does one level of inlining. For example, if the
2591
+ // / instruction 'call B' is inlined, and 'B' calls 'C', then the call to 'C' now
2592
+ // / exists in the instruction stream. Similarly this will inline a recursive
2593
+ // / function by one level.
2594
+ void llvm::InlineFunctionImpl (CallBase &CB, InlineFunctionInfo &IFI,
2595
+ bool MergeAttributes, AAResults *CalleeAAR,
2596
+ bool InsertLifetime, Function *ForwardVarArgsTo) {
2597
+ BasicBlock *OrigBB = CB.getParent ();
2598
+ Function *Caller = OrigBB->getParent ();
2599
+ Function *CalledFunc = CB.getCalledFunction ();
2600
+ assert (CalledFunc && !CalledFunc->isDeclaration () &&
2601
+ " CanInlineCallSite should have verified direct call to definition" );
2602
+
2604
2603
// Determine if we are dealing with a call in an EHPad which does not unwind
2605
2604
// to caller.
2606
2605
bool EHPadForCallUnwindsLocally = false ;
2607
- if (CallSiteEHPad && isa<CallInst>(CB)) {
2606
+ if (IFI. CallSiteEHPad && isa<CallInst>(CB)) {
2608
2607
UnwindDestMemoTy FuncletUnwindMap;
2609
2608
Value *CallSiteUnwindDestToken =
2610
- getUnwindDestToken (CallSiteEHPad, FuncletUnwindMap);
2609
+ getUnwindDestToken (IFI. CallSiteEHPad , FuncletUnwindMap);
2611
2610
2612
2611
EHPadForCallUnwindsLocally =
2613
2612
CallSiteUnwindDestToken &&
@@ -2624,6 +2623,30 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2624
2623
ClonedCodeInfo InlinedFunctionInfo;
2625
2624
Function::iterator FirstNewBlock;
2626
2625
2626
+ // GC poses two hazards to inlining, which only occur when the callee has GC:
2627
+ // 1. If the caller has no GC, then the callee's GC must be propagated to the
2628
+ // caller.
2629
+ // 2. If the caller has a differing GC, it is invalid to inline.
2630
+ if (CalledFunc->hasGC ()) {
2631
+ if (!Caller->hasGC ())
2632
+ Caller->setGC (CalledFunc->getGC ());
2633
+ else {
2634
+ assert (CalledFunc->getGC () == Caller->getGC () &&
2635
+ " CanInlineCallSite should have verified compatible GCs" );
2636
+ }
2637
+ }
2638
+
2639
+ if (CalledFunc->hasPersonalityFn ()) {
2640
+ Constant *CalledPersonality =
2641
+ CalledFunc->getPersonalityFn ()->stripPointerCasts ();
2642
+ if (!Caller->hasPersonalityFn ()) {
2643
+ Caller->setPersonalityFn (CalledPersonality);
2644
+ } else
2645
+ assert (Caller->getPersonalityFn ()->stripPointerCasts () ==
2646
+ CalledPersonality &&
2647
+ " CanInlineCallSite should have verified compatible personality" );
2648
+ }
2649
+
2627
2650
{ // Scope to destroy VMap after cloning.
2628
2651
ValueToValueMapTy VMap;
2629
2652
struct ByValInit {
@@ -2813,10 +2836,10 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2813
2836
IFI.GetAssumptionCache (*Caller).registerAssumption (II);
2814
2837
}
2815
2838
2816
- if (ConvergenceControlToken) {
2839
+ if (IFI. ConvergenceControlToken ) {
2817
2840
IntrinsicInst *IntrinsicCall = getConvergenceEntry (*FirstNewBlock);
2818
2841
if (IntrinsicCall) {
2819
- IntrinsicCall->replaceAllUsesWith (ConvergenceControlToken);
2842
+ IntrinsicCall->replaceAllUsesWith (IFI. ConvergenceControlToken );
2820
2843
IntrinsicCall->eraseFromParent ();
2821
2844
}
2822
2845
}
@@ -2863,6 +2886,10 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2863
2886
}
2864
2887
}
2865
2888
2889
+ // If the call to the callee cannot throw, set the 'nounwind' flag on any
2890
+ // calls that we inline.
2891
+ bool MarkNoUnwind = CB.doesNotThrow ();
2892
+
2866
2893
SmallVector<Value*,4 > VarArgsToForward;
2867
2894
SmallVector<AttributeSet, 4 > VarArgsAttrs;
2868
2895
for (unsigned i = CalledFunc->getFunctionType ()->getNumParams ();
@@ -3049,12 +3076,12 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
3049
3076
// Update the lexical scopes of the new funclets and callsites.
3050
3077
// Anything that had 'none' as its parent is now nested inside the callsite's
3051
3078
// EHPad.
3052
- if (CallSiteEHPad) {
3079
+ if (IFI. CallSiteEHPad ) {
3053
3080
for (Function::iterator BB = FirstNewBlock->getIterator (),
3054
3081
E = Caller->end ();
3055
3082
BB != E; ++BB) {
3056
3083
// Add bundle operands to inlined call sites.
3057
- PropagateOperandBundles (BB, CallSiteEHPad);
3084
+ PropagateOperandBundles (BB, IFI. CallSiteEHPad );
3058
3085
3059
3086
// It is problematic if the inlinee has a cleanupret which unwinds to
3060
3087
// caller and we inline it into a call site which doesn't unwind but into
@@ -3070,11 +3097,11 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
3070
3097
3071
3098
if (auto *CatchSwitch = dyn_cast<CatchSwitchInst>(I)) {
3072
3099
if (isa<ConstantTokenNone>(CatchSwitch->getParentPad ()))
3073
- CatchSwitch->setParentPad (CallSiteEHPad);
3100
+ CatchSwitch->setParentPad (IFI. CallSiteEHPad );
3074
3101
} else {
3075
3102
auto *FPI = cast<FuncletPadInst>(I);
3076
3103
if (isa<ConstantTokenNone>(FPI->getParentPad ()))
3077
- FPI->setParentPad (CallSiteEHPad);
3104
+ FPI->setParentPad (IFI. CallSiteEHPad );
3078
3105
}
3079
3106
}
3080
3107
}
@@ -3230,7 +3257,7 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
3230
3257
AttributeFuncs::mergeAttributesForInlining (*Caller, *CalledFunc);
3231
3258
3232
3259
// We are now done with the inlining.
3233
- return InlineResult::success () ;
3260
+ return ;
3234
3261
}
3235
3262
3236
3263
// Otherwise, we have the normal case, of more than one block to inline or
@@ -3390,6 +3417,18 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
3390
3417
3391
3418
if (MergeAttributes)
3392
3419
AttributeFuncs::mergeAttributesForInlining (*Caller, *CalledFunc);
3420
+ }
3393
3421
3394
- return InlineResult::success ();
3422
+ llvm::InlineResult llvm::InlineFunction (CallBase &CB, InlineFunctionInfo &IFI,
3423
+ bool MergeAttributes,
3424
+ AAResults *CalleeAAR,
3425
+ bool InsertLifetime,
3426
+ Function *ForwardVarArgsTo) {
3427
+ llvm::InlineResult Result = CanInlineCallSite (CB, IFI);
3428
+ if (Result.isSuccess ()) {
3429
+ InlineFunctionImpl (CB, IFI, MergeAttributes, CalleeAAR, InsertLifetime,
3430
+ ForwardVarArgsTo);
3431
+ }
3432
+
3433
+ return Result;
3395
3434
}
0 commit comments