| commit 9afb1c566e8cb396da495e2fbbbc53e1814cc3a1 |
| Author: Vedant Kumar <vsk@apple.com> |
| Date: Mon Oct 5 13:41:12 2020 -0700 |
| |
| Revert "Outline non returning functions unless a longjmp" |
| |
| This reverts commit 20797989ea190f2ef22d13c5a7a0535fe9afa58b. |
| |
| This patch (https://reviews.llvm.org/D69257) cannot complete a stage2 |
| build due to the change: |
| |
| ``` |
| CI->getCalledFunction()->getName().contains("longjmp") |
| ``` |
| |
| There are several concrete issues here: |
| |
| - The callee may not be a function, so `getCalledFunction` can assert. |
| - The called value may not have a name, so `getName` can assert. |
| - There's no distinction made between "my_longjmp_test_helper" and the |
| actual longjmp libcall. |
| |
| At a higher level, there's a serious layering problem here. The |
| splitting pass makes policy decisions in a general way (e.g. based on |
| attributes or profile data). Special-casing certain names breaks the |
| layering. It subverts the work of library maintainers (who may now need |
| to opt-out of unexpected optimization behavior for any affected |
| functions) and can lead to inconsistent optimization behavior (as not |
| all llvm passes special-case ".*longjmp.*" in the same way). |
| |
| The patch may need significant revision to address these issues. |
| |
| But the immediate issue is that this crashes while compiling llvm's unit |
| tests in a stage2 build (due to the `getName` problem). |
| |
| diff --git a/llvm/lib/Transforms/IPO/HotColdSplitting.cpp b/llvm/lib/Transforms/IPO/HotColdSplitting.cpp |
| index ad7df060737..2460099fba4 100644 |
| --- a/llvm/lib/Transforms/IPO/HotColdSplitting.cpp |
| +++ b/llvm/lib/Transforms/IPO/HotColdSplitting.cpp |
| @@ -113,8 +113,7 @@ bool blockEndsInUnreachable(const BasicBlock &BB) { |
| return !(isa<ReturnInst>(I) || isa<IndirectBrInst>(I)); |
| } |
| |
| -bool unlikelyExecuted(BasicBlock &BB, ProfileSummaryInfo *PSI, |
| - BlockFrequencyInfo *BFI) { |
| +bool unlikelyExecuted(BasicBlock &BB) { |
| // Exception handling blocks are unlikely executed. |
| if (BB.isEHPad() || isa<ResumeInst>(BB.getTerminator())) |
| return true; |
| @@ -127,19 +126,12 @@ bool unlikelyExecuted(BasicBlock &BB, ProfileSummaryInfo *PSI, |
| return true; |
| |
| // The block is cold if it has an unreachable terminator, unless it's |
| - // preceded by a call to a (possibly warm) noreturn call (e.g. longjmp); |
| - // in the case of a longjmp, if the block is cold according to |
| - // profile information, we mark it as unlikely to be executed as well. |
| + // preceded by a call to a (possibly warm) noreturn call (e.g. longjmp). |
| if (blockEndsInUnreachable(BB)) { |
| if (auto *CI = |
| dyn_cast_or_null<CallInst>(BB.getTerminator()->getPrevNode())) |
| - if (CI->hasFnAttr(Attribute::NoReturn)) { |
| - if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI)) |
| - return (II->getIntrinsicID() != Intrinsic::eh_sjlj_longjmp) || |
| - (BFI && PSI->isColdBlock(&BB, BFI)); |
| - return !CI->getCalledFunction()->getName().contains("longjmp") || |
| - (BFI && PSI->isColdBlock(&BB, BFI)); |
| - } |
| + if (CI->hasFnAttr(Attribute::NoReturn)) |
| + return false; |
| return true; |
| } |
| |
| @@ -599,7 +591,7 @@ bool HotColdSplitting::outlineColdRegions(Function &F, bool HasProfileSummary) { |
| continue; |
| |
| bool Cold = (BFI && PSI->isColdBlock(BB, BFI)) || |
| - (EnableStaticAnalysis && unlikelyExecuted(*BB, PSI, BFI)); |
| + (EnableStaticAnalysis && unlikelyExecuted(*BB)); |
| if (!Cold) |
| continue; |
| |
| diff --git a/llvm/test/Transforms/HotColdSplit/longjmp-nosplit.ll b/llvm/test/Transforms/HotColdSplit/longjmp-nosplit.ll |
| deleted file mode 100644 |
| index d207e8dae38..00000000000 |
| --- a/llvm/test/Transforms/HotColdSplit/longjmp-nosplit.ll |
| +++ /dev/null |
| @@ -1,97 +0,0 @@ |
| -; RUN: opt -hotcoldsplit -S < %s | FileCheck %s |
| -target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" |
| -target triple = "x86_64-unknown-linux-gnu" |
| - |
| -%struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } |
| -%struct.__sigset_t = type { [16 x i64] } |
| - |
| -@c = dso_local global i32 1, align 4 |
| -@buf = dso_local global [20 x i8*] zeroinitializer, align 16 |
| - |
| -; CHECK-LABEL: @f |
| -; CHECK-NOT: f.cold.1 |
| -define dso_local void @f() #0 { |
| -entry: |
| - %i = alloca i32, align 4 |
| - %j = alloca i32, align 4 |
| - %k = alloca i32, align 4 |
| - %0 = load i32, i32* @c, align 4 |
| - %tobool = icmp ne i32 %0, 0 |
| - br i1 %tobool, label %if.then, label %if.else |
| - |
| -if.then: ; preds = %entry |
| - ret void |
| - |
| -if.else: ; preds = %entry |
| - %1 = load i32, i32* @c, align 4 |
| - %inc = add i32 %1, 1 |
| - store i32 %inc, i32* @c, align 4 |
| - %2 = load i32, i32* @c, align 4 |
| - %inc1 = add i32 %2, 1 |
| - store i32 %inc1, i32* @c, align 4 |
| - %3 = load i32, i32* @c, align 4 |
| - %inc2 = add i32 %3, 1 |
| - store i32 %inc2, i32* @c, align 4 |
| - %4 = load i32, i32* @c, align 4 |
| - %inc3 = add i32 %4, 1 |
| - store i32 %inc3, i32* @c, align 4 |
| - %5 = load i32, i32* @c, align 4 |
| - %dec = add i32 %5, -1 |
| - store i32 %dec, i32* @c, align 4 |
| - %6 = load i32, i32* @c, align 4 |
| - %dec4 = add i32 %6, -1 |
| - store i32 %dec4, i32* @c, align 4 |
| - %7 = load i32, i32* @c, align 4 |
| - %inc5 = add i32 %7, 1 |
| - store i32 %inc5, i32* @c, align 4 |
| - %8 = load i32, i32* @c, align 4 |
| - %inc6 = add i32 %8, 1 |
| - store i32 %inc6, i32* @c, align 4 |
| - %9 = load i32, i32* @c, align 4 |
| - %add = add i32 %9, 1 |
| - store i32 %add, i32* %i, align 4 |
| - %10 = load i32, i32* %i, align 4 |
| - %sub = sub i32 %10, 1 |
| - store i32 %sub, i32* %j, align 4 |
| - %11 = load i32, i32* %i, align 4 |
| - %add7 = add i32 %11, 2 |
| - store i32 %add7, i32* %k, align 4 |
| - call void @longjmp(%struct.__jmp_buf_tag* bitcast ([20 x i8*]* @buf to %struct.__jmp_buf_tag*), i32 1) #3 |
| - unreachable |
| -} |
| - |
| -declare dso_local void @longjmp(%struct.__jmp_buf_tag*, i32) #1 |
| - |
| -; CHECK-LABEL: @main |
| -; CHECK-NOT: main.cold.1 |
| -define dso_local i32 @main() #0 { |
| -entry: |
| - %retval = alloca i32, align 4 |
| - %i = alloca i32, align 4 |
| - store i32 0, i32* %retval, align 4 |
| - store i32 0, i32* %i, align 4 |
| - %call = call i32 @_setjmp(%struct.__jmp_buf_tag* bitcast ([20 x i8*]* @buf to %struct.__jmp_buf_tag*)) #4 |
| - %tobool = icmp ne i32 %call, 0 |
| - br i1 %tobool, label %if.then, label %if.end |
| - |
| -if.then: ; preds = %entry |
| - store i32 1, i32* %retval, align 4 |
| - br label %return |
| - |
| -if.end: ; preds = %entry |
| - call void @f() |
| - store i32 0, i32* %retval, align 4 |
| - br label %return |
| - |
| -return: ; preds = %if.end, %if.then |
| - %0 = load i32, i32* %retval, align 4 |
| - ret i32 %0 |
| -} |
| - |
| -declare dso_local i32 @_setjmp(%struct.__jmp_buf_tag*) #2 |
| - |
| -attributes #0 = { nounwind uwtable } |
| -attributes #1 = { noreturn nounwind } |
| -attributes #2 = { nounwind returns_twice } |
| -attributes #3 = { noreturn nounwind } |
| -attributes #4 = { nounwind returns_twice } |
| diff --git a/llvm/test/Transforms/HotColdSplit/longjmp-split.ll b/llvm/test/Transforms/HotColdSplit/longjmp-split.ll |
| deleted file mode 100644 |
| index 905f146a79e..00000000000 |
| --- a/llvm/test/Transforms/HotColdSplit/longjmp-split.ll |
| +++ /dev/null |
| @@ -1,132 +0,0 @@ |
| -; RUN: opt -profile-summary-cold-count=0 -hotcoldsplit -S < %s | FileCheck %s |
| - |
| -target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" |
| -target triple = "x86_64-unknown-linux-gnu" |
| - |
| -%struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } |
| -%struct.__sigset_t = type { [16 x i64] } |
| - |
| -@c = dso_local global i32 1, align 4 |
| -@buf = dso_local global [20 x i8*] zeroinitializer, align 16 |
| - |
| -; CHECK-LABEL: @f |
| -; CHECK: f.cold.1 |
| -define dso_local void @f() #0 !prof !31 { |
| -entry: |
| - %i = alloca i32, align 4 |
| - %j = alloca i32, align 4 |
| - %k = alloca i32, align 4 |
| - %0 = load i32, i32* @c, align 4 |
| - %tobool = icmp ne i32 %0, 0 |
| - br i1 %tobool, label %if.then, label %if.else, !prof !32 |
| - |
| -if.then: ; preds = %entry |
| - ret void |
| - |
| -if.else: ; preds = %entry |
| - %1 = load i32, i32* @c, align 4 |
| - %inc = add i32 %1, 1 |
| - store i32 %inc, i32* @c, align 4 |
| - %2 = load i32, i32* @c, align 4 |
| - %inc1 = add i32 %2, 1 |
| - store i32 %inc1, i32* @c, align 4 |
| - %3 = load i32, i32* @c, align 4 |
| - %inc2 = add i32 %3, 1 |
| - store i32 %inc2, i32* @c, align 4 |
| - %4 = load i32, i32* @c, align 4 |
| - %inc3 = add i32 %4, 1 |
| - store i32 %inc3, i32* @c, align 4 |
| - %5 = load i32, i32* @c, align 4 |
| - %dec = add i32 %5, -1 |
| - store i32 %dec, i32* @c, align 4 |
| - %6 = load i32, i32* @c, align 4 |
| - %dec4 = add i32 %6, -1 |
| - store i32 %dec4, i32* @c, align 4 |
| - %7 = load i32, i32* @c, align 4 |
| - %inc5 = add i32 %7, 1 |
| - store i32 %inc5, i32* @c, align 4 |
| - %8 = load i32, i32* @c, align 4 |
| - %inc6 = add i32 %8, 1 |
| - store i32 %inc6, i32* @c, align 4 |
| - %9 = load i32, i32* @c, align 4 |
| - %add = add i32 %9, 1 |
| - store i32 %add, i32* %i, align 4 |
| - %10 = load i32, i32* %i, align 4 |
| - %sub = sub i32 %10, 1 |
| - store i32 %sub, i32* %j, align 4 |
| - %11 = load i32, i32* %i, align 4 |
| - %add7 = add i32 %11, 2 |
| - store i32 %add7, i32* %k, align 4 |
| - call void @longjmp(%struct.__jmp_buf_tag* bitcast ([20 x i8*]* @buf to %struct.__jmp_buf_tag*), i32 1) #3 |
| - unreachable |
| -} |
| - |
| -declare dso_local void @longjmp(%struct.__jmp_buf_tag*, i32) #1 |
| - |
| -define dso_local i32 @main() #0 !prof !31 { |
| -entry: |
| - %retval = alloca i32, align 4 |
| - %i = alloca i32, align 4 |
| - store i32 0, i32* %retval, align 4 |
| - store i32 0, i32* %i, align 4 |
| - %call = call i32 @_setjmp(%struct.__jmp_buf_tag* bitcast ([20 x i8*]* @buf to %struct.__jmp_buf_tag*)) #4 |
| - %tobool = icmp ne i32 %call, 0 |
| - br i1 %tobool, label %if.then, label %if.end, !prof !33 |
| - |
| -if.then: ; preds = %entry |
| - store i32 1, i32* %retval, align 4 |
| - br label %return |
| - |
| -if.end: ; preds = %entry |
| - call void @f() |
| - store i32 0, i32* %retval, align 4 |
| - br label %return |
| - |
| -return: ; preds = %if.end, %if.then |
| - %0 = load i32, i32* %retval, align 4 |
| - ret i32 %0 |
| -} |
| - |
| -declare dso_local i32 @_setjmp(%struct.__jmp_buf_tag*) #2 |
| - |
| -attributes #0 = { inlinehint nounwind uwtable } |
| -attributes #1 = { noreturn nounwind } |
| -attributes #2 = { nounwind returns_twice } |
| -attributes #3 = { noreturn nounwind } |
| -attributes #4 = { nounwind returns_twice } |
| - |
| -!llvm.module.flags = !{!0, !1} |
| - |
| -!0 = !{i32 1, !"wchar_size", i32 4} |
| -!1 = !{i32 1, !"ProfileSummary", !2} |
| -!2 = !{!3, !4, !5, !6, !7, !8, !9, !10, !11, !12} |
| -!3 = !{!"ProfileFormat", !"InstrProf"} |
| -!4 = !{!"TotalCount", i64 2} |
| -!5 = !{!"MaxCount", i64 1} |
| -!6 = !{!"MaxInternalCount", i64 1} |
| -!7 = !{!"MaxFunctionCount", i64 1} |
| -!8 = !{!"NumCounts", i64 4} |
| -!9 = !{!"NumFunctions", i64 2} |
| -!10 = !{!"IsPartialProfile", i64 0} |
| -!11 = !{!"PartialProfileRatio", double 0.000000e+00} |
| -!12 = !{!"DetailedSummary", !13} |
| -!13 = !{!14, !15, !16, !17, !18, !19, !20, !21, !22, !23, !24, !25, !26, !27, !28, !29} |
| -!14 = !{i32 10000, i64 0, i32 0} |
| -!15 = !{i32 100000, i64 0, i32 0} |
| -!16 = !{i32 200000, i64 0, i32 0} |
| -!17 = !{i32 300000, i64 0, i32 0} |
| -!18 = !{i32 400000, i64 0, i32 0} |
| -!19 = !{i32 500000, i64 1, i32 2} |
| -!20 = !{i32 600000, i64 1, i32 2} |
| -!21 = !{i32 700000, i64 1, i32 2} |
| -!22 = !{i32 800000, i64 1, i32 2} |
| -!23 = !{i32 900000, i64 1, i32 2} |
| -!24 = !{i32 950000, i64 1, i32 2} |
| -!25 = !{i32 990000, i64 1, i32 2} |
| -!26 = !{i32 999000, i64 1, i32 2} |
| -!27 = !{i32 999900, i64 1, i32 2} |
| -!28 = !{i32 999990, i64 1, i32 2} |
| -!29 = !{i32 999999, i64 1, i32 2} |
| -!31 = !{!"function_entry_count", i64 1} |
| -!32 = !{!"branch_weights", i32 1, i32 0} |
| -!33 = !{!"branch_weights", i32 0, i32 1} |
| diff --git a/llvm/test/Transforms/HotColdSplit/sjlj-nosplit.ll b/llvm/test/Transforms/HotColdSplit/sjlj-nosplit.ll |
| deleted file mode 100644 |
| index f02a1b376ec..00000000000 |
| --- a/llvm/test/Transforms/HotColdSplit/sjlj-nosplit.ll |
| +++ /dev/null |
| @@ -1,103 +0,0 @@ |
| -; RUN: opt -hotcoldsplit -S < %s | FileCheck %s |
| -target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" |
| -target triple = "x86_64-unknown-linux-gnu" |
| - |
| -@c = dso_local global i32 1, align 4 |
| -@buf = dso_local global [20 x i8*] zeroinitializer, align 16 |
| - |
| -; CHECK-LABEL: @f |
| -; CHECK-NOT: f.cold.1 |
| -define dso_local void @f() #0 { |
| -entry: |
| - %i = alloca i32, align 4 |
| - %j = alloca i32, align 4 |
| - %k = alloca i32, align 4 |
| - %0 = load i32, i32* @c, align 4 |
| - %tobool = icmp ne i32 %0, 0 |
| - br i1 %tobool, label %if.then, label %if.else |
| - |
| -if.then: ; preds = %entry |
| - ret void |
| - |
| -if.else: ; preds = %entry |
| - %1 = load i32, i32* @c, align 4 |
| - %inc = add nsw i32 %1, 1 |
| - store i32 %inc, i32* @c, align 4 |
| - %2 = load i32, i32* @c, align 4 |
| - %inc1 = add nsw i32 %2, 1 |
| - store i32 %inc1, i32* @c, align 4 |
| - %3 = load i32, i32* @c, align 4 |
| - %inc2 = add nsw i32 %3, 1 |
| - store i32 %inc2, i32* @c, align 4 |
| - %4 = load i32, i32* @c, align 4 |
| - %inc3 = add nsw i32 %4, 1 |
| - store i32 %inc3, i32* @c, align 4 |
| - %5 = load i32, i32* @c, align 4 |
| - %dec = add nsw i32 %5, -1 |
| - store i32 %dec, i32* @c, align 4 |
| - %6 = load i32, i32* @c, align 4 |
| - %dec4 = add nsw i32 %6, -1 |
| - store i32 %dec4, i32* @c, align 4 |
| - %7 = load i32, i32* @c, align 4 |
| - %inc5 = add nsw i32 %7, 1 |
| - store i32 %inc5, i32* @c, align 4 |
| - %8 = load i32, i32* @c, align 4 |
| - %inc6 = add nsw i32 %8, 1 |
| - store i32 %inc6, i32* @c, align 4 |
| - %9 = load i32, i32* @c, align 4 |
| - %add = add nsw i32 %9, 1 |
| - store i32 %add, i32* %i, align 4 |
| - %10 = load i32, i32* %i, align 4 |
| - %sub = sub nsw i32 %10, 1 |
| - store i32 %sub, i32* %j, align 4 |
| - %11 = load i32, i32* %i, align 4 |
| - %add7 = add nsw i32 %11, 2 |
| - store i32 %add7, i32* %k, align 4 |
| - call void @llvm.eh.sjlj.longjmp(i8* bitcast ([20 x i8*]* @buf to i8*)) |
| - unreachable |
| -} |
| - |
| -declare void @llvm.eh.sjlj.longjmp(i8*) #1 |
| - |
| -; CHECK-LABEL: @main |
| -; CHECK-NOT: main.cold.1 |
| -define dso_local i32 @main() #0 { |
| -entry: |
| - %retval = alloca i32, align 4 |
| - %i = alloca i32, align 4 |
| - store i32 0, i32* %retval, align 4 |
| - store i32 0, i32* %i, align 4 |
| - %0 = call i8* @llvm.frameaddress.p0i8(i32 0) |
| - store i8* %0, i8** getelementptr inbounds ([20 x i8*], [20 x i8*]* @buf, i64 0, i64 0), align 16 |
| - %1 = call i8* @llvm.stacksave() |
| - store i8* %1, i8** getelementptr inbounds ([20 x i8*], [20 x i8*]* @buf, i64 0, i64 2), align 16 |
| - %2 = call i32 @llvm.eh.sjlj.setjmp(i8* bitcast ([20 x i8*]* @buf to i8*)) |
| - %tobool = icmp ne i32 %2, 0 |
| - br i1 %tobool, label %if.then, label %if.end |
| - |
| -if.then: ; preds = %entry |
| - store i32 1, i32* %retval, align 4 |
| - br label %return |
| - |
| -if.end: ; preds = %entry |
| - call void @f() |
| - store i32 0, i32* %retval, align 4 |
| - br label %return |
| - |
| -return: ; preds = %if.end, %if.then |
| - %3 = load i32, i32* %retval, align 4 |
| - ret i32 %3 |
| -} |
| - |
| -declare i8* @llvm.frameaddress.p0i8(i32 immarg) #2 |
| - |
| -declare i8* @llvm.stacksave() #3 |
| - |
| -declare i32 @llvm.eh.sjlj.setjmp(i8*) #3 |
| - |
| -attributes #0 = { nounwind uwtable } |
| -attributes #1 = { noreturn nounwind } |
| -attributes #2 = { nounwind readnone } |
| -attributes #3 = { nounwind } |
| - |
| - |
| diff --git a/llvm/test/Transforms/HotColdSplit/sjlj-split.ll b/llvm/test/Transforms/HotColdSplit/sjlj-split.ll |
| deleted file mode 100644 |
| index 3a12677ecf5..00000000000 |
| --- a/llvm/test/Transforms/HotColdSplit/sjlj-split.ll |
| +++ /dev/null |
| @@ -1,136 +0,0 @@ |
| -; RUN: opt -profile-summary-cold-count=0 -hotcoldsplit -S < %s | FileCheck %s |
| -target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" |
| -target triple = "x86_64-unknown-linux-gnu" |
| - |
| -@c = dso_local global i32 1, align 4 |
| -@buf = dso_local global [20 x i8*] zeroinitializer, align 16 |
| - |
| -; CHECK-LABEL: @f |
| -; CHECK: f.cold.1 |
| -define dso_local void @f() #0 !prof !31 { |
| -entry: |
| - %i = alloca i32, align 4 |
| - %j = alloca i32, align 4 |
| - %k = alloca i32, align 4 |
| - %0 = load i32, i32* @c, align 4 |
| - %tobool = icmp ne i32 %0, 0 |
| - br i1 %tobool, label %if.then, label %if.else, !prof !32 |
| - |
| -if.then: ; preds = %entry |
| - ret void |
| - |
| -if.else: ; preds = %entry |
| - %1 = load i32, i32* @c, align 4 |
| - %inc = add i32 %1, 1 |
| - store i32 %inc, i32* @c, align 4 |
| - %2 = load i32, i32* @c, align 4 |
| - %inc1 = add i32 %2, 1 |
| - store i32 %inc1, i32* @c, align 4 |
| - %3 = load i32, i32* @c, align 4 |
| - %inc2 = add i32 %3, 1 |
| - store i32 %inc2, i32* @c, align 4 |
| - %4 = load i32, i32* @c, align 4 |
| - %inc3 = add i32 %4, 1 |
| - store i32 %inc3, i32* @c, align 4 |
| - %5 = load i32, i32* @c, align 4 |
| - %dec = add i32 %5, -1 |
| - store i32 %dec, i32* @c, align 4 |
| - %6 = load i32, i32* @c, align 4 |
| - %dec4 = add i32 %6, -1 |
| - store i32 %dec4, i32* @c, align 4 |
| - %7 = load i32, i32* @c, align 4 |
| - %inc5 = add i32 %7, 1 |
| - store i32 %inc5, i32* @c, align 4 |
| - %8 = load i32, i32* @c, align 4 |
| - %inc6 = add i32 %8, 1 |
| - store i32 %inc6, i32* @c, align 4 |
| - %9 = load i32, i32* @c, align 4 |
| - %add = add i32 %9, 1 |
| - store i32 %add, i32* %i, align 4 |
| - %10 = load i32, i32* %i, align 4 |
| - %sub = sub i32 %10, 1 |
| - store i32 %sub, i32* %j, align 4 |
| - %11 = load i32, i32* %i, align 4 |
| - %add7 = add i32 %11, 2 |
| - store i32 %add7, i32* %k, align 4 |
| - call void @llvm.eh.sjlj.longjmp(i8* bitcast ([20 x i8*]* @buf to i8*)) |
| - unreachable |
| -} |
| - |
| -declare void @llvm.eh.sjlj.longjmp(i8*) #1 |
| - |
| -define dso_local i32 @main() #0 !prof !31 { |
| -entry: |
| - %retval = alloca i32, align 4 |
| - %i = alloca i32, align 4 |
| - store i32 0, i32* %retval, align 4 |
| - store i32 0, i32* %i, align 4 |
| - %0 = call i8* @llvm.frameaddress.p0i8(i32 0) |
| - store i8* %0, i8** getelementptr inbounds ([20 x i8*], [20 x i8*]* @buf, i64 0, i64 0), align 16 |
| - %1 = call i8* @llvm.stacksave() |
| - store i8* %1, i8** getelementptr inbounds ([20 x i8*], [20 x i8*]* @buf, i64 0, i64 2), align 16 |
| - %2 = call i32 @llvm.eh.sjlj.setjmp(i8* bitcast ([20 x i8*]* @buf to i8*)) |
| - %tobool = icmp ne i32 %2, 0 |
| - br i1 %tobool, label %if.then, label %if.end, !prof !33 |
| - |
| -if.then: ; preds = %entry |
| - store i32 1, i32* %retval, align 4 |
| - br label %return |
| - |
| -if.end: ; preds = %entry |
| - call void @f() |
| - store i32 0, i32* %retval, align 4 |
| - br label %return |
| - |
| -return: ; preds = %if.end, %if.then |
| - %3 = load i32, i32* %retval, align 4 |
| - ret i32 %3 |
| -} |
| - |
| -declare i8* @llvm.frameaddress.p0i8(i32 immarg) #2 |
| - |
| -declare i8* @llvm.stacksave() #3 |
| - |
| -declare i32 @llvm.eh.sjlj.setjmp(i8*) #3 |
| - |
| -attributes #0 = { inlinehint nounwind uwtable } |
| -attributes #1 = { noreturn nounwind } |
| -attributes #2 = { nounwind readnone } |
| -attributes #3 = { nounwind } |
| - |
| -!llvm.module.flags = !{!0, !1} |
| - |
| -!0 = !{i32 1, !"wchar_size", i32 4} |
| -!1 = !{i32 1, !"ProfileSummary", !2} |
| -!2 = !{!3, !4, !5, !6, !7, !8, !9, !10, !11, !12} |
| -!3 = !{!"ProfileFormat", !"InstrProf"} |
| -!4 = !{!"TotalCount", i64 2} |
| -!5 = !{!"MaxCount", i64 1} |
| -!6 = !{!"MaxInternalCount", i64 1} |
| -!7 = !{!"MaxFunctionCount", i64 1} |
| -!8 = !{!"NumCounts", i64 4} |
| -!9 = !{!"NumFunctions", i64 2} |
| -!10 = !{!"IsPartialProfile", i64 0} |
| -!11 = !{!"PartialProfileRatio", double 0.000000e+00} |
| -!12 = !{!"DetailedSummary", !13} |
| -!13 = !{!14, !15, !16, !17, !18, !19, !20, !21, !22, !23, !24, !25, !26, !27, !28, !29} |
| -!14 = !{i32 10000, i64 0, i32 0} |
| -!15 = !{i32 100000, i64 0, i32 0} |
| -!16 = !{i32 200000, i64 0, i32 0} |
| -!17 = !{i32 300000, i64 0, i32 0} |
| -!18 = !{i32 400000, i64 0, i32 0} |
| -!19 = !{i32 500000, i64 1, i32 2} |
| -!20 = !{i32 600000, i64 1, i32 2} |
| -!21 = !{i32 700000, i64 1, i32 2} |
| -!22 = !{i32 800000, i64 1, i32 2} |
| -!23 = !{i32 900000, i64 1, i32 2} |
| -!24 = !{i32 950000, i64 1, i32 2} |
| -!25 = !{i32 990000, i64 1, i32 2} |
| -!26 = !{i32 999000, i64 1, i32 2} |
| -!27 = !{i32 999900, i64 1, i32 2} |
| -!28 = !{i32 999990, i64 1, i32 2} |
| -!29 = !{i32 999999, i64 1, i32 2} |
| -!31 = !{!"function_entry_count", i64 1} |
| -!32 = !{!"branch_weights", i32 1, i32 0} |
| -!33 = !{!"branch_weights", i32 0, i32 1} |
| - |
| diff --git a/llvm/test/Transforms/HotColdSplit/split-assert-fail.ll b/llvm/test/Transforms/HotColdSplit/split-assert-fail.ll |
| deleted file mode 100644 |
| index ea5f4b91149..00000000000 |
| --- a/llvm/test/Transforms/HotColdSplit/split-assert-fail.ll |
| +++ /dev/null |
| @@ -1,47 +0,0 @@ |
| -; REQUIRES: asserts |
| -; RUN: opt -S -instsimplify -hotcoldsplit -debug < %s 2>&1 | FileCheck %s |
| -; RUN: opt -instcombine -hotcoldsplit -instsimplify %s -o /dev/null |
| - |
| -target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" |
| -target triple = "x86_64-unknown-linux-gnu" |
| - |
| -@.str = private unnamed_addr constant [2 x i8] c"0\00", align 1 |
| -@.str.1 = private unnamed_addr constant [14 x i8] c"assert-fail.c\00", align 1 |
| -@__PRETTY_FUNCTION__.main = private unnamed_addr constant [15 x i8] c"int main(void)\00", align 1 |
| - |
| -; CHECK: @f |
| -; CHECK-LABEL: codeRepl: |
| -; CHECK } |
| -; CHECK: define {{.*}}@f.cold.1() |
| -; CHECK-LABEL: newFuncRoot: |
| -; CHECK: br label %if.then |
| - |
| -; Function Attrs: nounwind willreturn |
| -define i32 @f() #0 { |
| -entry: |
| - %retval = alloca i32, align 4 |
| - %i = alloca i32, align 4 |
| - store i32 0, i32* %retval, align 4 |
| - store i32 0, i32* %i, align 4 |
| - %0 = load i32, i32* %i, align 4 |
| - %cmp = icmp eq i32 %0, 2 |
| - br i1 %cmp, label %if.then, label %if.end |
| - |
| -if.then: ; preds = %entry |
| - call void @__assert_fail(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.1, i64 0, i64 0), i32 10, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @__PRETTY_FUNCTION__.main, i64 0, i64 0)) #1 |
| - unreachable |
| - |
| -if.end: ; preds = %entry |
| - %1 = load i32, i32* %i, align 4 |
| - %add = add nsw i32 %1, 1 |
| - store i32 %add, i32* %i, align 4 |
| - %2 = load i32, i32* %i, align 4 |
| - ret i32 %2 |
| -} |
| - |
| -; Function Attrs: noreturn nounwind |
| -declare dso_local void @__assert_fail(i8*, i8*, i32, i8*) #1 |
| - |
| -attributes #0 = { nounwind willreturn } |
| -attributes #1 = { noreturn nounwind } |
| - |