diff --git a/llvm/include/llvm/Analysis/IRSimilarityIdentifier.h b/llvm/include/llvm/Analysis/IRSimilarityIdentifier.h index ffad1e0bd693a..27fd6c2aa5519 100644 --- a/llvm/include/llvm/Analysis/IRSimilarityIdentifier.h +++ b/llvm/include/llvm/Analysis/IRSimilarityIdentifier.h @@ -560,18 +560,6 @@ struct IRInstructionMapper { return Illegal; if (!F && !IsIndirectCall) return Illegal; - // Functions marked with the swifttailcc and tailcc calling conventions - // require special handling when outlining musttail functions. The - // calling convention must be passed down to the outlined function as - // well. Further, there is special handling for musttail calls as well, - // requiring a return call directly after. For now, the outliner does not - // support this, so we do not handle matching this case either. - if ((CI.getCallingConv() == CallingConv::SwiftTail || - CI.getCallingConv() == CallingConv::Tail) && - !EnableMustTailCalls) - return Illegal; - if (CI.isMustTailCall() && !EnableMustTailCalls) - return Illegal; return Legal; } // TODO: We do not current handle similarity that changes the control flow. @@ -593,10 +581,6 @@ struct IRInstructionMapper { // Flag that lets the classifier know whether we should allow intrinsics to // be checked for similarity. bool EnableIntrinsics = false; - - // Flag that lets the classifier know whether we should allow tail calls to - // be checked for similarity. - bool EnableMustTailCalls = false; }; /// Maps an Instruction to a member of InstrType. @@ -984,13 +968,11 @@ class IRSimilarityIdentifier { IRSimilarityIdentifier(bool MatchBranches = true, bool MatchIndirectCalls = true, bool MatchCallsWithName = false, - bool MatchIntrinsics = true, - bool MatchMustTailCalls = true) + bool MatchIntrinsics = true) : Mapper(&InstDataAllocator, &InstDataListAllocator), EnableBranches(MatchBranches), EnableIndirectCalls(MatchIndirectCalls), EnableMatchingCallsByName(MatchCallsWithName), - EnableIntrinsics(MatchIntrinsics), - EnableMustTailCalls(MatchMustTailCalls) {} + EnableIntrinsics(MatchIntrinsics) {} private: /// Map the instructions in the module to unsigned integers, using mapping @@ -1083,10 +1065,6 @@ class IRSimilarityIdentifier { /// similarity. bool EnableIntrinsics = true; - // The flag variable that marks whether we should allow tailcalls - // to be checked for similarity. - bool EnableMustTailCalls = false; - /// The SimilarityGroups found with the most recent run of \ref /// findSimilarity. None if there is no recent run. Optional SimilarityCandidates; diff --git a/llvm/include/llvm/Transforms/IPO/IROutliner.h b/llvm/include/llvm/Transforms/IPO/IROutliner.h index 283c98cbbdc3a..e4807a1c9c65e 100644 --- a/llvm/include/llvm/Transforms/IPO/IROutliner.h +++ b/llvm/include/llvm/Transforms/IPO/IROutliner.h @@ -51,7 +51,6 @@ struct OutlinableGroup; namespace llvm { -using namespace CallingConv; using namespace IRSimilarity; class Module; @@ -373,25 +372,6 @@ class IROutliner { // the call in outlined functions. if (CI.canReturnTwice()) return false; - // TODO: Update the outliner to capture whether the outlined function - // needs these extra attributes. - - // Functions marked with the swifttailcc and tailcc calling conventions - // require special handling when outlining musttail functions. The - // calling convention must be passed down to the outlined function as - // well. Further, there is special handling for musttail calls as well, - // requiring a return call directly after. For now, the outliner does not - // support this. - bool IsTailCC = CI.getCallingConv() == CallingConv::SwiftTail || - CI.getCallingConv() == CallingConv::Tail; - if (IsTailCC && !EnableMustTailCalls) - return false; - if (CI.isMustTailCall() && !EnableMustTailCalls) - return false; - // The outliner can only handle musttail items if it is also accompanied - // by the tailcc or swifttailcc calling convention. - if (CI.isMustTailCall() && !IsTailCC) - return false; return true; } // TODO: Handle FreezeInsts. Since a frozen value could be frozen inside @@ -417,9 +397,6 @@ class IROutliner { // The flag variable that marks whether we should allow intrinsics // instructions to be outlined. bool EnableIntrinsics = false; - - // The flag variable that marks whether we should allow musttail calls. - bool EnableMustTailCalls = false; }; /// A InstVisitor used to exclude certain instructions from being outlined. diff --git a/llvm/lib/Analysis/IRSimilarityIdentifier.cpp b/llvm/lib/Analysis/IRSimilarityIdentifier.cpp index fea50c43d85bb..92a8e7422e19d 100644 --- a/llvm/lib/Analysis/IRSimilarityIdentifier.cpp +++ b/llvm/lib/Analysis/IRSimilarityIdentifier.cpp @@ -1163,7 +1163,6 @@ SimilarityGroupList &IRSimilarityIdentifier::findSimilarity( Mapper.InstClassifier.EnableIndirectCalls = EnableIndirectCalls; Mapper.EnableMatchCallsByName = EnableMatchingCallsByName; Mapper.InstClassifier.EnableIntrinsics = EnableIntrinsics; - Mapper.InstClassifier.EnableMustTailCalls = EnableMustTailCalls; populateMapper(Modules, InstrList, IntegerMapping); findCandidates(InstrList, IntegerMapping); @@ -1177,7 +1176,6 @@ SimilarityGroupList &IRSimilarityIdentifier::findSimilarity(Module &M) { Mapper.InstClassifier.EnableIndirectCalls = EnableIndirectCalls; Mapper.EnableMatchCallsByName = EnableMatchingCallsByName; Mapper.InstClassifier.EnableIntrinsics = EnableIntrinsics; - Mapper.InstClassifier.EnableMustTailCalls = EnableMustTailCalls; std::vector InstrList; std::vector IntegerMapping; @@ -1199,8 +1197,7 @@ IRSimilarityIdentifierWrapperPass::IRSimilarityIdentifierWrapperPass() bool IRSimilarityIdentifierWrapperPass::doInitialization(Module &M) { IRSI.reset(new IRSimilarityIdentifier(!DisableBranches, !DisableIndirectCalls, - MatchCallsByName, !DisableIntrinsics, - false)); + MatchCallsByName, !DisableIntrinsics)); return false; } @@ -1218,8 +1215,7 @@ AnalysisKey IRSimilarityAnalysis::Key; IRSimilarityIdentifier IRSimilarityAnalysis::run(Module &M, ModuleAnalysisManager &) { auto IRSI = IRSimilarityIdentifier(!DisableBranches, !DisableIndirectCalls, - MatchCallsByName, !DisableIntrinsics, - false); + MatchCallsByName, !DisableIntrinsics); IRSI.findSimilarity(M); return IRSI; } diff --git a/llvm/test/Transforms/IROutliner/outlining-musttail.ll b/llvm/test/Transforms/IROutliner/outlining-musttail.ll deleted file mode 100644 index 2adb67643b486..0000000000000 --- a/llvm/test/Transforms/IROutliner/outlining-musttail.ll +++ /dev/null @@ -1,34 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs -; RUN: opt -S -verify -iroutliner -ir-outlining-no-cost < %s | FileCheck %s - -; Check that we do not outline musttail when swifttaill cc or tailcc -; is not present. - -declare void @musttail() - -define void @f1() { - %a = alloca i32, align 4 - store i32 2, i32* %a, align 4 - musttail call void @musttail() - ret void -} - -define void @f2() { - %a = alloca i32, align 4 - store i32 2, i32* %a, align 4 - musttail call void @musttail() - ret void -} -; CHECK-LABEL: @f1( -; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 -; CHECK-NEXT: store i32 2, i32* [[A]], align 4 -; CHECK-NEXT: musttail call void @musttail() -; CHECK-NEXT: ret void -; -; -; CHECK-LABEL: @f2( -; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 -; CHECK-NEXT: store i32 2, i32* [[A]], align 4 -; CHECK-NEXT: musttail call void @musttail() -; CHECK-NEXT: ret void -; diff --git a/llvm/test/Transforms/IROutliner/outlining-swifttailcc.ll b/llvm/test/Transforms/IROutliner/outlining-swifttailcc.ll deleted file mode 100644 index ec30caa2ac0c8..0000000000000 --- a/llvm/test/Transforms/IROutliner/outlining-swifttailcc.ll +++ /dev/null @@ -1,33 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs -; RUN: opt -S -verify -iroutliner -ir-outlining-no-cost < %s | FileCheck %s - -; Check that we do not outline musttail calls when swifttailcc is present. - -declare swifttailcc void @musttail() - -define swifttailcc void @f1() { - %a = alloca i32, align 4 - store i32 2, i32* %a, align 4 - musttail call swifttailcc void @musttail() - ret void -} - -define swifttailcc void @f2() { - %a = alloca i32, align 4 - store i32 2, i32* %a, align 4 - musttail call swifttailcc void @musttail() - ret void -} -; CHECK-LABEL: @f1( -; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 -; CHECK-NEXT: store i32 2, i32* [[A]], align 4 -; CHECK-NEXT: musttail call swifttailcc void @musttail() -; CHECK-NEXT: ret void -; -; -; CHECK-LABEL: @f2( -; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 -; CHECK-NEXT: store i32 2, i32* [[A]], align 4 -; CHECK-NEXT: musttail call swifttailcc void @musttail() -; CHECK-NEXT: ret void -; diff --git a/llvm/test/Transforms/IROutliner/outlining-tailcc.ll b/llvm/test/Transforms/IROutliner/outlining-tailcc.ll deleted file mode 100644 index 33c9c4f5ccd17..0000000000000 --- a/llvm/test/Transforms/IROutliner/outlining-tailcc.ll +++ /dev/null @@ -1,33 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs -; RUN: opt -S -verify -iroutliner -ir-outlining-no-cost < %s | FileCheck %s - -; Check that we not do outline musttail calls when tailcc is present. - -declare tailcc void @musttail() - -define tailcc void @f1() { - %a = alloca i32, align 4 - store i32 2, i32* %a, align 4 - musttail call tailcc void @musttail() - ret void -} - -define tailcc void @f2() { - %a = alloca i32, align 4 - store i32 2, i32* %a, align 4 - musttail call tailcc void @musttail() - ret void -} -; CHECK-LABEL: @f1( -; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 -; CHECK-NEXT: store i32 2, i32* [[A]], align 4 -; CHECK-NEXT: musttail call tailcc void @musttail() -; CHECK-NEXT: ret void -; -; -; CHECK-LABEL: @f2( -; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 -; CHECK-NEXT: store i32 2, i32* [[A]], align 4 -; CHECK-NEXT: musttail call tailcc void @musttail() -; CHECK-NEXT: ret void -;