This patch adds a lightweight instance of Attributor that only deduces attributes. This is just an initial version with the goal to have a version that only focuses on attributes to replace the function-attrs pass. The initial version has a few open issues pending until default enablement, the main one probably being compile time. The main additional functionality this will provide in general is propagating attributes to call sites. Open issues: * compile time The current version increase O3 +2.67% and ThinLTO +6.18% when replacing FunctionAttr https://llvm-compile-time-tracker.com/compare.php?from=c4bb3e073548cf436d5fa0406e3ae75e94684dec&to=d992630a69c79a2587d736e6a88f448850413bd1&stat=instructions%3Au Both are with an additional change to preserve more analysis, like FunctionAttrs CGSCC run. * some missed attribute inference Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D152081
36 lines
1.4 KiB
LLVM
36 lines
1.4 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
|
|
; RUN: opt -passes=function-attrs -S < %s | FileCheck --check-prefixes=COMMON,FNATTRS %s
|
|
; RUN: opt -passes=attributor-light -S < %s | FileCheck --check-prefixes=COMMON,ATTRIBUTOR %s
|
|
|
|
define void @bar(ptr readonly %0) {
|
|
; FNATTRS-LABEL: define void @bar
|
|
; FNATTRS-SAME: (ptr nocapture readnone [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] {
|
|
; FNATTRS-NEXT: call void @foo(ptr [[TMP0]])
|
|
; FNATTRS-NEXT: ret void
|
|
;
|
|
; ATTRIBUTOR-LABEL: define void @bar
|
|
; ATTRIBUTOR-SAME: (ptr nocapture nofree readnone [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] {
|
|
; ATTRIBUTOR-NEXT: call void @foo(ptr nocapture nofree readnone [[TMP0]]) #[[ATTR0]]
|
|
; ATTRIBUTOR-NEXT: ret void
|
|
;
|
|
call void @foo(ptr %0)
|
|
ret void
|
|
}
|
|
|
|
define void @foo(ptr readonly %0) {
|
|
; FNATTRS-LABEL: define void @foo
|
|
; FNATTRS-SAME: (ptr nocapture readnone [[TMP0:%.*]]) #[[ATTR0]] {
|
|
; FNATTRS-NEXT: call void @bar(ptr [[TMP0]])
|
|
; FNATTRS-NEXT: ret void
|
|
;
|
|
; ATTRIBUTOR-LABEL: define void @foo
|
|
; ATTRIBUTOR-SAME: (ptr nocapture nofree readnone [[TMP0:%.*]]) #[[ATTR0]] {
|
|
; ATTRIBUTOR-NEXT: call void @bar(ptr nocapture nofree readnone [[TMP0]]) #[[ATTR0]]
|
|
; ATTRIBUTOR-NEXT: ret void
|
|
;
|
|
call void @bar(ptr %0)
|
|
ret void
|
|
}
|
|
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
|
|
; COMMON: {{.*}}
|