mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-28 16:28:58 +00:00

adding new read attribute to an argument Summary: Update optimization pass to prevent adding read-attribute to an argument without removing its conflicting attribute. A read attribute, based on the result of the attribute deduction process, might be added to an argument. The attribute might be in conflict with other read/write attribute currently associated with the argument. To ensure the compatibility of attributes, conflicting attribute, if any, must be removed before a new one is added. The following snippet shows the current behavior of the compiler, where the compilation process is aborted due to incompatible attributes. $ cat x.ll ; ModuleID = 'x.bc' %_type_of_d-ccc = type <{ i8*, i8, i8, i8, i8 }> @d-ccc = internal global %_type_of_d-ccc <{ i8* null, i8 1, i8 13, i8 0, i8 -127 }>, align 8 define void @foo(i32* writeonly %.aaa) { foo_entry: %_param_.aaa = alloca i32*, align 8 store i32* %.aaa, i32** %_param_.aaa, align 8 store i8 0, i8* getelementptr inbounds (%_type_of_d-ccc, %_type_of_d-ccc* @d-ccc, i32 0, i32 3) ret void } $ opt -O3 x.ll Attributes 'readnone and writeonly' are incompatible! void (i32*)* @foo in function foo LLVM ERROR: Broken function found, compilation aborted! The purpose of this changeset is to fix the above error. This fix is based on a suggestion from Johannes @jdoerfert (many thanks!!!) Authored By: anhtuyen Reviewer: nicholas, rnk, chandlerc, jdoerfert Reviewed By: rnk Subscribers: hiraditya, jdoerfert, llvm-commits, anhtuyen, LLVM Tag: LLVM Differential Revision: https://reviews.llvm.org/D58694 llvm-svn: 371622
31 lines
1.1 KiB
LLVM
31 lines
1.1 KiB
LLVM
; RUN: opt < %s -functionattrs -S | FileCheck %s
|
|
; RUN: opt < %s -passes=function-attrs -S | FileCheck %s
|
|
|
|
; CHECK: define void @nouses-argworn-funrn(i32* nocapture readnone %.aaa) #0 {
|
|
define void @nouses-argworn-funrn(i32* writeonly %.aaa) {
|
|
nouses-argworn-funrn_entry:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define void @nouses-argworn-funro(i32* nocapture readnone %.aaa, i32* nocapture readonly %.bbb) #1 {
|
|
define void @nouses-argworn-funro(i32* writeonly %.aaa, i32* %.bbb) {
|
|
nouses-argworn-funro_entry:
|
|
%val = load i32 , i32* %.bbb
|
|
ret void
|
|
}
|
|
|
|
%_type_of_d-ccc = type <{ i8*, i8, i8, i8, i8 }>
|
|
|
|
@d-ccc = internal global %_type_of_d-ccc <{ i8* null, i8 1, i8 13, i8 0, i8 -127 }>, align 8
|
|
|
|
; CHECK: define void @nouses-argworn-funwo(i32* nocapture readnone %.aaa) #2 {
|
|
define void @nouses-argworn-funwo(i32* writeonly %.aaa) {
|
|
nouses-argworn-funwo_entry:
|
|
store i8 0, i8* getelementptr inbounds (%_type_of_d-ccc, %_type_of_d-ccc* @d-ccc, i32 0, i32 3)
|
|
ret void
|
|
}
|
|
|
|
; CHECK: attributes #0 = { {{.*}} readnone }
|
|
; CHECK: attributes #1 = { {{.*}} readonly }
|
|
; CHECK: attributes #2 = { {{.*}} writeonly }
|