diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils/CodeExtractor.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Utils/CodeExtractor.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/CodeExtractor.cpp b/llvm/lib/Transforms/Utils/CodeExtractor.cpp index 6539f924c2ed..7ddb9e22c834 100644 --- a/llvm/lib/Transforms/Utils/CodeExtractor.cpp +++ b/llvm/lib/Transforms/Utils/CodeExtractor.cpp @@ -627,6 +627,24 @@ bool CodeExtractor::isEligible() const { return false; } } + // stacksave as input implies stackrestore in the outlined function. + // This can confuse prolog epilog insertion phase. + // stacksave's uses must not cross outlined function. + for (BasicBlock *BB : Blocks) { + for (Instruction &I : *BB) { + IntrinsicInst *II = dyn_cast<IntrinsicInst>(&I); + if (!II) + continue; + bool IsSave = II->getIntrinsicID() == Intrinsic::stacksave; + bool IsRestore = II->getIntrinsicID() == Intrinsic::stackrestore; + if (IsSave && any_of(II->users(), [&Blks = this->Blocks](User *U) { + return !definedInRegion(Blks, U); + })) + return false; + if (IsRestore && !definedInRegion(Blocks, II->getArgOperand(0))) + return false; + } + } return true; } @@ -935,6 +953,7 @@ Function *CodeExtractor::constructFunctionDeclaration( case Attribute::SanitizeMemory: case Attribute::SanitizeNumericalStability: case Attribute::SanitizeThread: + case Attribute::SanitizeType: case Attribute::SanitizeHWAddress: case Attribute::SanitizeMemTag: case Attribute::SanitizeRealtime: |
