From 7fbbd670e7ccdd2362bb8f4db3ce2b8a4bc0d8e3 Mon Sep 17 00:00:00 2001 From: Yevgeny Rouban Date: Mon, 21 Oct 2019 06:52:08 +0000 Subject: [PATCH] [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 --- lib/IR/Instruction.cpp | 2 +- test/CodeGen/AMDGPU/llvm.amdgcn.ds.gws.init.ll | 2 +- test/Transforms/EarlyCSE/writeonly.ll | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 test/Transforms/EarlyCSE/writeonly.ll diff --git a/lib/IR/Instruction.cpp b/lib/IR/Instruction.cpp index ba5629d1662..b157c7bb34b 100644 --- a/lib/IR/Instruction.cpp +++ b/lib/IR/Instruction.cpp @@ -524,7 +524,7 @@ bool Instruction::mayReadFromMemory() const { case Instruction::Call: case Instruction::Invoke: case Instruction::CallBr: - return !cast(this)->doesNotAccessMemory(); + return !cast(this)->doesNotReadMemory(); case Instruction::Store: return !cast(this)->isUnordered(); } diff --git a/test/CodeGen/AMDGPU/llvm.amdgcn.ds.gws.init.ll b/test/CodeGen/AMDGPU/llvm.amdgcn.ds.gws.init.ll index a7a8fa7f2cc..9c39593d903 100644 --- a/test/CodeGen/AMDGPU/llvm.amdgcn.ds.gws.init.ll +++ b/test/CodeGen/AMDGPU/llvm.amdgcn.ds.gws.init.ll @@ -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 diff --git a/test/Transforms/EarlyCSE/writeonly.ll b/test/Transforms/EarlyCSE/writeonly.ll new file mode 100644 index 00000000000..0a3cd1c7401 --- /dev/null +++ b/test/Transforms/EarlyCSE/writeonly.ll @@ -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 +}