Aiden Grossman 17b48de120 [ForceFunctionAttrs] Make options additionally work over entire module
This patch makes the -force-attribute and -force-remove-attribute flags
in the forceattrs pass additionally work over all the functions in a
module rather than on specific functions. I often
find myself dealing with bitcode from projects with arbitrary build
systems that have applied the optnone attribute for various reasons and
having the ability to do this in opt would be quite convenient. It's
possible to remove the attribute by disassembling to textual IR, running
sed, and then running opt over the result, but this option makes things
just a bit easier.

Differential Revision: https://reviews.llvm.org/D158815

Reviewed-By: nikic
2023-08-25 14:06:15 -07:00

52 lines
2.2 KiB
LLVM

; RUN: opt < %s -S -passes=forceattrs | FileCheck %s --check-prefix=CHECK-CONTROL
; RUN: opt < %s -S -passes=forceattrs -force-attribute foo:noinline | FileCheck %s --check-prefix=CHECK-FOO
; RUN: opt < %s -S -passes=forceattrs -force-remove-attribute goo:cold | FileCheck %s --check-prefix=REMOVE-COLD
; RUN: opt < %s -S -passes=forceattrs -force-remove-attribute goo:noinline | FileCheck %s --check-prefix=REMOVE-NOINLINE
; RUN: opt < %s -S -passes=forceattrs -force-attribute goo:cold -force-remove-attribute goo:noinline | FileCheck %s --check-prefix=ADD-COLD-REMOVE-NOINLINE
; RUN: opt < %s -S -passes=forceattrs -force-attribute goo:noinline -force-remove-attribute goo:noinline | FileCheck %s --check-prefix=ADD-NOINLINE-REMOVE-NOINLINE
; RUN: opt < %s -S -passes=forceattrs -force-attribute optsize | FileCheck %s --check-prefix=CHECK-ADD-ALL
; RUN: opt < %s -S -passes=forceattrs -force-remove-attribute noinline | FileCheck %s --check-prefix=CHECK-REMOVE-ALL
; CHECK-CONTROL: define void @foo() {
; CHECK-FOO: define void @foo() #0 {
define void @foo() {
ret void
}
; Ignore `cold` which does not exist before.
; REMOVE-COLD: define void @goo() #0 {
; Remove `noinline` attribute.
; REMOVE-NOINLINE: define void @goo() {
; Add `cold` and remove `noinline` leaving `cold` only.
; ADD-COLD-REMOVE-NOINLINE: define void @goo() #0 {
; `force-remove` takes precedence over `force`.
; `noinline` is removed.
; ADD-NOINLINE-REMOVE-NOINLINE: define void @goo() {
define void @goo() #0 {
ret void
}
attributes #0 = { noinline }
; CHECK-FOO: attributes #0 = { noinline }
; REMOVE-COLD: attributes #0 = { noinline }
; ADD-COLD-REMOVE-NOINLINE: attributes #0 = { cold }
; When passing an attribute without specifying a function, the attribute
; should be added to all functions in the module.
; CHECK-ADD-ALL: define void @foo() #0 {
; CHECK-ADD-ALL: define void @goo() #1 {
; CHECK-ADD-ALL: attributes #0 = { optsize }
; CHECK-ADD-ALL: attributes #1 = { noinline optsize }
; When passing an attribute to be removed without specifying a function,
; the attribute should be removed from all functions in the module that
; have it.
; CHECK-REMOVE-ALL: define void @foo() {
; CHECK-REMOVE-ALL: define void @goo() {
; CHECK-REMOVE-ALL-NOT: attributes #0