summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Litteken <andrew.litteken@gmail.com>2022-03-02 22:50:40 -0600
committerAndrew Litteken <andrew.litteken@gmail.com>2022-03-09 10:43:48 -0800
commit0b3a6c8d20d1402f68ac2554a1e6909af19b52fd (patch)
tree5f0088f153f7d514e681620d67350abd3e20d697
parentc31f0a00503a36bc6fa6c27b94369ded6c37ba59 (diff)
[IROutliner] Handling outlined code with no exit paths
As a result of adding multiblock outlining, it became possible to outline the entirety of basic block, and branches that only pointed to the basic blocks contained in the outlined section. This means that there are no exit paths, and no return statement. There was a previous assertion from the older version of the outliner that explicitly made sure there was a return statement. This removes that assertion. Reviewers: paquette Differential Revision: https://reviews.llvm.org/D120868
-rw-r--r--llvm/lib/Transforms/IPO/IROutliner.cpp2
-rw-r--r--llvm/test/Transforms/IROutliner/outlining-no-return-functions.ll55
2 files changed, 55 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/IPO/IROutliner.cpp b/llvm/lib/Transforms/IPO/IROutliner.cpp
index 142ce10449f3..c355048df449 100644
--- a/llvm/lib/Transforms/IPO/IROutliner.cpp
+++ b/llvm/lib/Transforms/IPO/IROutliner.cpp
@@ -691,8 +691,6 @@ static void moveFunctionData(Function &Old, Function &New,
for (Instruction *I : DebugInsts)
I->eraseFromParent();
}
-
- assert(NewEnds.size() > 0 && "No return instruction for new function?");
}
/// Find the the constants that will need to be lifted into arguments
diff --git a/llvm/test/Transforms/IROutliner/outlining-no-return-functions.ll b/llvm/test/Transforms/IROutliner/outlining-no-return-functions.ll
new file mode 100644
index 000000000000..1a7af015c0f8
--- /dev/null
+++ b/llvm/test/Transforms/IROutliner/outlining-no-return-functions.ll
@@ -0,0 +1,55 @@
+; 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
+
+; Make sure that we outline safely from functions with no return instructions.
+
+; The code extractor will insert return instructions in the outer function
+; due to assumptions about the contents of the outlined region.
+
+define void @f1() {
+bb:
+ br label %bb1
+bb1:
+ br label %bb1
+}
+
+define void @f2() {
+bb:
+ br label %bb1
+bb1:
+ br label %bb1
+}
+
+define void @f3() {
+bb:
+ br label %bb1
+bb1:
+ br label %bb1
+}
+; CHECK-LABEL: @f1(
+; CHECK-NEXT: bb:
+; CHECK-NEXT: br label [[BB1:%.*]]
+; CHECK: bb1:
+; CHECK-NEXT: br label [[BB1]]
+;
+;
+; CHECK-LABEL: @f2(
+; CHECK-NEXT: bb:
+; CHECK-NEXT: call void @outlined_ir_func_0()
+; CHECK-NEXT: ret void
+;
+;
+; CHECK-LABEL: @f3(
+; CHECK-NEXT: bb:
+; CHECK-NEXT: call void @outlined_ir_func_0()
+; CHECK-NEXT: ret void
+;
+;
+; CHECK-LABEL: define internal void @outlined_ir_func_0(
+; CHECK-NEXT: newFuncRoot:
+; CHECK-NEXT: br label [[BB_TO_OUTLINE:%.*]]
+; CHECK: bb_to_outline:
+; CHECK-NEXT: br label [[BB1:%.*]]
+; CHECK: bb1:
+; CHECK-NEXT: br label [[BB1]]
+;