[llvm] 38e8880 - [IROutliner] Do not outlined from functions with optnone
Andrew Litteken via llvm-commits
llvm-commits at lists.llvm.org
Sun Mar 20 21:39:37 PDT 2022
Author: Andrew Litteken
Date: 2022-03-20T23:39:23-05:00
New Revision: 38e8880e931293dab8e90cac731e4bda2306836d
URL: https://github.com/llvm/llvm-project/commit/38e8880e931293dab8e90cac731e4bda2306836d
DIFF: https://github.com/llvm/llvm-project/commit/38e8880e931293dab8e90cac731e4bda2306836d.diff
LOG: [IROutliner] Do not outlined from functions with optnone
Since the IROutliner is performing an optimization, it should not outline from functions explicitly marked with optnone. This adds an extra check and test to make sure this does not occur.
Reviewers: paquette
Differential Revision: https://reviews.llvm.org/D121567
Added:
llvm/test/Transforms/IROutliner/no-outlining-optnone.ll
Modified:
llvm/lib/Transforms/IPO/IROutliner.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/IPO/IROutliner.cpp b/llvm/lib/Transforms/IPO/IROutliner.cpp
index d11fefcdefc80..258a7c7843361 100644
--- a/llvm/lib/Transforms/IPO/IROutliner.cpp
+++ b/llvm/lib/Transforms/IPO/IROutliner.cpp
@@ -2363,6 +2363,9 @@ void IROutliner::pruneIncompatibleRegions(
if (BBHasAddressTaken)
continue;
+ if (IRSC.getFunction()->hasOptNone())
+ continue;
+
if (IRSC.front()->Inst->getFunction()->hasLinkOnceODRLinkage() &&
!OutlineFromLinkODRs)
continue;
diff --git a/llvm/test/Transforms/IROutliner/no-outlining-optnone.ll b/llvm/test/Transforms/IROutliner/no-outlining-optnone.ll
new file mode 100644
index 0000000000000..728a6ec28ab12
--- /dev/null
+++ b/llvm/test/Transforms/IROutliner/no-outlining-optnone.ll
@@ -0,0 +1,61 @@
+; 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
+
+; Ensure that a function is not outlined if a function has the optnone
+; attribute.
+
+define void @outline_constants1() optnone noinline {
+entry:
+ %a = alloca i32, align 4
+ %b = alloca i32, align 4
+ %c = alloca i32, align 4
+ store i32 3, i32* %a, align 4
+ store i32 4, i32* %b, align 4
+ store i32 5, i32* %c, align 4
+ %al = load i32, i32* %a
+ %bl = load i32, i32* %b
+ %cl = load i32, i32* %c
+ ret void
+}
+
+define void @outline_constants2() optnone noinline {
+entry:
+ %a = alloca i32, align 4
+ %b = alloca i32, align 4
+ %c = alloca i32, align 4
+ store i32 2, i32* %a, align 4
+ store i32 3, i32* %b, align 4
+ store i32 4, i32* %c, align 4
+ %al = load i32, i32* %a
+ %bl = load i32, i32* %b
+ %cl = load i32, i32* %c
+ ret void
+}
+
+; CHECK-LABEL: @outline_constants1(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
+; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4
+; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4
+; CHECK-NEXT: store i32 3, i32* [[A]], align 4
+; CHECK-NEXT: store i32 4, i32* [[B]], align 4
+; CHECK-NEXT: store i32 5, i32* [[C]], align 4
+; CHECK-NEXT: [[AL:%.*]] = load i32, i32* [[A]], align 4
+; CHECK-NEXT: [[BL:%.*]] = load i32, i32* [[B]], align 4
+; CHECK-NEXT: [[CL:%.*]] = load i32, i32* [[C]], align 4
+; CHECK-NEXT: ret void
+;
+;
+; CHECK-LABEL: @outline_constants2(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
+; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4
+; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4
+; CHECK-NEXT: store i32 2, i32* [[A]], align 4
+; CHECK-NEXT: store i32 3, i32* [[B]], align 4
+; CHECK-NEXT: store i32 4, i32* [[C]], align 4
+; CHECK-NEXT: [[AL:%.*]] = load i32, i32* [[A]], align 4
+; CHECK-NEXT: [[BL:%.*]] = load i32, i32* [[B]], align 4
+; CHECK-NEXT: [[CL:%.*]] = load i32, i32* [[C]], align 4
+; CHECK-NEXT: ret void
+;
More information about the llvm-commits
mailing list