From bb585b9f9f18534d9c6b3b7abe7366b6746ac332 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Thu, 11 Jul 2019 23:42:57 +0000 Subject: [PATCH] AMDGPU: s_waitcnt field should be treated as unsigned Also make it an ImmLeaf, so it should work with global isel as well, which was part of the point of moving it in the first place. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@365842 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AMDGPU/SIInstrInfo.td | 8 ++++++-- lib/Target/AMDGPU/SOPInstructions.td | 2 +- test/CodeGen/AMDGPU/llvm.amdgcn.s.waitcnt.ll | 12 ++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/Target/AMDGPU/SIInstrInfo.td b/lib/Target/AMDGPU/SIInstrInfo.td index 5792efedb90..91843f308a0 100644 --- a/lib/Target/AMDGPU/SIInstrInfo.td +++ b/lib/Target/AMDGPU/SIInstrInfo.td @@ -622,8 +622,12 @@ class bitextract_imm : SDNodeXFormgetTargetConstant(Bit, SDLoc(N), MVT::i1); }]>; -def SIMM16bit : PatLeaf <(imm), - [{return isInt<16>(N->getSExtValue());}] +def SIMM16bit : ImmLeaf (Imm);}] +>; + +def UIMM16bit : ImmLeaf (Imm); }] >; class InlineImm : PatLeaf <(vt imm), [{ diff --git a/lib/Target/AMDGPU/SOPInstructions.td b/lib/Target/AMDGPU/SOPInstructions.td index 480772b4974..f46bee12604 100644 --- a/lib/Target/AMDGPU/SOPInstructions.td +++ b/lib/Target/AMDGPU/SOPInstructions.td @@ -1090,7 +1090,7 @@ def S_WAKEUP : SOPP <0x00000003, (ins), "s_wakeup"> { let mayLoad = 1, mayStore = 1, hasSideEffects = 1 in def S_WAITCNT : SOPP <0x0000000c, (ins WAIT_FLAG:$simm16), "s_waitcnt $simm16", - [(int_amdgcn_s_waitcnt SIMM16bit:$simm16)]>; + [(int_amdgcn_s_waitcnt UIMM16bit:$simm16)]>; def S_SETHALT : SOPP <0x0000000d, (ins i16imm:$simm16), "s_sethalt $simm16">; def S_SETKILL : SOPP <0x0000000b, (ins i16imm:$simm16), "s_setkill $simm16">; diff --git a/test/CodeGen/AMDGPU/llvm.amdgcn.s.waitcnt.ll b/test/CodeGen/AMDGPU/llvm.amdgcn.s.waitcnt.ll index dbe48067187..51cd4e053b9 100644 --- a/test/CodeGen/AMDGPU/llvm.amdgcn.s.waitcnt.ll +++ b/test/CodeGen/AMDGPU/llvm.amdgcn.s.waitcnt.ll @@ -31,6 +31,18 @@ define amdgpu_ps void @test2(<8 x i32> inreg %rsrc, i32 %c) { ret void } +; CHECK-LABEL: {{^}}test3: +; CHECK: image_load +; CHECK: s_waitcnt vmcnt(0) lgkmcnt(0) +; CHECK: image_store +define amdgpu_ps void @test3(<8 x i32> inreg %rsrc, i32 %c) { + %t = call <4 x float> @llvm.amdgcn.image.load.1d.v4f32.i32(i32 15, i32 %c, <8 x i32> %rsrc, i32 0, i32 0) + call void @llvm.amdgcn.s.waitcnt(i32 49279) ; not isInt<16>, but isUInt<16> + %c.1 = mul i32 %c, 2 + call void @llvm.amdgcn.image.store.1d.v4f32.i32(<4 x float> %t, i32 15, i32 %c.1, <8 x i32> %rsrc, i32 0, i32 0) + ret void +} + declare void @llvm.amdgcn.s.waitcnt(i32) #0 declare <4 x float> @llvm.amdgcn.image.load.1d.v4f32.i32(i32, i32, <8 x i32>, i32, i32) #1 -- 2.40.0