[PATCH] D120868: [IROutliner] handle functions that do not contain an exit path

Andrew Litteken via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 2 22:08:12 PST 2022


AndrewLitteken created this revision.
AndrewLitteken added a reviewer: paquette.
Herald added subscribers: ormris, hiraditya.
Herald added a project: All.
AndrewLitteken requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

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.

It does not break any of the tests for the outliner. I will test it on the test suite to make sure.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D120868

Files:
  llvm/lib/Transforms/IPO/IROutliner.cpp
  llvm/test/Transforms/IROutliner/outlining-no-return-functions.ll


Index: llvm/test/Transforms/IROutliner/outlining-no-return-functions.ll
===================================================================
--- /dev/null
+++ 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]]
+;
Index: llvm/lib/Transforms/IPO/IROutliner.cpp
===================================================================
--- llvm/lib/Transforms/IPO/IROutliner.cpp
+++ llvm/lib/Transforms/IPO/IROutliner.cpp
@@ -691,8 +691,6 @@
     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


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D120868.412603.patch
Type: text/x-patch
Size: 1968 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220303/afd87845/attachment.bin>


More information about the llvm-commits mailing list