@@ -2446,19 +2446,8 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2446
2446
return Ret;
2447
2447
}
2448
2448
2449
- // / This function inlines the called function into the basic block of the
2450
- // / caller. This returns false if it is not possible to inline this call.
2451
- // / The program is still in a well defined state if this occurs though.
2452
- // /
2453
- // / Note that this only does one level of inlining. For example, if the
2454
- // / instruction 'call B' is inlined, and 'B' calls 'C', then the call to 'C' now
2455
- // / exists in the instruction stream. Similarly this will inline a recursive
2456
- // / function by one level.
2457
- llvm::InlineResult llvm::InlineFunction (CallBase &CB, InlineFunctionInfo &IFI,
2458
- bool MergeAttributes,
2459
- AAResults *CalleeAAR,
2460
- bool InsertLifetime,
2461
- Function *ForwardVarArgsTo) {
2449
+ llvm::InlineResult llvm::CanInlineCallSite (const CallBase &CB,
2450
+ InlineFunctionInfo &IFI) {
2462
2451
assert (CB.getParent () && CB.getFunction () && " Instruction not in function!" );
2463
2452
2464
2453
// FIXME: we don't inline callbr yet.
@@ -2475,7 +2464,6 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2475
2464
2476
2465
// The inliner does not know how to inline through calls with operand bundles
2477
2466
// in general ...
2478
- Value *ConvergenceControlToken = nullptr ;
2479
2467
if (CB.hasOperandBundles ()) {
2480
2468
for (int i = 0 , e = CB.getNumOperandBundles (); i != e; ++i) {
2481
2469
auto OBUse = CB.getOperandBundleAt (i);
@@ -2491,7 +2479,7 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2491
2479
if (Tag == LLVMContext::OB_kcfi)
2492
2480
continue ;
2493
2481
if (Tag == LLVMContext::OB_convergencectrl) {
2494
- ConvergenceControlToken = OBUse.Inputs [0 ].get ();
2482
+ IFI. ConvergenceControlToken = OBUse.Inputs [0 ].get ();
2495
2483
continue ;
2496
2484
}
2497
2485
@@ -2509,28 +2497,22 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2509
2497
// fully implements convergence control tokens, there is no mixing of
2510
2498
// controlled and uncontrolled convergent operations in the whole program.
2511
2499
if (CB.isConvergent ()) {
2512
- if (!ConvergenceControlToken &&
2500
+ if (!IFI. ConvergenceControlToken &&
2513
2501
getConvergenceEntry (CalledFunc->getEntryBlock ())) {
2514
2502
return InlineResult::failure (
2515
2503
" convergent call needs convergencectrl operand" );
2516
2504
}
2517
2505
}
2518
2506
2519
- // If the call to the callee cannot throw, set the 'nounwind' flag on any
2520
- // calls that we inline.
2521
- bool MarkNoUnwind = CB.doesNotThrow ();
2522
-
2523
- BasicBlock *OrigBB = CB.getParent ();
2524
- Function *Caller = OrigBB->getParent ();
2507
+ const BasicBlock *OrigBB = CB.getParent ();
2508
+ const Function *Caller = OrigBB->getParent ();
2525
2509
2526
2510
// GC poses two hazards to inlining, which only occur when the callee has GC:
2527
2511
// 1. If the caller has no GC, then the callee's GC must be propagated to the
2528
2512
// caller.
2529
2513
// 2. If the caller has a differing GC, it is invalid to inline.
2530
2514
if (CalledFunc->hasGC ()) {
2531
- if (!Caller->hasGC ())
2532
- Caller->setGC (CalledFunc->getGC ());
2533
- else if (CalledFunc->getGC () != Caller->getGC ())
2515
+ if (Caller->hasGC () && CalledFunc->getGC () != Caller->getGC ())
2534
2516
return InlineResult::failure (" incompatible GC" );
2535
2517
}
2536
2518
@@ -2548,34 +2530,31 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2548
2530
? Caller->getPersonalityFn ()->stripPointerCasts ()
2549
2531
: nullptr ;
2550
2532
if (CalledPersonality) {
2551
- if (!CallerPersonality)
2552
- Caller->setPersonalityFn (CalledPersonality);
2553
2533
// If the personality functions match, then we can perform the
2554
2534
// inlining. Otherwise, we can't inline.
2555
2535
// TODO: This isn't 100% true. Some personality functions are proper
2556
2536
// supersets of others and can be used in place of the other.
2557
- else if (CalledPersonality != CallerPersonality)
2537
+ if (CallerPersonality && CalledPersonality != CallerPersonality)
2558
2538
return InlineResult::failure (" incompatible personality" );
2559
2539
}
2560
2540
2561
2541
// We need to figure out which funclet the callsite was in so that we may
2562
2542
// properly nest the callee.
2563
- Instruction *CallSiteEHPad = nullptr ;
2564
2543
if (CallerPersonality) {
2565
2544
EHPersonality Personality = classifyEHPersonality (CallerPersonality);
2566
2545
if (isScopedEHPersonality (Personality)) {
2567
2546
std::optional<OperandBundleUse> ParentFunclet =
2568
2547
CB.getOperandBundle (LLVMContext::OB_funclet);
2569
2548
if (ParentFunclet)
2570
- CallSiteEHPad = cast<FuncletPadInst>(ParentFunclet->Inputs .front ());
2549
+ IFI. CallSiteEHPad = cast<FuncletPadInst>(ParentFunclet->Inputs .front ());
2571
2550
2572
2551
// OK, the inlining site is legal. What about the target function?
2573
2552
2574
- if (CallSiteEHPad) {
2553
+ if (IFI. CallSiteEHPad ) {
2575
2554
if (Personality == EHPersonality::MSVC_CXX) {
2576
2555
// The MSVC personality cannot tolerate catches getting inlined into
2577
2556
// cleanup funclets.
2578
- if (isa<CleanupPadInst>(CallSiteEHPad)) {
2557
+ if (isa<CleanupPadInst>(IFI. CallSiteEHPad )) {
2579
2558
// Ok, the call site is within a cleanuppad. Let's check the callee
2580
2559
// for catchpads.
2581
2560
for (const BasicBlock &CalledBB : *CalledFunc) {
@@ -2595,13 +2574,33 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2595
2574
}
2596
2575
}
2597
2576
2577
+ return InlineResult::success ();
2578
+ }
2579
+
2580
+ // / This function inlines the called function into the basic block of the
2581
+ // / caller. This returns false if it is not possible to inline this call.
2582
+ // / The program is still in a well defined state if this occurs though.
2583
+ // /
2584
+ // / Note that this only does one level of inlining. For example, if the
2585
+ // / instruction 'call B' is inlined, and 'B' calls 'C', then the call to 'C' now
2586
+ // / exists in the instruction stream. Similarly this will inline a recursive
2587
+ // / function by one level.
2588
+ void llvm::InlineFunctionImpl (CallBase &CB, InlineFunctionInfo &IFI,
2589
+ bool MergeAttributes, AAResults *CalleeAAR,
2590
+ bool InsertLifetime, Function *ForwardVarArgsTo) {
2591
+ BasicBlock *OrigBB = CB.getParent ();
2592
+ Function *Caller = OrigBB->getParent ();
2593
+ Function *CalledFunc = CB.getCalledFunction ();
2594
+ assert (CalledFunc && !CalledFunc->isDeclaration () &&
2595
+ " CanInlineCallSite should have verified direct call to definition" );
2596
+
2598
2597
// Determine if we are dealing with a call in an EHPad which does not unwind
2599
2598
// to caller.
2600
2599
bool EHPadForCallUnwindsLocally = false ;
2601
- if (CallSiteEHPad && isa<CallInst>(CB)) {
2600
+ if (IFI. CallSiteEHPad && isa<CallInst>(CB)) {
2602
2601
UnwindDestMemoTy FuncletUnwindMap;
2603
2602
Value *CallSiteUnwindDestToken =
2604
- getUnwindDestToken (CallSiteEHPad, FuncletUnwindMap);
2603
+ getUnwindDestToken (IFI. CallSiteEHPad , FuncletUnwindMap);
2605
2604
2606
2605
EHPadForCallUnwindsLocally =
2607
2606
CallSiteUnwindDestToken &&
@@ -2618,6 +2617,30 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2618
2617
ClonedCodeInfo InlinedFunctionInfo;
2619
2618
Function::iterator FirstNewBlock;
2620
2619
2620
+ // GC poses two hazards to inlining, which only occur when the callee has GC:
2621
+ // 1. If the caller has no GC, then the callee's GC must be propagated to the
2622
+ // caller.
2623
+ // 2. If the caller has a differing GC, it is invalid to inline.
2624
+ if (CalledFunc->hasGC ()) {
2625
+ if (!Caller->hasGC ())
2626
+ Caller->setGC (CalledFunc->getGC ());
2627
+ else {
2628
+ assert (CalledFunc->getGC () == Caller->getGC () &&
2629
+ " CanInlineCallSite should have verified compatible GCs" );
2630
+ }
2631
+ }
2632
+
2633
+ if (CalledFunc->hasPersonalityFn ()) {
2634
+ Constant *CalledPersonality =
2635
+ CalledFunc->getPersonalityFn ()->stripPointerCasts ();
2636
+ if (!Caller->hasPersonalityFn ()) {
2637
+ Caller->setPersonalityFn (CalledPersonality);
2638
+ } else
2639
+ assert (Caller->getPersonalityFn ()->stripPointerCasts () ==
2640
+ CalledPersonality &&
2641
+ " CanInlineCallSite should have verified compatible personality" );
2642
+ }
2643
+
2621
2644
{ // Scope to destroy VMap after cloning.
2622
2645
ValueToValueMapTy VMap;
2623
2646
struct ByValInit {
@@ -2802,10 +2825,10 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2802
2825
IFI.GetAssumptionCache (*Caller).registerAssumption (II);
2803
2826
}
2804
2827
2805
- if (ConvergenceControlToken) {
2828
+ if (IFI. ConvergenceControlToken ) {
2806
2829
IntrinsicInst *IntrinsicCall = getConvergenceEntry (*FirstNewBlock);
2807
2830
if (IntrinsicCall) {
2808
- IntrinsicCall->replaceAllUsesWith (ConvergenceControlToken);
2831
+ IntrinsicCall->replaceAllUsesWith (IFI. ConvergenceControlToken );
2809
2832
IntrinsicCall->eraseFromParent ();
2810
2833
}
2811
2834
}
@@ -2852,6 +2875,10 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
2852
2875
}
2853
2876
}
2854
2877
2878
+ // If the call to the callee cannot throw, set the 'nounwind' flag on any
2879
+ // calls that we inline.
2880
+ bool MarkNoUnwind = CB.doesNotThrow ();
2881
+
2855
2882
SmallVector<Value*,4 > VarArgsToForward;
2856
2883
SmallVector<AttributeSet, 4 > VarArgsAttrs;
2857
2884
for (unsigned i = CalledFunc->getFunctionType ()->getNumParams ();
@@ -3038,12 +3065,12 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
3038
3065
// Update the lexical scopes of the new funclets and callsites.
3039
3066
// Anything that had 'none' as its parent is now nested inside the callsite's
3040
3067
// EHPad.
3041
- if (CallSiteEHPad) {
3068
+ if (IFI. CallSiteEHPad ) {
3042
3069
for (Function::iterator BB = FirstNewBlock->getIterator (),
3043
3070
E = Caller->end ();
3044
3071
BB != E; ++BB) {
3045
3072
// Add bundle operands to inlined call sites.
3046
- PropagateOperandBundles (BB, CallSiteEHPad);
3073
+ PropagateOperandBundles (BB, IFI. CallSiteEHPad );
3047
3074
3048
3075
// It is problematic if the inlinee has a cleanupret which unwinds to
3049
3076
// caller and we inline it into a call site which doesn't unwind but into
@@ -3059,11 +3086,11 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
3059
3086
3060
3087
if (auto *CatchSwitch = dyn_cast<CatchSwitchInst>(I)) {
3061
3088
if (isa<ConstantTokenNone>(CatchSwitch->getParentPad ()))
3062
- CatchSwitch->setParentPad (CallSiteEHPad);
3089
+ CatchSwitch->setParentPad (IFI. CallSiteEHPad );
3063
3090
} else {
3064
3091
auto *FPI = cast<FuncletPadInst>(I);
3065
3092
if (isa<ConstantTokenNone>(FPI->getParentPad ()))
3066
- FPI->setParentPad (CallSiteEHPad);
3093
+ FPI->setParentPad (IFI. CallSiteEHPad );
3067
3094
}
3068
3095
}
3069
3096
}
@@ -3219,7 +3246,7 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
3219
3246
AttributeFuncs::mergeAttributesForInlining (*Caller, *CalledFunc);
3220
3247
3221
3248
// We are now done with the inlining.
3222
- return InlineResult::success () ;
3249
+ return ;
3223
3250
}
3224
3251
3225
3252
// Otherwise, we have the normal case, of more than one block to inline or
@@ -3379,6 +3406,18 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
3379
3406
3380
3407
if (MergeAttributes)
3381
3408
AttributeFuncs::mergeAttributesForInlining (*Caller, *CalledFunc);
3409
+ }
3382
3410
3383
- return InlineResult::success ();
3411
+ llvm::InlineResult llvm::InlineFunction (CallBase &CB, InlineFunctionInfo &IFI,
3412
+ bool MergeAttributes,
3413
+ AAResults *CalleeAAR,
3414
+ bool InsertLifetime,
3415
+ Function *ForwardVarArgsTo) {
3416
+ llvm::InlineResult Result = CanInlineCallSite (CB, IFI);
3417
+ if (Result.isSuccess ()) {
3418
+ InlineFunctionImpl (CB, IFI, MergeAttributes, CalleeAAR, InsertLifetime,
3419
+ ForwardVarArgsTo);
3420
+ }
3421
+
3422
+ return Result;
3384
3423
}
0 commit comments