1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 12:43:36 +01:00

[IR] Fix mayReadFromMemory() for writeonly calls

Current implementation of Instruction::mayReadFromMemory()
returns !doesNotAccessMemory() which is !ReadNone. This
does not take into account that the writeonly attribute
also indicates that the call does not read from memory.

The patch changes the predicate to !doesNotReadMemory()
that reflects the intended behavior.

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

llvm-svn: 375389
This commit is contained in:
Yevgeny Rouban 2019-10-21 06:52:08 +00:00
parent b80df40a5e
commit 7fbbd670e7
3 changed files with 17 additions and 2 deletions

View File

@ -524,7 +524,7 @@ bool Instruction::mayReadFromMemory() const {
case Instruction::Call: case Instruction::Call:
case Instruction::Invoke: case Instruction::Invoke:
case Instruction::CallBr: case Instruction::CallBr:
return !cast<CallBase>(this)->doesNotAccessMemory(); return !cast<CallBase>(this)->doesNotReadMemory();
case Instruction::Store: case Instruction::Store:
return !cast<StoreInst>(this)->isUnordered(); return !cast<StoreInst>(this)->isUnordered();
} }

View File

@ -114,7 +114,7 @@ define amdgpu_kernel void @gws_init_vgpr_offset_add(i32 %val) #0 {
; LOOP: s_mov_b32 m0, -1 ; LOOP: s_mov_b32 m0, -1
; LOOP: ds_write_b32 ; LOOP: ds_write_b32
define amdgpu_kernel void @gws_init_save_m0_init_constant_offset(i32 %val) #0 { define amdgpu_kernel void @gws_init_save_m0_init_constant_offset(i32 %val) #0 {
store i32 1, i32 addrspace(3)* @lds store volatile i32 1, i32 addrspace(3)* @lds
call void @llvm.amdgcn.ds.gws.init(i32 %val, i32 10) call void @llvm.amdgcn.ds.gws.init(i32 %val, i32 10)
store i32 2, i32 addrspace(3)* @lds store i32 2, i32 addrspace(3)* @lds
ret void ret void

View File

@ -0,0 +1,15 @@
; RUN: opt -S -early-cse < %s | FileCheck %s
@var = global i32 undef
declare void @foo() nounwind
define void @test() {
; CHECK-LABEL: @test(
; CHECK-NOT: store
store i32 1, i32* @var
; CHECK: call void @foo()
call void @foo() writeonly
; CHECK: store i32 2, i32* @var
store i32 2, i32* @var
ret void
}