Index: include/llvm/IR/IntrinsicsAMDGPU.td =================================================================== --- include/llvm/IR/IntrinsicsAMDGPU.td +++ include/llvm/IR/IntrinsicsAMDGPU.td @@ -107,6 +107,9 @@ def int_amdgcn_s_barrier : GCCBuiltin<"__builtin_amdgcn_s_barrier">, Intrinsic<[], [], [IntrConvergent]>; +def int_amdgcn_wave_barrier : GCCBuiltin<"__builtin_amdgcn_wave_barrier">, + Intrinsic<[], [], [IntrConvergent]>; + def int_amdgcn_s_waitcnt : Intrinsic<[], [llvm_i32_ty], []>; def int_amdgcn_div_scale : Intrinsic< Index: lib/Target/AMDGPU/SIISelLowering.cpp =================================================================== --- lib/Target/AMDGPU/SIISelLowering.cpp +++ lib/Target/AMDGPU/SIISelLowering.cpp @@ -2694,6 +2694,8 @@ SDValue Cast = DAG.getNode(ISD::BITCAST, DL, MVT::i32, Src); return DAG.getNode(AMDGPUISD::KILL, DL, MVT::Other, Chain, Cast); } + case Intrinsic::amdgcn_wave_barrier: + return Chain; default: return SDValue(); } Index: test/CodeGen/AMDGPU/llvm.amdgcn.wave.barrier.ll =================================================================== --- /dev/null +++ test/CodeGen/AMDGPU/llvm.amdgcn.wave.barrier.ll @@ -0,0 +1,15 @@ +; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s + +; GCN-LABEL: {{^}}test_wave_barrier: +; GCN-NOT: s_barrier + +define void @test_wave_barrier() #0 { +entry: + call void @llvm.amdgcn.wave.barrier() + ret void +} + +declare void @llvm.amdgcn.wave.barrier() #1 + +attributes #0 = { nounwind } +attributes #1 = { convergent nounwind }