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:
parent
b80df40a5e
commit
7fbbd670e7
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
15
test/Transforms/EarlyCSE/writeonly.ll
Normal file
15
test/Transforms/EarlyCSE/writeonly.ll
Normal 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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user