[Inline][X86] Avoid inlining if it would create ABI-incompatible call… · llvm/llvm-project@7c3cf4c (original) (raw)

`@@ -43,6 +43,7 @@

`

43

43

`#include "llvm/CodeGen/BasicTTIImpl.h"

`

44

44

`#include "llvm/CodeGen/CostTable.h"

`

45

45

`#include "llvm/CodeGen/TargetLowering.h"

`

``

46

`+

#include "llvm/IR/InstIterator.h"

`

46

47

`#include "llvm/IR/IntrinsicInst.h"

`

47

48

`#include "llvm/Support/Debug.h"

`

48

49

``

`@@ -5187,9 +5188,48 @@ bool X86TTIImpl::areInlineCompatible(const Function *Caller,

`

5187

5188

`const FeatureBitset &CalleeBits =

`

5188

5189

` TM.getSubtargetImpl(*Callee)->getFeatureBits();

`

5189

5190

``

``

5191

`+

// Check whether features are the same (apart from the ignore list).

`

5190

5192

` FeatureBitset RealCallerBits = CallerBits & ~InlineFeatureIgnoreList;

`

5191

5193

` FeatureBitset RealCalleeBits = CalleeBits & ~InlineFeatureIgnoreList;

`

5192

``

`-

return (RealCallerBits & RealCalleeBits) == RealCalleeBits;

`

``

5194

`+

if (RealCallerBits == RealCalleeBits)

`

``

5195

`+

return true;

`

``

5196

+

``

5197

`+

// If the features are a subset, we need to additionally check for calls

`

``

5198

`+

// that may become ABI-incompatible as a result of inlining.

`

``

5199

`+

if ((RealCallerBits & RealCalleeBits) != RealCalleeBits)

`

``

5200

`+

return false;

`

``

5201

+

``

5202

`+

for (const Instruction &I : instructions(Callee)) {

`

``

5203

`+

if (const auto *CB = dyn_cast(&I)) {

`

``

5204

`+

SmallVector<Type *, 8> Types;

`

``

5205

`+

for (Value *Arg : CB->args())

`

``

5206

`+

Types.push_back(Arg->getType());

`

``

5207

`+

if (!CB->getType()->isVoidTy())

`

``

5208

`+

Types.push_back(CB->getType());

`

``

5209

+

``

5210

`+

// Simple types are always ABI compatible.

`

``

5211

`+

auto IsSimpleTy = [](Type *Ty) {

`

``

5212

`+

return !Ty->isVectorTy() && !Ty->isAggregateType();

`

``

5213

`+

};

`

``

5214

`+

if (all_of(Types, IsSimpleTy))

`

``

5215

`+

continue;

`

``

5216

+

``

5217

`+

if (Function *NestedCallee = CB->getCalledFunction()) {

`

``

5218

`+

// Assume that intrinsics are always ABI compatible.

`

``

5219

`+

if (NestedCallee->isIntrinsic())

`

``

5220

`+

continue;

`

``

5221

+

``

5222

`+

// Do a precise compatibility check.

`

``

5223

`+

if (!areTypesABICompatible(Caller, NestedCallee, Types))

`

``

5224

`+

return false;

`

``

5225

`+

} else {

`

``

5226

`+

// We don't know the target features of the callee,

`

``

5227

`+

// assume it is incompatible.

`

``

5228

`+

return false;

`

``

5229

`+

}

`

``

5230

`+

}

`

``

5231

`+

}

`

``

5232

`+

return true;

`

5193

5233

`}

`

5194

5234

``

5195

5235

`bool X86TTIImpl::areTypesABICompatible(const Function *Caller,

`