[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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@375389 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Yevgeny Rouban 2019-10-21 06:52:08 +00:00
parent adc79ba5db
commit 53fb41197c
3 changed files with 17 additions and 2 deletions

View File

@ -524,7 +524,7 @@ bool Instruction::mayReadFromMemory() const {
case Instruction::Call:
case Instruction::Invoke:
case Instruction::CallBr:
return !cast<CallBase>(this)->doesNotAccessMemory();
return !cast<CallBase>(this)->doesNotReadMemory();
case Instruction::Store:
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: ds_write_b32
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)
store i32 2, i32 addrspace(3)* @lds
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
}