
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
52 lines
2.2 KiB
LLVM
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
|
|
|