diff options
| author | Michael Kruse <llvm-project@meinersbur.de> | 2025-01-03 10:22:51 +0100 |
|---|---|---|
| committer | Michael Kruse <llvm-project@meinersbur.de> | 2025-01-03 10:22:51 +0100 |
| commit | 38500d63e14ce340236840f60d356cdefb56a52c (patch) | |
| tree | 17edbec446ce9b50d2f215a483b83afb293a635d /llvm/test/CodeGen/DirectX | |
| parent | 1a3d5daaef7a6a63448a497da3eff7fc9e23df26 (diff) | |
| parent | 27f30029741ecf023baece7b3dde1ff9011ffefc (diff) | |
Merge branch 'main' into users/meinersbur/flang_runtime_split-headersusers/meinersbur/flang_runtime_split-headers
Diffstat (limited to 'llvm/test/CodeGen/DirectX')
19 files changed, 751 insertions, 111 deletions
diff --git a/llvm/test/CodeGen/DirectX/BufferLoad.ll b/llvm/test/CodeGen/DirectX/BufferLoad.ll index 24d65fe1648c..7f1291bf4a5c 100644 --- a/llvm/test/CodeGen/DirectX/BufferLoad.ll +++ b/llvm/test/CodeGen/DirectX/BufferLoad.ll @@ -10,14 +10,14 @@ define void @loadv4f32() { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f32_0_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_0_0_0( i32 0, i32 0, i32 1, i32 0, i1 false) ; The temporary casts should all have been cleaned up - ; CHECK-NOT: %dx.cast_handle + ; CHECK-NOT: %dx.resource.casthandle ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) - %data0 = call <4 x float> @llvm.dx.typedBufferLoad( + %data0 = call <4 x float> @llvm.dx.resource.load.typedbuffer( target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i32 0) ; The extract order depends on the users, so don't enforce that here. @@ -34,7 +34,7 @@ define void @loadv4f32() { call void @scalar_user(float %data0_2) ; CHECK: [[DATA4:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 4, i32 undef) - %data4 = call <4 x float> @llvm.dx.typedBufferLoad( + %data4 = call <4 x float> @llvm.dx.resource.load.typedbuffer( target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i32 4) ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA4]], 0 @@ -48,7 +48,7 @@ define void @loadv4f32() { call void @vector_user(<4 x float> %data4) ; CHECK: [[DATA12:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 12, i32 undef) - %data12 = call <4 x float> @llvm.dx.typedBufferLoad( + %data12 = call <4 x float> @llvm.dx.resource.load.typedbuffer( target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i32 12) ; CHECK: [[DATA12_3:%.*]] = extractvalue %dx.types.ResRet.f32 [[DATA12]], 3 @@ -66,11 +66,11 @@ define void @index_dynamic(i32 %bufindex, i32 %elemindex) { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f32_0_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_0_0_0( i32 0, i32 0, i32 1, i32 0, i1 false) ; CHECK: [[LOAD:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 %bufindex, i32 undef) - %load = call <4 x float> @llvm.dx.typedBufferLoad( + %load = call <4 x float> @llvm.dx.resource.load.typedbuffer( target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i32 %bufindex) ; CHECK: [[ALLOCA:%.*]] = alloca [4 x float] @@ -101,11 +101,11 @@ define void @loadf32() { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", float, 0, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_f32_0_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_0_0_0( i32 0, i32 0, i32 1, i32 0, i1 false) ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) - %data0 = call float @llvm.dx.typedBufferLoad( + %data0 = call float @llvm.dx.resource.load.typedbuffer( target("dx.TypedBuffer", float, 0, 0, 0) %buffer, i32 0) ; CHECK: [[VAL0:%.*]] = extractvalue %dx.types.ResRet.f32 [[DATA0]], 0 @@ -119,11 +119,11 @@ define void @loadv2f32() { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <2 x float>, 0, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v2f32_0_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v2f32_0_0_0( i32 0, i32 0, i32 1, i32 0, i1 false) ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) - %data0 = call <2 x float> @llvm.dx.typedBufferLoad( + %data0 = call <2 x float> @llvm.dx.resource.load.typedbuffer( target("dx.TypedBuffer", <2 x float>, 0, 0, 0) %buffer, i32 0) ret void @@ -133,11 +133,11 @@ define void @loadv4f32_checkbit() { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f32_0_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_0_0_0( i32 0, i32 0, i32 1, i32 0, i1 false) ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) - %data0 = call {<4 x float>, i1} @llvm.dx.typedBufferLoad.checkbit.f32( + %data0 = call {<4 x float>, i1} @llvm.dx.resource.loadchecked.typedbuffer.f32( target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i32 0) ; CHECK: [[STATUS:%.*]] = extractvalue %dx.types.ResRet.f32 [[DATA0]], 4 @@ -154,11 +154,11 @@ define void @loadv4i32() { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4i32_0_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4i32_0_0_0( i32 0, i32 0, i32 1, i32 0, i1 false) ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.i32 @dx.op.bufferLoad.i32(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) - %data0 = call <4 x i32> @llvm.dx.typedBufferLoad( + %data0 = call <4 x i32> @llvm.dx.resource.load.typedbuffer( target("dx.TypedBuffer", <4 x i32>, 0, 0, 0) %buffer, i32 0) ret void @@ -168,11 +168,11 @@ define void @loadv4f16() { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x half>, 0, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f16_0_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f16_0_0_0( i32 0, i32 0, i32 1, i32 0, i1 false) ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.f16 @dx.op.bufferLoad.f16(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) - %data0 = call <4 x half> @llvm.dx.typedBufferLoad( + %data0 = call <4 x half> @llvm.dx.resource.load.typedbuffer( target("dx.TypedBuffer", <4 x half>, 0, 0, 0) %buffer, i32 0) ret void @@ -182,11 +182,11 @@ define void @loadv4i16() { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x i16>, 0, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4i16_0_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4i16_0_0_0( i32 0, i32 0, i32 1, i32 0, i1 false) ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.i16 @dx.op.bufferLoad.i16(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) - %data0 = call <4 x i16> @llvm.dx.typedBufferLoad( + %data0 = call <4 x i16> @llvm.dx.resource.load.typedbuffer( target("dx.TypedBuffer", <4 x i16>, 0, 0, 0) %buffer, i32 0) ret void diff --git a/llvm/test/CodeGen/DirectX/BufferStore-errors.ll b/llvm/test/CodeGen/DirectX/BufferStore-errors.ll index ffdcb037b896..6e529973bd60 100644 --- a/llvm/test/CodeGen/DirectX/BufferStore-errors.ll +++ b/llvm/test/CodeGen/DirectX/BufferStore-errors.ll @@ -8,10 +8,10 @@ target triple = "dxil-pc-shadermodel6.6-compute" ; CHECK-SAME: typedBufferStore data must be a vector of 4 elements define void @storetoomany(<5 x float> %data, i32 %index) "hlsl.export" { %buffer = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f32_1_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( i32 0, i32 0, i32 1, i32 0, i1 false) - call void @llvm.dx.typedBufferStore.tdx.TypedBuffer_v4f32_1_0_0t.v5f32( + call void @llvm.dx.resource.store.typedbuffer.tdx.TypedBuffer_v4f32_1_0_0t.v5f32( target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index, <5 x float> %data) @@ -23,15 +23,15 @@ define void @storetoomany(<5 x float> %data, i32 %index) "hlsl.export" { ; CHECK-SAME: typedBufferStore data must be a vector of 4 elements define void @storetoofew(<3 x i32> %data, i32 %index) "hlsl.export" { %buffer = call target("dx.TypedBuffer", <4 x i32>, 1, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4i32_1_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4i32_1_0_0( i32 0, i32 0, i32 1, i32 0, i1 false) - call void @llvm.dx.typedBufferStore.tdx.TypedBuffer_v4i32_1_0_0t.v3i32( + call void @llvm.dx.resource.store.typedbuffer.tdx.TypedBuffer_v4i32_1_0_0t.v3i32( target("dx.TypedBuffer", <4 x i32>, 1, 0, 0) %buffer, i32 %index, <3 x i32> %data) ret void } -declare void @llvm.dx.typedBufferStore.tdx.TypedBuffer_v4f32_1_0_0t.v5f32(target("dx.TypedBuffer", <4 x float>, 1, 0, 0), i32, <5 x float>) -declare void @llvm.dx.typedBufferStore.tdx.TypedBuffer_v4i32_1_0_0t.v3i32(target("dx.TypedBuffer", <4 x i32>, 1, 0, 0), i32, <3 x i32>) +declare void @llvm.dx.resource.store.typedbuffer.tdx.TypedBuffer_v4f32_1_0_0t.v5f32(target("dx.TypedBuffer", <4 x float>, 1, 0, 0), i32, <5 x float>) +declare void @llvm.dx.resource.store.typedbuffer.tdx.TypedBuffer_v4i32_1_0_0t.v3i32(target("dx.TypedBuffer", <4 x i32>, 1, 0, 0), i32, <3 x i32>) diff --git a/llvm/test/CodeGen/DirectX/BufferStore.ll b/llvm/test/CodeGen/DirectX/BufferStore.ll index 81cc5fd328e0..381df6a63962 100644 --- a/llvm/test/CodeGen/DirectX/BufferStore.ll +++ b/llvm/test/CodeGen/DirectX/BufferStore.ll @@ -7,18 +7,18 @@ define void @storefloat(<4 x float> %data, i32 %index) { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f32_1_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( i32 0, i32 0, i32 1, i32 0, i1 false) ; The temporary casts should all have been cleaned up - ; CHECK-NOT: %dx.cast_handle + ; CHECK-NOT: %dx.resource.casthandle ; CHECK: [[DATA0_0:%.*]] = extractelement <4 x float> %data, i32 0 ; CHECK: [[DATA0_1:%.*]] = extractelement <4 x float> %data, i32 1 ; CHECK: [[DATA0_2:%.*]] = extractelement <4 x float> %data, i32 2 ; CHECK: [[DATA0_3:%.*]] = extractelement <4 x float> %data, i32 3 ; CHECK: call void @dx.op.bufferStore.f32(i32 69, %dx.types.Handle [[HANDLE]], i32 %index, i32 undef, float [[DATA0_0]], float [[DATA0_1]], float [[DATA0_2]], float [[DATA0_3]], i8 15) - call void @llvm.dx.typedBufferStore( + call void @llvm.dx.resource.store.typedbuffer( target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index, <4 x float> %data) @@ -30,7 +30,7 @@ define void @storeint(<4 x i32> %data, i32 %index) { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x i32>, 1, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4i32_1_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4i32_1_0_0( i32 0, i32 0, i32 1, i32 0, i1 false) ; CHECK: [[DATA0_0:%.*]] = extractelement <4 x i32> %data, i32 0 @@ -38,7 +38,7 @@ define void @storeint(<4 x i32> %data, i32 %index) { ; CHECK: [[DATA0_2:%.*]] = extractelement <4 x i32> %data, i32 2 ; CHECK: [[DATA0_3:%.*]] = extractelement <4 x i32> %data, i32 3 ; CHECK: call void @dx.op.bufferStore.i32(i32 69, %dx.types.Handle [[HANDLE]], i32 %index, i32 undef, i32 [[DATA0_0]], i32 [[DATA0_1]], i32 [[DATA0_2]], i32 [[DATA0_3]], i8 15) - call void @llvm.dx.typedBufferStore( + call void @llvm.dx.resource.store.typedbuffer( target("dx.TypedBuffer", <4 x i32>, 1, 0, 0) %buffer, i32 %index, <4 x i32> %data) @@ -50,18 +50,18 @@ define void @storehalf(<4 x half> %data, i32 %index) { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x half>, 1, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f16_1_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f16_1_0_0( i32 0, i32 0, i32 1, i32 0, i1 false) ; The temporary casts should all have been cleaned up - ; CHECK-NOT: %dx.cast_handle + ; CHECK-NOT: %dx.resource.casthandle ; CHECK: [[DATA0_0:%.*]] = extractelement <4 x half> %data, i32 0 ; CHECK: [[DATA0_1:%.*]] = extractelement <4 x half> %data, i32 1 ; CHECK: [[DATA0_2:%.*]] = extractelement <4 x half> %data, i32 2 ; CHECK: [[DATA0_3:%.*]] = extractelement <4 x half> %data, i32 3 ; CHECK: call void @dx.op.bufferStore.f16(i32 69, %dx.types.Handle [[HANDLE]], i32 %index, i32 undef, half [[DATA0_0]], half [[DATA0_1]], half [[DATA0_2]], half [[DATA0_3]], i8 15) - call void @llvm.dx.typedBufferStore( + call void @llvm.dx.resource.store.typedbuffer( target("dx.TypedBuffer", <4 x half>, 1, 0, 0) %buffer, i32 %index, <4 x half> %data) @@ -73,18 +73,18 @@ define void @storei16(<4 x i16> %data, i32 %index) { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x i16>, 1, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4i16_1_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4i16_1_0_0( i32 0, i32 0, i32 1, i32 0, i1 false) ; The temporary casts should all have been cleaned up - ; CHECK-NOT: %dx.cast_handle + ; CHECK-NOT: %dx.resource.casthandle ; CHECK: [[DATA0_0:%.*]] = extractelement <4 x i16> %data, i32 0 ; CHECK: [[DATA0_1:%.*]] = extractelement <4 x i16> %data, i32 1 ; CHECK: [[DATA0_2:%.*]] = extractelement <4 x i16> %data, i32 2 ; CHECK: [[DATA0_3:%.*]] = extractelement <4 x i16> %data, i32 3 ; CHECK: call void @dx.op.bufferStore.i16(i32 69, %dx.types.Handle [[HANDLE]], i32 %index, i32 undef, i16 [[DATA0_0]], i16 [[DATA0_1]], i16 [[DATA0_2]], i16 [[DATA0_3]], i8 15) - call void @llvm.dx.typedBufferStore( + call void @llvm.dx.resource.store.typedbuffer( target("dx.TypedBuffer", <4 x i16>, 1, 0, 0) %buffer, i32 %index, <4 x i16> %data) @@ -96,7 +96,7 @@ define void @store_scalarized_floats(float %data0, float %data1, float %data2, f ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f32_1_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( i32 0, i32 0, i32 1, i32 0, i1 false) ; We shouldn't end up with any inserts/extracts. @@ -108,7 +108,7 @@ define void @store_scalarized_floats(float %data0, float %data1, float %data2, f %vec.upto1 = insertelement <4 x float> %vec.upto0, float %data1, i64 1 %vec.upto2 = insertelement <4 x float> %vec.upto1, float %data2, i64 2 %vec = insertelement <4 x float> %vec.upto2, float %data3, i64 3 - call void @llvm.dx.typedBufferStore( + call void @llvm.dx.resource.store.typedbuffer( target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index, <4 x float> %vec) diff --git a/llvm/test/CodeGen/DirectX/ContainerData/PSVResources.ll b/llvm/test/CodeGen/DirectX/ContainerData/PSVResources.ll index 2bd7a2e8df12..ce67812c3988 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/PSVResources.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/PSVResources.ll @@ -15,7 +15,7 @@ define void @main() #0 { ; CHECK: Flags: ; CHECK: UsedByAtomic64: false %srv0 = call target("dx.RawBuffer", i8, 0, 0) - @llvm.dx.handle.fromBinding.tdx.RawBuffer_i8_0_0t( + @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t( i32 1, i32 8, i32 1, i32 0, i1 false) ; struct S { float4 a; uint4 b; }; @@ -28,7 +28,7 @@ define void @main() #0 { ; CHECK: Flags: ; CHECK: UsedByAtomic64: false %srv1 = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0) - @llvm.dx.handle.fromBinding.tdx.RawBuffer_sl_v4f32v4i32s_0_0t( + @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_sl_v4f32v4i32s_0_0t( i32 4, i32 2, i32 1, i32 0, i1 false) ; Buffer<uint4> Buf[24] : register(t3, space5) @@ -40,7 +40,7 @@ define void @main() #0 { ; CHECK: Flags: ; CHECK: UsedByAtomic64: false %srv2 = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_i32_0_0t( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_0_0t( i32 5, i32 3, i32 24, i32 0, i1 false) ; RWBuffer<int> Buf : register(u7, space2) @@ -52,7 +52,7 @@ define void @main() #0 { ; CHECK: Flags: ; CHECK: UsedByAtomic64: false %uav0 = call target("dx.TypedBuffer", i32, 1, 0, 1) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_i32_1_0t( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0t( i32 2, i32 7, i32 1, i32 0, i1 false) ; RWBuffer<float4> Buf : register(u5, space3) @@ -64,7 +64,7 @@ define void @main() #0 { ; CHECK: Flags: ; CHECK: UsedByAtomic64: false %uav1 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_f32_1_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0( i32 3, i32 5, i32 1, i32 0, i1 false) ; RWBuffer<float4> BufferArray[10] : register(u0, space4) @@ -77,11 +77,11 @@ define void @main() #0 { ; CHECK: UsedByAtomic64: false ; RWBuffer<float4> Buf = BufferArray[0] %uav2_1 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_f32_1_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0( i32 4, i32 0, i32 10, i32 0, i1 false) ; RWBuffer<float4> Buf = BufferArray[5] %uav2_2 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_f32_1_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0( i32 4, i32 0, i32 10, i32 5, i1 false) ret void } diff --git a/llvm/test/CodeGen/DirectX/CreateHandle.ll b/llvm/test/CodeGen/DirectX/CreateHandle.ll index 234d4e035bf1..80daa879f0f8 100644 --- a/llvm/test/CodeGen/DirectX/CreateHandle.ll +++ b/llvm/test/CodeGen/DirectX/CreateHandle.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -passes=dxil-op-lower,dxil-translate-metadata %s | FileCheck %s +; RUN: opt -S -passes=dxil-translate-metadata,dxil-op-lower %s | FileCheck %s ; RUN: opt -S -passes=dxil-pretty-printer %s 2>&1 >/dev/null | FileCheck --check-prefix=CHECK-PRETTY %s ; CHECK-PRETTY: Type Format Dim ID HLSL Bind Count @@ -17,14 +17,14 @@ declare i32 @some_val(); define void @test_buffers() { ; RWBuffer<float4> Buf : register(u5, space3) %typed0 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f32_1_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( i32 3, i32 5, i32 1, i32 0, i1 false) ; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 1, i32 5, i1 false) ; CHECK-NOT: @llvm.dx.cast.handle ; RWBuffer<int> Buf : register(u7, space2) %typed1 = call target("dx.TypedBuffer", i32, 1, 0, 1) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_i32_1_0_1t( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_1t( i32 2, i32 7, i32 1, i32 0, i1 false) ; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 0, i32 7, i1 false) @@ -32,20 +32,20 @@ define void @test_buffers() { ; Buffer<uint4> typed2 = Buf[4] ; Note that the index below is 3 + 4 = 7 %typed2 = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_i32_0_0_0t( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_0_0_0t( i32 5, i32 3, i32 24, i32 4, i1 false) ; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 3, i32 7, i1 false) ; struct S { float4 a; uint4 b; }; ; StructuredBuffer<S> Buf : register(t2, space4) %struct0 = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0) - @llvm.dx.handle.fromBinding.tdx.RawBuffer_sl_v4f32v4i32s_0_0t( + @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_sl_v4f32v4i32s_0_0t( i32 4, i32 2, i32 1, i32 0, i1 true) ; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 2, i32 2, i1 true) ; ByteAddressBuffer Buf : register(t8, space1) %byteaddr0 = call target("dx.RawBuffer", i8, 0, 0) - @llvm.dx.handle.fromBinding.tdx.RawBuffer_i8_0_0t( + @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t( i32 1, i32 8, i32 1, i32 0, i1 false) ; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 1, i32 8, i1 false) @@ -53,7 +53,7 @@ define void @test_buffers() { ; Buffer<float4> typed3 = Buf[ix] %typed3_ix = call i32 @some_val() %typed3 = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f32_0_0_0t( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_0_0_0t( i32 0, i32 7, i32 -1, i32 %typed3_ix, i1 false) ; CHECK: %[[IX:.*]] = add i32 %typed3_ix, 7 ; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 0, i32 %[[IX]], i1 false) diff --git a/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll b/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll index aa143dfa8211..bf11bfa143c9 100644 --- a/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll +++ b/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -passes=dxil-op-lower,dxil-translate-metadata %s | FileCheck %s +; RUN: opt -S -passes=dxil-translate-metadata,dxil-op-lower %s | FileCheck %s ; RUN: opt -S -passes=dxil-pretty-printer %s 2>&1 >/dev/null | FileCheck --check-prefix=CHECK-PRETTY %s ; CHECK-PRETTY: Type Format Dim ID HLSL Bind Count @@ -17,14 +17,14 @@ declare i32 @some_val(); define void @test_bindings() { ; RWBuffer<float4> Buf : register(u5, space3) %typed0 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f32_1_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( i32 3, i32 5, i32 1, i32 0, i1 false) ; CHECK: [[BUF0:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 5, i32 5, i32 3, i8 1 }, i32 5, i1 false) ; CHECK: call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BUF0]], %dx.types.ResourceProperties { i32 4106, i32 1033 }) ; RWBuffer<int> Buf : register(u7, space2) %typed1 = call target("dx.TypedBuffer", i32, 1, 0, 1) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_i32_1_0_0t( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_0t( i32 2, i32 7, i32 1, i32 0, i1 false) ; CHECK: [[BUF1:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 7, i32 7, i32 2, i8 1 }, i32 7, i1 false) ; CHECK: call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BUF1]], %dx.types.ResourceProperties { i32 4106, i32 260 }) @@ -33,7 +33,7 @@ define void @test_bindings() { ; Buffer<uint4> typed2 = Buf[4] ; Note that the index below is 3 + 4 = 7 %typed2 = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_i32_0_0_0t( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_0_0_0t( i32 5, i32 3, i32 24, i32 4, i1 false) ; CHECK: [[BUF2:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 3, i32 26, i32 5, i8 0 }, i32 7, i1 false) ; CHECK: call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BUF2]], %dx.types.ResourceProperties { i32 10, i32 1029 }) @@ -41,14 +41,14 @@ define void @test_bindings() { ; struct S { float4 a; uint4 b; }; ; StructuredBuffer<S> Buf : register(t2, space4) %struct0 = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0) - @llvm.dx.handle.fromBinding.tdx.RawBuffer_sl_v4f32v4i32s_0_0t( + @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_sl_v4f32v4i32s_0_0t( i32 4, i32 2, i32 1, i32 0, i1 true) ; CHECK: [[BUF3:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 2, i32 2, i32 4, i8 0 }, i32 2, i1 true) ; CHECK: = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BUF3]], %dx.types.ResourceProperties { i32 1036, i32 32 }) ; ByteAddressBuffer Buf : register(t8, space1) %byteaddr0 = call target("dx.RawBuffer", i8, 0, 0) - @llvm.dx.handle.fromBinding.tdx.RawBuffer_i8_0_0t( + @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t( i32 1, i32 8, i32 1, i32 0, i1 false) ; CHECK: [[BUF4:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 8, i32 8, i32 1, i8 0 }, i32 8, i1 false) ; CHECK: call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BUF4]], %dx.types.ResourceProperties { i32 11, i32 0 }) @@ -57,7 +57,7 @@ define void @test_bindings() { ; Buffer<float4> typed3 = Buf[ix] %typed3_ix = call i32 @some_val() %typed3 = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f32_0_0_0t( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_0_0_0t( i32 0, i32 7, i32 -1, i32 %typed3_ix, i1 false) ; CHECK: %[[IX:.*]] = add i32 %typed3_ix, 7 ; CHECK: [[BUF5:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 7, i32 -1, i32 0, i8 0 }, i32 %[[IX]], i1 false) diff --git a/llvm/test/CodeGen/DirectX/Metadata/resource-symbols.ll b/llvm/test/CodeGen/DirectX/Metadata/resource-symbols.ll new file mode 100644 index 000000000000..6ebe4b5eb23a --- /dev/null +++ b/llvm/test/CodeGen/DirectX/Metadata/resource-symbols.ll @@ -0,0 +1,48 @@ +; RUN: opt -S -passes=dxil-translate-metadata %s | FileCheck %s + +target triple = "dxil-pc-shadermodel6.6-compute" + +%struct.S = type { <4 x float>, <4 x i32> } + +define void @test() { + ; Buffer<float4> + %float4 = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + ; CHECK: %TypedBuffer = type { <4 x float> } + + ; Buffer<int> + %int = call target("dx.TypedBuffer", i32, 0, 0, 1) + @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false) + ; CHECK: %TypedBuffer.0 = type { i32 } + + ; Buffer<uint3> + %uint3 = call target("dx.TypedBuffer", <3 x i32>, 0, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, i1 false) + ; CHECK: %TypedBuffer.1 = type { <3 x i32> } + + ; StructuredBuffer<S> + %struct0 = call target("dx.RawBuffer", %struct.S, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 0, i32 10, i32 1, i32 0, i1 true) + ; CHECK: %StructuredBuffer = type { %struct.S } + + ; ByteAddressBuffer + %byteaddr = call target("dx.RawBuffer", i8, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 0, i32 20, i32 1, i32 0, i1 false) + ; CHECK: %ByteAddressBuffer = type { i32 } + + ret void +} + +; CHECK: @[[T0:.*]] = external constant %TypedBuffer +; CHECK-NEXT: @[[T1:.*]] = external constant %TypedBuffer.0 +; CHECK-NEXT: @[[T2:.*]] = external constant %TypedBuffer.1 +; CHECK-NEXT: @[[S0:.*]] = external constant %StructuredBuffer +; CHECK-NEXT: @[[B0:.*]] = external constant %ByteAddressBuffer + +; CHECK: !{i32 0, ptr @[[T0]], !"" +; CHECK: !{i32 1, ptr @[[T1]], !"" +; CHECK: !{i32 2, ptr @[[T2]], !"" +; CHECK: !{i32 3, ptr @[[S0]], !"" +; CHECK: !{i32 4, ptr @[[B0]], !"" + +attributes #0 = { nocallback nofree nosync nounwind willreturn memory(none) } diff --git a/llvm/test/CodeGen/DirectX/ResourceAccess/load_typedbuffer.ll b/llvm/test/CodeGen/DirectX/ResourceAccess/load_typedbuffer.ll new file mode 100644 index 000000000000..9b7e7fd04f60 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ResourceAccess/load_typedbuffer.ll @@ -0,0 +1,35 @@ +; RUN: opt -S -dxil-resource-access %s | FileCheck %s + +target triple = "dxil-pc-shadermodel6.6-compute" + +declare void @use_float4(<4 x float>) +declare void @use_float(float) + +; CHECK-LABEL: define void @load_float4 +define void @load_float4(i32 %index, i32 %elemindex) { + %buffer = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( + i32 0, i32 0, i32 1, i32 0, i1 false) + + ; CHECK-NOT: @llvm.dx.resource.getpointer + %ptr = call ptr @llvm.dx.resource.getpointer( + target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index) + + ; CHECK: %[[VALUE:.*]] = call <4 x float> @llvm.dx.resource.load.typedbuffer.v4f32.tdx.TypedBuffer_v4f32_1_0_0t(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index) + %vec_data = load <4 x float>, ptr %ptr + call void @use_float4(<4 x float> %vec_data) + + ; CHECK: %[[VALUE:.*]] = call <4 x float> @llvm.dx.resource.load.typedbuffer.v4f32.tdx.TypedBuffer_v4f32_1_0_0t(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index) + ; CHECK: extractelement <4 x float> %[[VALUE]], i32 1 + %y_ptr = getelementptr inbounds <4 x float>, ptr %ptr, i32 0, i32 1 + %y_data = load float, ptr %y_ptr + call void @use_float(float %y_data) + + ; CHECK: %[[VALUE:.*]] = call <4 x float> @llvm.dx.resource.load.typedbuffer.v4f32.tdx.TypedBuffer_v4f32_1_0_0t(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index) + ; CHECK: extractelement <4 x float> %[[VALUE]], i32 %elemindex + %dynamic = getelementptr inbounds <4 x float>, ptr %ptr, i32 0, i32 %elemindex + %dyndata = load float, ptr %dynamic + call void @use_float(float %dyndata) + + ret void +} diff --git a/llvm/test/CodeGen/DirectX/ResourceAccess/store_typedbuffer.ll b/llvm/test/CodeGen/DirectX/ResourceAccess/store_typedbuffer.ll new file mode 100644 index 000000000000..17606408cadf --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ResourceAccess/store_typedbuffer.ll @@ -0,0 +1,103 @@ +; RUN: opt -S -dxil-resource-access %s | FileCheck %s + +target triple = "dxil-pc-shadermodel6.6-compute" + +; CHECK-LABEL: define void @store_float4 +define void @store_float4(<4 x float> %data, i32 %index, i32 %elemindex) { + %buffer = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( + i32 0, i32 0, i32 1, i32 0, i1 false) + + ; CHECK-NOT: @llvm.dx.resource.getpointer + %ptr = call ptr @llvm.dx.resource.getpointer( + target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index) + + ; Store the whole value + ; CHECK: call void @llvm.dx.resource.store.typedbuffer.tdx.TypedBuffer_v4f32_1_0_0t.v4f32(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index, <4 x float> %data) + store <4 x float> %data, ptr %ptr + + ; Store just the .x component + %scalar = extractelement <4 x float> %data, i32 0 + ; CHECK: %[[LOAD:.*]] = call <4 x float> @llvm.dx.resource.load.typedbuffer.v4f32.tdx.TypedBuffer_v4f32_1_0_0t(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index) + ; CHECK: %[[INSERT:.*]] = insertelement <4 x float> %[[LOAD]], float %scalar, i32 0 + ; CHECK: call void @llvm.dx.resource.store.typedbuffer.tdx.TypedBuffer_v4f32_1_0_0t.v4f32(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index, <4 x float> %[[INSERT]]) + store float %scalar, ptr %ptr + + ; Store just the .y component + ; CHECK: %[[LOAD:.*]] = call <4 x float> @llvm.dx.resource.load.typedbuffer.v4f32.tdx.TypedBuffer_v4f32_1_0_0t(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index) + ; CHECK: %[[INSERT:.*]] = insertelement <4 x float> %[[LOAD]], float %scalar, i32 1 + ; CHECK: call void @llvm.dx.resource.store.typedbuffer.tdx.TypedBuffer_v4f32_1_0_0t.v4f32(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index, <4 x float> %[[INSERT]]) + %y_ptr = getelementptr inbounds i8, ptr %ptr, i32 4 + store float %scalar, ptr %y_ptr + + ; Store to one of the elements dynamically + ; CHECK: %[[LOAD:.*]] = call <4 x float> @llvm.dx.resource.load.typedbuffer.v4f32.tdx.TypedBuffer_v4f32_1_0_0t(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index) + ; CHECK: %[[INSERT:.*]] = insertelement <4 x float> %[[LOAD]], float %scalar, i32 %elemindex + ; CHECK: call void @llvm.dx.resource.store.typedbuffer.tdx.TypedBuffer_v4f32_1_0_0t.v4f32(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index, <4 x float> %[[INSERT]]) + %dynamic = getelementptr inbounds <4 x float>, ptr %ptr, i32 0, i32 %elemindex + store float %scalar, ptr %dynamic + + ret void +} + +; CHECK-LABEL: define void @store_half4 +define void @store_half4(<4 x half> %data, i32 %index) { + %buffer = call target("dx.TypedBuffer", <4 x half>, 1, 0, 0) + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f16_1_0_0( + i32 0, i32 0, i32 1, i32 0, i1 false) + + ; CHECK-NOT: @llvm.dx.resource.getpointer + %ptr = call ptr @llvm.dx.resource.getpointer( + target("dx.TypedBuffer", <4 x half>, 1, 0, 0) %buffer, i32 %index) + + ; Store the whole value + ; CHECK: call void @llvm.dx.resource.store.typedbuffer.tdx.TypedBuffer_v4f16_1_0_0t.v4f16(target("dx.TypedBuffer", <4 x half>, 1, 0, 0) %buffer, i32 %index, <4 x half> %data) + store <4 x half> %data, ptr %ptr + + ; Store just the .x component + %scalar = extractelement <4 x half> %data, i32 0 + ; CHECK: %[[LOAD:.*]] = call <4 x half> @llvm.dx.resource.load.typedbuffer.v4f16.tdx.TypedBuffer_v4f16_1_0_0t(target("dx.TypedBuffer", <4 x half>, 1, 0, 0) %buffer, i32 %index) + ; CHECK: %[[INSERT:.*]] = insertelement <4 x half> %[[LOAD]], half %scalar, i32 0 + ; CHECK: call void @llvm.dx.resource.store.typedbuffer.tdx.TypedBuffer_v4f16_1_0_0t.v4f16(target("dx.TypedBuffer", <4 x half>, 1, 0, 0) %buffer, i32 %index, <4 x half> %[[INSERT]]) + store half %scalar, ptr %ptr + + ; Store just the .y component + ; CHECK: %[[LOAD:.*]] = call <4 x half> @llvm.dx.resource.load.typedbuffer.v4f16.tdx.TypedBuffer_v4f16_1_0_0t(target("dx.TypedBuffer", <4 x half>, 1, 0, 0) %buffer, i32 %index) + ; CHECK: %[[INSERT:.*]] = insertelement <4 x half> %[[LOAD]], half %scalar, i32 1 + ; CHECK: call void @llvm.dx.resource.store.typedbuffer.tdx.TypedBuffer_v4f16_1_0_0t.v4f16(target("dx.TypedBuffer", <4 x half>, 1, 0, 0) %buffer, i32 %index, <4 x half> %[[INSERT]]) + %y_ptr = getelementptr inbounds i8, ptr %ptr, i32 2 + store half %scalar, ptr %y_ptr + + ret void +} + +; CHECK-LABEL: define void @store_double2 +define void @store_double2(<2 x double> %data, i32 %index) { + %buffer = call target("dx.TypedBuffer", <2 x double>, 1, 0, 0) + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v2f64_1_0_0( + i32 0, i32 0, i32 1, i32 0, i1 false) + + ; CHECK-NOT: @llvm.dx.resource.getpointer + %ptr = call ptr @llvm.dx.resource.getpointer( + target("dx.TypedBuffer", <2 x double>, 1, 0, 0) %buffer, i32 %index) + + ; Store the whole value + ; CHECK: call void @llvm.dx.resource.store.typedbuffer.tdx.TypedBuffer_v2f64_1_0_0t.v2f64(target("dx.TypedBuffer", <2 x double>, 1, 0, 0) %buffer, i32 %index, <2 x double> %data) + store <2 x double> %data, ptr %ptr + + ; Store just the .x component + %scalar = extractelement <2 x double> %data, i32 0 + ; CHECK: %[[LOAD:.*]] = call <2 x double> @llvm.dx.resource.load.typedbuffer.v2f64.tdx.TypedBuffer_v2f64_1_0_0t(target("dx.TypedBuffer", <2 x double>, 1, 0, 0) %buffer, i32 %index) + ; CHECK: %[[INSERT:.*]] = insertelement <2 x double> %[[LOAD]], double %scalar, i32 0 + ; CHECK: call void @llvm.dx.resource.store.typedbuffer.tdx.TypedBuffer_v2f64_1_0_0t.v2f64(target("dx.TypedBuffer", <2 x double>, 1, 0, 0) %buffer, i32 %index, <2 x double> %[[INSERT]]) + store double %scalar, ptr %ptr + + ; Store just the .y component + ; CHECK: %[[LOAD:.*]] = call <2 x double> @llvm.dx.resource.load.typedbuffer.v2f64.tdx.TypedBuffer_v2f64_1_0_0t(target("dx.TypedBuffer", <2 x double>, 1, 0, 0) %buffer, i32 %index) + ; CHECK: %[[INSERT:.*]] = insertelement <2 x double> %[[LOAD]], double %scalar, i32 1 + ; CHECK: call void @llvm.dx.resource.store.typedbuffer.tdx.TypedBuffer_v2f64_1_0_0t.v2f64(target("dx.TypedBuffer", <2 x double>, 1, 0, 0) %buffer, i32 %index, <2 x double> %[[INSERT]]) + %y_ptr = getelementptr inbounds i8, ptr %ptr, i32 8 + store double %scalar, ptr %y_ptr + + ret void +} diff --git a/llvm/test/CodeGen/DirectX/ResourceGlobalElimination.ll b/llvm/test/CodeGen/DirectX/ResourceGlobalElimination.ll index c0fbc3d9150b..c837b36a19e1 100644 --- a/llvm/test/CodeGen/DirectX/ResourceGlobalElimination.ll +++ b/llvm/test/CodeGen/DirectX/ResourceGlobalElimination.ll @@ -21,27 +21,27 @@ define void @main() local_unnamed_addr #0 { entry: ; DXOP: %In_h.i1 = call %dx.types.Handle @dx.op.createHandle ; DXOP: %Out_h.i2 = call %dx.types.Handle @dx.op.createHandle - %In_h.i = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f32_1_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false) + %In_h.i = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false) store target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %In_h.i, ptr @In, align 4 - %Out_h.i = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f32_1_0_0t(i32 4, i32 1, i32 1, i32 0, i1 false) + %Out_h.i = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0t(i32 4, i32 1, i32 1, i32 0, i1 false) store target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %Out_h.i, ptr @Out, align 4 ; CSE: call i32 @llvm.dx.flattened.thread.id.in.group() %0 = call i32 @llvm.dx.flattened.thread.id.in.group() ; CHECK-NOT: load {{.*}} ptr @In %1 = load target("dx.TypedBuffer", <4 x float>, 1, 0, 0), ptr @In, align 4 - ; CSE: call noundef <4 x float> @llvm.dx.typedBufferLoad.v4f32.tdx.TypedBuffer_v4f32_1_0_0t - %2 = call noundef <4 x float> @llvm.dx.typedBufferLoad.v4f32.tdx.TypedBuffer_v4f32_1_0_0t(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %1, i32 %0) + ; CSE: call noundef <4 x float> @llvm.dx.resource.load.typedbuffer.v4f32.tdx.TypedBuffer_v4f32_1_0_0t + %2 = call noundef <4 x float> @llvm.dx.resource.load.typedbuffer.v4f32.tdx.TypedBuffer_v4f32_1_0_0t(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %1, i32 %0) ; CHECK-NOT: load {{.*}} ptr @In %3 = load target("dx.TypedBuffer", <4 x float>, 1, 0, 0), ptr @In, align 4 - %4 = call noundef <4 x float> @llvm.dx.typedBufferLoad.v4f32.tdx.TypedBuffer_v4f32_1_0_0t(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %3, i32 %0) + %4 = call noundef <4 x float> @llvm.dx.resource.load.typedbuffer.v4f32.tdx.TypedBuffer_v4f32_1_0_0t(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %3, i32 %0) %add.i = fadd <4 x float> %2, %4 - call void @llvm.dx.typedBufferStore.tdx.TypedBuffer_v4f32_1_0_0t.v4f32(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %Out_h.i, i32 %0, <4 x float> %add.i) + call void @llvm.dx.resource.store.typedbuffer.tdx.TypedBuffer_v4f32_1_0_0t.v4f32(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %Out_h.i, i32 %0, <4 x float> %add.i) ; CHECK: ret void ret void } -; CSE-DAG: declare <4 x float> @llvm.dx.typedBufferLoad.v4f32.tdx.TypedBuffer_v4f32_1_0_0t(target("dx.TypedBuffer", <4 x float>, 1, 0, 0), i32) [[ROAttr:#[0-9]+]] -; CSE-DAG: declare void @llvm.dx.typedBufferStore.tdx.TypedBuffer_v4f32_1_0_0t.v4f32(target("dx.TypedBuffer", <4 x float>, 1, 0, 0), i32, <4 x float>) [[WOAttr:#[0-9]+]] +; CSE-DAG: declare <4 x float> @llvm.dx.resource.load.typedbuffer.v4f32.tdx.TypedBuffer_v4f32_1_0_0t(target("dx.TypedBuffer", <4 x float>, 1, 0, 0), i32) [[ROAttr:#[0-9]+]] +; CSE-DAG: declare void @llvm.dx.resource.store.typedbuffer.tdx.TypedBuffer_v4f32_1_0_0t.v4f32(target("dx.TypedBuffer", <4 x float>, 1, 0, 0), i32, <4 x float>) [[WOAttr:#[0-9]+]] attributes #0 = { convergent noinline norecurse "frame-pointer"="all" "hlsl.numthreads"="8,1,1" "hlsl.shader"="compute" "no-trapping-math"="true" "stack-protector-buffer-size"="8" } diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/typed-uav-load-additional-formats.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/typed-uav-load-additional-formats.ll new file mode 100644 index 000000000000..26223359dfdf --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/typed-uav-load-additional-formats.ll @@ -0,0 +1,44 @@ +; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s +; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=CHECK-OBJ + +target triple = "dxil-pc-shadermodel6.7-library" + +; CHECK-OBJ: - Name: SFI0 +; CHECK-OBJ: Flags: +; CHECK-OBJ: TypedUAVLoadAdditionalFormats: true + +; CHECK: Combined Shader Flags for Module +; CHECK-NEXT: Shader Flags Value: 0x00002000 + +; CHECK: Note: shader requires additional functionality: +; CHECK: Typed UAV Load Additional Formats + +; CHECK: Function multicomponent : 0x00002000 +define <4 x float> @multicomponent() #0 { + %res = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %val = call <4 x float> @llvm.dx.resource.load.typedbuffer( + target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %res, i32 0) + ret <4 x float> %val +} + +; CHECK: Function onecomponent : 0x00000000 +define float @onecomponent() #0 { + %res = call target("dx.TypedBuffer", float, 1, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %val = call float @llvm.dx.resource.load.typedbuffer( + target("dx.TypedBuffer", float, 1, 0, 0) %res, i32 0) + ret float %val +} + +; CHECK: Function noload : 0x00000000 +define void @noload(<4 x float> %val) #0 { + %res = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + call void @llvm.dx.resource.store.typedbuffer( + target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %res, i32 0, + <4 x float> %val) + ret void +} + +attributes #0 = { convergent norecurse nounwind "hlsl.export"} diff --git a/llvm/test/CodeGen/DirectX/WaveActiveAllTrue.ll b/llvm/test/CodeGen/DirectX/WaveActiveAllTrue.ll new file mode 100644 index 000000000000..7e84f33579a6 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/WaveActiveAllTrue.ll @@ -0,0 +1,10 @@ +; RUN: opt -S -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-compute %s | FileCheck %s + +define noundef i1 @wave_all_simple(i1 noundef %p1) { +entry: +; CHECK: call i1 @dx.op.waveAllTrue(i32 114, i1 %p1) + %ret = call i1 @llvm.dx.wave.all(i1 %p1) + ret i1 %ret +} + +declare i1 @llvm.dx.wave.all(i1) diff --git a/llvm/test/CodeGen/DirectX/bufferUpdateCounter.ll b/llvm/test/CodeGen/DirectX/bufferUpdateCounter.ll index 3f2610649cba..57a47d0a39a7 100644 --- a/llvm/test/CodeGen/DirectX/bufferUpdateCounter.ll +++ b/llvm/test/CodeGen/DirectX/bufferUpdateCounter.ll @@ -7,12 +7,12 @@ target triple = "dxil-pc-shadermodel6.6-compute" define void @update_counter_decrement_vector() { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %buffer = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f32_0_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_0_0_0( i32 0, i32 0, i32 1, i32 0, i1 false) ; CHECK-NEXT: [[BUFFANOT:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] ; CHECK-NEXT: [[REG:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[BUFFANOT]], i8 -1) - %1 = call i32 @llvm.dx.bufferUpdateCounter(target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i8 -1) + %1 = call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i8 -1) ret void } @@ -20,11 +20,11 @@ define void @update_counter_decrement_vector() { define void @update_counter_increment_vector() { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %buffer = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) - @llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f32_0_0_0( + @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_0_0_0( i32 0, i32 0, i32 1, i32 0, i1 false) ; CHECK-NEXT: [[BUFFANOT:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] ; CHECK-NEXT: [[REG:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[BUFFANOT]], i8 1) - %1 = call i32 @llvm.dx.bufferUpdateCounter(target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i8 1) + %1 = call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i8 1) ret void } @@ -32,10 +32,10 @@ define void @update_counter_increment_vector() { define void @update_counter_decrement_scalar() { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %buffer = call target("dx.RawBuffer", i8, 0, 0) - @llvm.dx.handle.fromBinding.tdx.RawBuffer_i8_0_0t( + @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t( i32 1, i32 8, i32 1, i32 0, i1 false) ; CHECK-NEXT: [[BUFFANOT:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] ; CHECK-NEXT: [[REG:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[BUFFANOT]], i8 -1) - %1 = call i32 @llvm.dx.bufferUpdateCounter(target("dx.RawBuffer", i8, 0, 0) %buffer, i8 -1) + %1 = call i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", i8, 0, 0) %buffer, i8 -1) ret void } diff --git a/llvm/test/CodeGen/DirectX/flatten-bug-117273.ll b/llvm/test/CodeGen/DirectX/flatten-bug-117273.ll new file mode 100644 index 000000000000..3ae5832ce832 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/flatten-bug-117273.ll @@ -0,0 +1,23 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -S -passes='dxil-flatten-arrays,dxil-op-lower' -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s + + +@ZerroInitArr = internal constant [2 x [3 x float]] [[3 x float] zeroinitializer, [3 x float] [float 1.000000e+00, float 1.000000e+00, float 1.000000e+00]], align 16 + + +define internal void @main() { +; CHECK-LABEL: define internal void @main() { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = getelementptr [24 x float], ptr @ZerroInitArr.1dim, i32 1 +; CHECK-NEXT: [[DOTI0:%.*]] = load float, ptr [[TMP0]], align 16 +; CHECK-NEXT: [[TMP1:%.*]] = getelementptr [24 x float], ptr @ZerroInitArr.1dim, i32 2 +; CHECK-NEXT: [[DOTI03:%.*]] = load float, ptr [[TMP1]], align 16 +; CHECK-NEXT: ret void +; +entry: + %0 = getelementptr [8 x [3 x float]], ptr @ZerroInitArr, i32 0, i32 1 + %.i0 = load float, ptr %0, align 16 + %1 = getelementptr [8 x [3 x float]], ptr @ZerroInitArr, i32 0, i32 2 + %.i03 = load float, ptr %1, align 16 + ret void +} diff --git a/llvm/test/CodeGen/DirectX/llc-pipeline.ll b/llvm/test/CodeGen/DirectX/llc-pipeline.ll index 40fa30778a15..b07155724941 100644 --- a/llvm/test/CodeGen/DirectX/llc-pipeline.ll +++ b/llvm/test/CodeGen/DirectX/llc-pipeline.ll @@ -1,26 +1,40 @@ -; RUN: llc -mtriple=dxil-pc-shadermodel6.3-library -debug-pass=Structure < %s -o /dev/null 2>&1 | \ -; RUN: grep -v "Verify generated machine code" | FileCheck %s +; RUN: llc -filetype=asm -mtriple=dxil-pc-shadermodel6.3-library -debug-pass=Structure < %s -o /dev/null 2>&1 | grep -v "Verify generated machine code" | FileCheck %s --check-prefixes=CHECK,CHECK-ASM +; RUN: llc -filetype=obj -mtriple=dxil-pc-shadermodel6.3-library -debug-pass=Structure < %s -o /dev/null 2>&1 | grep -v "Verify generated machine code" | FileCheck %s --check-prefixes=CHECK,CHECK-OBJ ; REQUIRES: asserts ; CHECK-LABEL: Pass Arguments: ; CHECK-NEXT: Target Library Information +; CHECK-NEXT: DXIL Resource Type Analysis ; CHECK-NEXT: Target Transform Information + +; CHECK-OBJ-NEXT: Machine Module Information +; CHECK-OBJ-NEXT: Machine Branch Probability Analysis +; CHECK-OBJ-NEXT: Create Garbage Collector Module Metadata + ; CHECK-NEXT: ModulePass Manager ; CHECK-NEXT: DXIL Finalize Linkage ; CHECK-NEXT: DXIL Intrinsic Expansion ; CHECK-NEXT: DXIL Data Scalarization ; CHECK-NEXT: DXIL Array Flattener ; CHECK-NEXT: FunctionPass Manager +; CHECK-NEXT: DXIL Resource Access ; CHECK-NEXT: Dominator Tree Construction ; CHECK-NEXT: Scalarize vector operations -; CHECK-NEXT: DXIL Resource analysis -; CHECK-NEXT: DXIL Op Lowering +; CHECK-NEXT: DXIL Resource Binding Analysis ; CHECK-NEXT: DXIL resource Information ; CHECK-NEXT: DXIL Shader Flag Analysis ; CHECK-NEXT: DXIL Module Metadata analysis ; CHECK-NEXT: DXIL Translate Metadata +; CHECK-NEXT: DXIL Op Lowering ; CHECK-NEXT: DXIL Prepare Module -; CHECK-NEXT: DXIL Metadata Pretty Printer -; CHECK-NEXT: Print Module IR - + +; CHECK-ASM-NEXT: DXIL Metadata Pretty Printer +; CHECK-ASM-NEXT: Print Module IR + +; CHECK-OBJ-NEXT: DXIL Embedder +; CHECK-OBJ-NEXT: DXContainer Global Emitter +; CHECK-OBJ-NEXT: FunctionPass Manager +; CHECK-OBJ-NEXT: Lazy Machine Block Frequency Analysis +; CHECK-OBJ-NEXT: Machine Optimization Remark Emitter +; CHECK-OBJ-NEXT: DXIL Assembly Printer diff --git a/llvm/test/CodeGen/DirectX/llc-vector-load-scalarize.ll b/llvm/test/CodeGen/DirectX/llc-vector-load-scalarize.ll index 597252038365..4e522c6ef5da 100644 --- a/llvm/test/CodeGen/DirectX/llc-vector-load-scalarize.ll +++ b/llvm/test/CodeGen/DirectX/llc-vector-load-scalarize.ll @@ -21,7 +21,6 @@ ; CHECK-NOT: @groushared2dArrayofVectors ; CHECK-NOT: @groushared2dArrayofVectors.scalarized - define <4 x i32> @load_array_vec_test() #0 { ; CHECK-LABEL: define <4 x i32> @load_array_vec_test( ; CHECK-SAME: ) #[[ATTR0:[0-9]+]] { @@ -33,18 +32,13 @@ define <4 x i32> @load_array_vec_test() #0 { ; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr addrspace(3) [[TMP5]], align 4 ; CHECK-NEXT: [[TMP7:%.*]] = bitcast ptr addrspace(3) getelementptr (i32, ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 3) to ptr addrspace(3) ; CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr addrspace(3) [[TMP7]], align 4 -; CHECK-NEXT: [[TMP9:%.*]] = bitcast ptr addrspace(3) @arrayofVecData.scalarized.1dim to ptr addrspace(3) -; CHECK-NEXT: [[TMP10:%.*]] = getelementptr [2 x [3 x float]], ptr addrspace(3) [[TMP9]], i32 0, i32 1 -; CHECK-NEXT: [[TMP11:%.*]] = bitcast ptr addrspace(3) [[TMP10]] to ptr addrspace(3) +; CHECK-NEXT: [[TMP11:%.*]] = bitcast ptr addrspace(3) getelementptr inbounds ([6 x float], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 1) to ptr addrspace(3) ; CHECK-NEXT: [[TMP12:%.*]] = load i32, ptr addrspace(3) [[TMP11]], align 4 -; CHECK-NEXT: [[TMP13:%.*]] = bitcast ptr addrspace(3) [[TMP10]] to ptr addrspace(3) -; CHECK-NEXT: [[DOTI12:%.*]] = getelementptr i32, ptr addrspace(3) [[TMP13]], i32 1 +; CHECK-NEXT: [[DOTI12:%.*]] = bitcast ptr addrspace(3) getelementptr (i32, ptr addrspace(3) getelementptr inbounds ([6 x float], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 1), i32 1) to ptr addrspace(3) ; CHECK-NEXT: [[DOTI13:%.*]] = load i32, ptr addrspace(3) [[DOTI12]], align 4 -; CHECK-NEXT: [[TMP14:%.*]] = bitcast ptr addrspace(3) [[TMP10]] to ptr addrspace(3) -; CHECK-NEXT: [[DOTI24:%.*]] = getelementptr i32, ptr addrspace(3) [[TMP14]], i32 2 +; CHECK-NEXT: [[DOTI24:%.*]] = bitcast ptr addrspace(3) getelementptr (i32, ptr addrspace(3) getelementptr inbounds ([6 x float], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 1), i32 2) to ptr addrspace(3) ; CHECK-NEXT: [[DOTI25:%.*]] = load i32, ptr addrspace(3) [[DOTI24]], align 4 -; CHECK-NEXT: [[TMP15:%.*]] = bitcast ptr addrspace(3) [[TMP10]] to ptr addrspace(3) -; CHECK-NEXT: [[DOTI36:%.*]] = getelementptr i32, ptr addrspace(3) [[TMP15]], i32 3 +; CHECK-NEXT: [[DOTI36:%.*]] = bitcast ptr addrspace(3) getelementptr (i32, ptr addrspace(3) getelementptr inbounds ([6 x float], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 1), i32 3) to ptr addrspace(3) ; CHECK-NEXT: [[DOTI37:%.*]] = load i32, ptr addrspace(3) [[DOTI36]], align 4 ; CHECK-NEXT: [[DOTI08:%.*]] = add i32 [[TMP2]], [[TMP12]] ; CHECK-NEXT: [[DOTI19:%.*]] = add i32 [[TMP4]], [[DOTI13]] @@ -87,7 +81,7 @@ define <4 x i32> @load_vec_test() #0 { define <4 x i32> @load_static_array_of_vec_test(i32 %index) #0 { ; CHECK-LABEL: define <4 x i32> @load_static_array_of_vec_test( ; CHECK-SAME: i32 [[INDEX:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[DOTFLAT:%.*]] = getelementptr [12 x i32], ptr @staticArrayOfVecData.scalarized.1dim, i32 [[INDEX]] +; CHECK-NEXT: [[DOTFLAT:%.*]] = getelementptr inbounds [12 x i32], ptr @staticArrayOfVecData.scalarized.1dim, i32 [[INDEX]] ; CHECK-NEXT: [[TMP1:%.*]] = bitcast ptr [[DOTFLAT]] to ptr ; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4 ; CHECK-NEXT: [[TMP3:%.*]] = bitcast ptr [[DOTFLAT]] to ptr @@ -121,18 +115,13 @@ define <4 x i32> @multid_load_test() #0 { ; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr addrspace(3) [[TMP5]], align 4 ; CHECK-NEXT: [[TMP7:%.*]] = bitcast ptr addrspace(3) getelementptr (i32, ptr addrspace(3) @groushared2dArrayofVectors.scalarized.1dim, i32 3) to ptr addrspace(3) ; CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr addrspace(3) [[TMP7]], align 4 -; CHECK-NEXT: [[TMP9:%.*]] = bitcast ptr addrspace(3) @groushared2dArrayofVectors.scalarized.1dim to ptr addrspace(3) -; CHECK-NEXT: [[TMP10:%.*]] = getelementptr [3 x [3 x [4 x i32]]], ptr addrspace(3) [[TMP9]], i32 0, i32 1, i32 1 -; CHECK-NEXT: [[TMP11:%.*]] = bitcast ptr addrspace(3) [[TMP10]] to ptr addrspace(3) +; CHECK-NEXT: [[TMP11:%.*]] = bitcast ptr addrspace(3) getelementptr inbounds ([36 x i32], ptr addrspace(3) @groushared2dArrayofVectors.scalarized.1dim, i32 1) to ptr addrspace(3) ; CHECK-NEXT: [[TMP12:%.*]] = load i32, ptr addrspace(3) [[TMP11]], align 4 -; CHECK-NEXT: [[TMP13:%.*]] = bitcast ptr addrspace(3) [[TMP10]] to ptr addrspace(3) -; CHECK-NEXT: [[DOTI12:%.*]] = getelementptr i32, ptr addrspace(3) [[TMP13]], i32 1 +; CHECK-NEXT: [[DOTI12:%.*]] = bitcast ptr addrspace(3) getelementptr (i32, ptr addrspace(3) getelementptr inbounds ([36 x i32], ptr addrspace(3) @groushared2dArrayofVectors.scalarized.1dim, i32 1), i32 1) to ptr addrspace(3) ; CHECK-NEXT: [[DOTI13:%.*]] = load i32, ptr addrspace(3) [[DOTI12]], align 4 -; CHECK-NEXT: [[TMP14:%.*]] = bitcast ptr addrspace(3) [[TMP10]] to ptr addrspace(3) -; CHECK-NEXT: [[DOTI24:%.*]] = getelementptr i32, ptr addrspace(3) [[TMP14]], i32 2 +; CHECK-NEXT: [[DOTI24:%.*]] = bitcast ptr addrspace(3) getelementptr (i32, ptr addrspace(3) getelementptr inbounds ([36 x i32], ptr addrspace(3) @groushared2dArrayofVectors.scalarized.1dim, i32 1), i32 2) to ptr addrspace(3) ; CHECK-NEXT: [[DOTI25:%.*]] = load i32, ptr addrspace(3) [[DOTI24]], align 4 -; CHECK-NEXT: [[TMP15:%.*]] = bitcast ptr addrspace(3) [[TMP10]] to ptr addrspace(3) -; CHECK-NEXT: [[DOTI36:%.*]] = getelementptr i32, ptr addrspace(3) [[TMP15]], i32 3 +; CHECK-NEXT: [[DOTI36:%.*]] = bitcast ptr addrspace(3) getelementptr (i32, ptr addrspace(3) getelementptr inbounds ([36 x i32], ptr addrspace(3) @groushared2dArrayofVectors.scalarized.1dim, i32 1), i32 3) to ptr addrspace(3) ; CHECK-NEXT: [[DOTI37:%.*]] = load i32, ptr addrspace(3) [[DOTI36]], align 4 ; CHECK-NEXT: [[DOTI08:%.*]] = add i32 [[TMP2]], [[TMP12]] ; CHECK-NEXT: [[DOTI19:%.*]] = add i32 [[TMP4]], [[DOTI13]] diff --git a/llvm/test/CodeGen/DirectX/scalar-bug-117273.ll b/llvm/test/CodeGen/DirectX/scalar-bug-117273.ll new file mode 100644 index 000000000000..25dc2c36b4e1 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/scalar-bug-117273.ll @@ -0,0 +1,25 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -S -passes='dxil-data-scalarization,dxil-flatten-arrays,function(scalarizer<load-store>),dxil-op-lower' -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s + + +@StaticArr = internal constant [8 x <3 x float>] [<3 x float> zeroinitializer, <3 x float> splat (float 5.000000e-01), <3 x float> <float 1.000000e+00, float 5.000000e-01, float 5.000000e-01>, <3 x float> <float 5.000000e-01, float 1.000000e+00, float 5.000000e-01>, <3 x float> <float 5.000000e-01, float 5.000000e-01, float 1.000000e+00>, <3 x float> <float 5.000000e-01, float 1.000000e+00, float 1.000000e+00>, <3 x float> <float 1.000000e+00, float 5.000000e-01, float 1.000000e+00>, <3 x float> <float 1.000000e+00, float 1.000000e+00, float 5.000000e-01>], align 16 + +; Function Attrs: alwaysinline convergent mustprogress norecurse nounwind +define internal void @main() #1 { +; CHECK-LABEL: define internal void @main() { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[DOTI0:%.*]] = load float, ptr getelementptr inbounds ([24 x float], ptr @StaticArr.scalarized.1dim, i32 1), align 16 +; CHECK-NEXT: [[DOTI1:%.*]] = load float, ptr getelementptr (float, ptr getelementptr inbounds ([24 x float], ptr @StaticArr.scalarized.1dim, i32 1), i32 1), align 4 +; CHECK-NEXT: [[DOTI2:%.*]] = load float, ptr getelementptr (float, ptr getelementptr inbounds ([24 x float], ptr @StaticArr.scalarized.1dim, i32 1), i32 2), align 8 +; CHECK-NEXT: [[DOTI01:%.*]] = load float, ptr getelementptr inbounds ([24 x float], ptr @StaticArr.scalarized.1dim, i32 2), align 16 +; CHECK-NEXT: [[DOTI12:%.*]] = load float, ptr getelementptr (float, ptr getelementptr inbounds ([24 x float], ptr @StaticArr.scalarized.1dim, i32 2), i32 1), align 4 +; CHECK-NEXT: [[DOTI23:%.*]] = load float, ptr getelementptr (float, ptr getelementptr inbounds ([24 x float], ptr @StaticArr.scalarized.1dim, i32 2), i32 2), align 8 +; CHECK-NEXT: ret void +; +entry: + %arrayidx = getelementptr inbounds [8 x <3 x float>], ptr @StaticArr, i32 0, i32 1 + %2 = load <3 x float>, ptr %arrayidx, align 16 + %arrayidx2 = getelementptr inbounds [8 x <3 x float>], ptr @StaticArr, i32 0, i32 2 + %3 = load <3 x float>, ptr %arrayidx2, align 16 + ret void +} diff --git a/llvm/test/CodeGen/DirectX/scalar-load.ll b/llvm/test/CodeGen/DirectX/scalar-load.ll index a32db8b8e399..ed1e9109b7b1 100644 --- a/llvm/test/CodeGen/DirectX/scalar-load.ll +++ b/llvm/test/CodeGen/DirectX/scalar-load.ll @@ -2,10 +2,10 @@ ; Make sure we can load groupshared, static vectors and arrays of vectors -@"arrayofVecData" = local_unnamed_addr addrspace(3) global [2 x <3 x float>] zeroinitializer, align 16 -@"vecData" = external addrspace(3) global <4 x i32>, align 4 +@arrayofVecData = local_unnamed_addr addrspace(3) global [2 x <3 x float>] zeroinitializer, align 16 +@vecData = external addrspace(3) global <4 x i32>, align 4 @staticArrayOfVecData = internal global [3 x <4 x i32>] [<4 x i32> <i32 1, i32 2, i32 3, i32 4>, <4 x i32> <i32 5, i32 6, i32 7, i32 8>, <4 x i32> <i32 9, i32 10, i32 11, i32 12>], align 4 -@"groushared2dArrayofVectors" = local_unnamed_addr addrspace(3) global [3 x [ 3 x <4 x i32>]] zeroinitializer, align 16 +@groushared2dArrayofVectors = local_unnamed_addr addrspace(3) global [3 x [ 3 x <4 x i32>]] zeroinitializer, align 16 ; CHECK: @arrayofVecData.scalarized = local_unnamed_addr addrspace(3) global [2 x [3 x float]] zeroinitializer, align 16 ; CHECK: @vecData.scalarized = external addrspace(3) global [4 x i32], align 4 @@ -19,12 +19,12 @@ ; CHECK-LABEL: load_array_vec_test -define <4 x i32> @load_array_vec_test() #0 { - ; CHECK-COUNT-8: load i32, ptr addrspace(3) {{(.*@arrayofVecData.scalarized.*|%.*)}}, align 4 - %1 = load <4 x i32>, <4 x i32> addrspace(3)* getelementptr inbounds ([2 x <4 x i32>], [2 x <4 x i32>] addrspace(3)* @"arrayofVecData", i32 0, i32 0), align 4 - %2 = load <4 x i32>, <4 x i32> addrspace(3)* getelementptr inbounds ([2 x <4 x i32>], [2 x <4 x i32>] addrspace(3)* @"arrayofVecData", i32 0, i32 1), align 4 - %3 = add <4 x i32> %1, %2 - ret <4 x i32> %3 +define <3 x float> @load_array_vec_test() #0 { + ; CHECK-COUNT-6: load float, ptr addrspace(3) {{(.*@arrayofVecData.scalarized.*|%.*)}}, align 4 + %1 = load <3 x float>, <3 x float> addrspace(3)* getelementptr inbounds ([2 x <3 x float>], [2 x <3 x float>] addrspace(3)* @"arrayofVecData", i32 0, i32 0), align 4 + %2 = load <3 x float>, <3 x float> addrspace(3)* getelementptr inbounds ([2 x <3 x float>], [2 x <3 x float>] addrspace(3)* @"arrayofVecData", i32 0, i32 1), align 4 + %3 = fadd <3 x float> %1, %2 + ret <3 x float> %3 } ; CHECK-LABEL: load_vec_test @@ -36,8 +36,14 @@ define <4 x i32> @load_vec_test() #0 { ; CHECK-LABEL: load_static_array_of_vec_test define <4 x i32> @load_static_array_of_vec_test(i32 %index) #0 { - ; CHECK: getelementptr [3 x [4 x i32]], ptr @staticArrayOfVecData.scalarized, i32 0, i32 %index - ; CHECK-COUNT-4: load i32, ptr {{.*}}, align 4 + ; CHECK: getelementptr inbounds [3 x [4 x i32]], ptr @staticArrayOfVecData.scalarized, i32 0, i32 %index + ; CHECK: load i32, ptr {{.*}}, align 4 + ; CHECK: getelementptr i32, ptr {{.*}}, i32 1 + ; CHECK: load i32, ptr {{.*}}, align 4 + ; CHECK: getelementptr i32, ptr {{.*}}, i32 2 + ; CHECK: load i32, ptr {{.*}}, align 4 + ; CHECK: getelementptr i32, ptr {{.*}}, i32 3 + ; CHECK: load i32, ptr {{.*}}, align 4 %3 = getelementptr inbounds [3 x <4 x i32>], [3 x <4 x i32>]* @staticArrayOfVecData, i32 0, i32 %index %4 = load <4 x i32>, <4 x i32>* %3, align 4 ret <4 x i32> %4 diff --git a/llvm/test/CodeGen/DirectX/vector_reduce_add.ll b/llvm/test/CodeGen/DirectX/vector_reduce_add.ll new file mode 100644 index 000000000000..d4ee16a24cb4 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/vector_reduce_add.ll @@ -0,0 +1,343 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -S -dxil-intrinsic-expansion < %s | FileCheck %s + +; Make sure dxil operation function calls for lvm.vector.reduce.fadd and lvm.vector.reduce.add are generate. + +define noundef half @test_length_half2(<2 x half> noundef %p0) { +; CHECK-LABEL: define noundef half @test_length_half2( +; CHECK-SAME: <2 x half> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <2 x half> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x half> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = fadd half [[TMP0]], [[TMP1]] +; CHECK-NEXT: ret half [[TMP2]] +; +entry: + %rdx.fadd = call half @llvm.vector.reduce.fadd.v2f16(half 0xH0000, <2 x half> %p0) + ret half %rdx.fadd +} + +define noundef half @test_length_half2_start1(<2 x half> noundef %p0) { +; CHECK-LABEL: define noundef half @test_length_half2_start1( +; CHECK-SAME: <2 x half> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <2 x half> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = fadd half [[TMP0]], 0xH0001 +; CHECK-NEXT: [[TMP2:%.*]] = extractelement <2 x half> [[P0]], i64 1 +; CHECK-NEXT: [[TMP3:%.*]] = fadd half [[TMP1]], [[TMP2]] +; CHECK-NEXT: ret half [[TMP3]] +; +entry: + %rdx.fadd = call half @llvm.vector.reduce.fadd.v2f16(half 0xH0001, <2 x half> %p0) + ret half %rdx.fadd +} + +define noundef half @test_length_half3(<3 x half> noundef %p0) { +; CHECK-LABEL: define noundef half @test_length_half3( +; CHECK-SAME: <3 x half> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <3 x half> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <3 x half> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = fadd half [[TMP0]], [[TMP1]] +; CHECK-NEXT: [[TMP3:%.*]] = extractelement <3 x half> [[P0]], i64 2 +; CHECK-NEXT: [[TMP4:%.*]] = fadd half [[TMP2]], [[TMP3]] +; CHECK-NEXT: ret half [[TMP4]] +; +entry: + %rdx.fadd = call half @llvm.vector.reduce.fadd.v3f16(half 0xH0000, <3 x half> %p0) + ret half %rdx.fadd +} + +define noundef half @test_length_half4(<4 x half> noundef %p0) { +; CHECK-LABEL: define noundef half @test_length_half4( +; CHECK-SAME: <4 x half> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <4 x half> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x half> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = fadd half [[TMP0]], [[TMP1]] +; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x half> [[P0]], i64 2 +; CHECK-NEXT: [[TMP4:%.*]] = fadd half [[TMP2]], [[TMP3]] +; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x half> [[P0]], i64 3 +; CHECK-NEXT: [[TMP6:%.*]] = fadd half [[TMP4]], [[TMP5]] +; CHECK-NEXT: ret half [[TMP6]] +; +entry: + %rdx.fadd = call half @llvm.vector.reduce.fadd.v4f16(half 0xH0000, <4 x half> %p0) + ret half %rdx.fadd +} + +define noundef float @test_length_float2(<2 x float> noundef %p0) { +; CHECK-LABEL: define noundef float @test_length_float2( +; CHECK-SAME: <2 x float> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <2 x float> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x float> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = fadd float [[TMP0]], [[TMP1]] +; CHECK-NEXT: ret float [[TMP2]] +; +entry: + %rdx.fadd = call float @llvm.vector.reduce.fadd.v2f32(float 0.000000e+00, <2 x float> %p0) + ret float %rdx.fadd +} + +define noundef float @test_length_float3(<3 x float> noundef %p0) { +; CHECK-LABEL: define noundef float @test_length_float3( +; CHECK-SAME: <3 x float> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <3 x float> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <3 x float> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = fadd float [[TMP0]], [[TMP1]] +; CHECK-NEXT: [[TMP3:%.*]] = extractelement <3 x float> [[P0]], i64 2 +; CHECK-NEXT: [[TMP4:%.*]] = fadd float [[TMP2]], [[TMP3]] +; CHECK-NEXT: ret float [[TMP4]] +; +entry: + %rdx.fadd = call float @llvm.vector.reduce.fadd.v3f32(float 0.000000e+00, <3 x float> %p0) + ret float %rdx.fadd +} + +define noundef float @test_length_float3_start1(<3 x float> noundef %p0) { +; CHECK-LABEL: define noundef float @test_length_float3_start1( +; CHECK-SAME: <3 x float> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <3 x float> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = fadd float [[TMP0]], 1.000000e+00 +; CHECK-NEXT: [[TMP2:%.*]] = extractelement <3 x float> [[P0]], i64 1 +; CHECK-NEXT: [[TMP3:%.*]] = fadd float [[TMP1]], [[TMP2]] +; CHECK-NEXT: [[TMP4:%.*]] = extractelement <3 x float> [[P0]], i64 2 +; CHECK-NEXT: [[TMP5:%.*]] = fadd float [[TMP3]], [[TMP4]] +; CHECK-NEXT: ret float [[TMP5]] +; +entry: + %rdx.fadd = call float @llvm.vector.reduce.fadd.v3f32(float 1.000000e+00, <3 x float> %p0) + ret float %rdx.fadd +} + +define noundef float @test_length_float4(<4 x float> noundef %p0) { +; CHECK-LABEL: define noundef float @test_length_float4( +; CHECK-SAME: <4 x float> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <4 x float> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x float> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = fadd float [[TMP0]], [[TMP1]] +; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x float> [[P0]], i64 2 +; CHECK-NEXT: [[TMP4:%.*]] = fadd float [[TMP2]], [[TMP3]] +; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x float> [[P0]], i64 3 +; CHECK-NEXT: [[TMP6:%.*]] = fadd float [[TMP4]], [[TMP5]] +; CHECK-NEXT: ret float [[TMP6]] +; +entry: + %rdx.fadd = call float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> %p0) + ret float %rdx.fadd +} + +define noundef double @test_length_double2(<2 x double> noundef %p0) { +; CHECK-LABEL: define noundef double @test_length_double2( +; CHECK-SAME: <2 x double> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <2 x double> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x double> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = fadd double [[TMP0]], [[TMP1]] +; CHECK-NEXT: ret double [[TMP2]] +; +entry: + %rdx.fadd = call double @llvm.vector.reduce.fadd.v2f64(double 0.000000e+00, <2 x double> %p0) + ret double %rdx.fadd +} + +define noundef double @test_length_double3(<3 x double> noundef %p0) { +; CHECK-LABEL: define noundef double @test_length_double3( +; CHECK-SAME: <3 x double> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <3 x double> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <3 x double> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = fadd double [[TMP0]], [[TMP1]] +; CHECK-NEXT: [[TMP3:%.*]] = extractelement <3 x double> [[P0]], i64 2 +; CHECK-NEXT: [[TMP4:%.*]] = fadd double [[TMP2]], [[TMP3]] +; CHECK-NEXT: ret double [[TMP4]] +; +entry: + %rdx.fadd = call double @llvm.vector.reduce.fadd.v3f64(double 0.000000e+00, <3 x double> %p0) + ret double %rdx.fadd +} + +define noundef double @test_length_double4(<4 x double> noundef %p0) { +; CHECK-LABEL: define noundef double @test_length_double4( +; CHECK-SAME: <4 x double> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <4 x double> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x double> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = fadd double [[TMP0]], [[TMP1]] +; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x double> [[P0]], i64 2 +; CHECK-NEXT: [[TMP4:%.*]] = fadd double [[TMP2]], [[TMP3]] +; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x double> [[P0]], i64 3 +; CHECK-NEXT: [[TMP6:%.*]] = fadd double [[TMP4]], [[TMP5]] +; CHECK-NEXT: ret double [[TMP6]] +; +entry: + %rdx.fadd = call double @llvm.vector.reduce.fadd.v4f64(double 0.000000e+00, <4 x double> %p0) + ret double %rdx.fadd +} + +define noundef double @test_length_double4_start1(<4 x double> noundef %p0) { +; CHECK-LABEL: define noundef double @test_length_double4_start1( +; CHECK-SAME: <4 x double> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <4 x double> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = fadd double [[TMP0]], 1.000000e+00 +; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x double> [[P0]], i64 1 +; CHECK-NEXT: [[TMP3:%.*]] = fadd double [[TMP1]], [[TMP2]] +; CHECK-NEXT: [[TMP4:%.*]] = extractelement <4 x double> [[P0]], i64 2 +; CHECK-NEXT: [[TMP5:%.*]] = fadd double [[TMP3]], [[TMP4]] +; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x double> [[P0]], i64 3 +; CHECK-NEXT: [[TMP7:%.*]] = fadd double [[TMP5]], [[TMP6]] +; CHECK-NEXT: ret double [[TMP7]] +; +entry: + %rdx.fadd = call double @llvm.vector.reduce.fadd.v4f64(double 1.000000e+00, <4 x double> %p0) + ret double %rdx.fadd +} + +define noundef i16 @test_length_short2(<2 x i16> noundef %p0) { +; CHECK-LABEL: define noundef i16 @test_length_short2( +; CHECK-SAME: <2 x i16> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <2 x i16> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x i16> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = add i16 [[TMP0]], [[TMP1]] +; CHECK-NEXT: ret i16 [[TMP2]] +; +entry: + %rdx.add = call i16 @llvm.vector.reduce.add.v2i16(<2 x i16> %p0) + ret i16 %rdx.add +} + +define noundef i16 @test_length_short3(<3 x i16> noundef %p0) { +; CHECK-LABEL: define noundef i16 @test_length_short3( +; CHECK-SAME: <3 x i16> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <3 x i16> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <3 x i16> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = add i16 [[TMP0]], [[TMP1]] +; CHECK-NEXT: [[TMP3:%.*]] = extractelement <3 x i16> [[P0]], i64 2 +; CHECK-NEXT: [[TMP4:%.*]] = add i16 [[TMP2]], [[TMP3]] +; CHECK-NEXT: ret i16 [[TMP4]] +; +entry: + %rdx.fadd = call i16 @llvm.vector.reduce.add.v3i16(<3 x i16> %p0) + ret i16 %rdx.fadd +} + +define noundef i16 @test_length_short4(<4 x i16> noundef %p0) { +; CHECK-LABEL: define noundef i16 @test_length_short4( +; CHECK-SAME: <4 x i16> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <4 x i16> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i16> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = add i16 [[TMP0]], [[TMP1]] +; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x i16> [[P0]], i64 2 +; CHECK-NEXT: [[TMP4:%.*]] = add i16 [[TMP2]], [[TMP3]] +; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x i16> [[P0]], i64 3 +; CHECK-NEXT: [[TMP6:%.*]] = add i16 [[TMP4]], [[TMP5]] +; CHECK-NEXT: ret i16 [[TMP6]] +; +entry: + %rdx.fadd = call i16 @llvm.vector.reduce.add.v4i16(<4 x i16> %p0) + ret i16 %rdx.fadd +} + +define noundef i32 @test_length_int2(<2 x i32> noundef %p0) { +; CHECK-LABEL: define noundef i32 @test_length_int2( +; CHECK-SAME: <2 x i32> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <2 x i32> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x i32> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP0]], [[TMP1]] +; CHECK-NEXT: ret i32 [[TMP2]] +; +entry: + %rdx.add = call i32 @llvm.vector.reduce.add.v2i32(<2 x i32> %p0) + ret i32 %rdx.add +} + +define noundef i32 @test_length_int3(<3 x i32> noundef %p0) { +; CHECK-LABEL: define noundef i32 @test_length_int3( +; CHECK-SAME: <3 x i32> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <3 x i32> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <3 x i32> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP0]], [[TMP1]] +; CHECK-NEXT: [[TMP3:%.*]] = extractelement <3 x i32> [[P0]], i64 2 +; CHECK-NEXT: [[TMP4:%.*]] = add i32 [[TMP2]], [[TMP3]] +; CHECK-NEXT: ret i32 [[TMP4]] +; +entry: + %rdx.fadd = call i32 @llvm.vector.reduce.add.v3i32(<3 x i32> %p0) + ret i32 %rdx.fadd +} + +define noundef i32 @test_length_int4(<4 x i32> noundef %p0) { +; CHECK-LABEL: define noundef i32 @test_length_int4( +; CHECK-SAME: <4 x i32> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <4 x i32> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i32> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP0]], [[TMP1]] +; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x i32> [[P0]], i64 2 +; CHECK-NEXT: [[TMP4:%.*]] = add i32 [[TMP2]], [[TMP3]] +; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x i32> [[P0]], i64 3 +; CHECK-NEXT: [[TMP6:%.*]] = add i32 [[TMP4]], [[TMP5]] +; CHECK-NEXT: ret i32 [[TMP6]] +; +entry: + %rdx.fadd = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %p0) + ret i32 %rdx.fadd +} + +define noundef i64 @test_length_int64_2(<2 x i64> noundef %p0) { +; CHECK-LABEL: define noundef i64 @test_length_int64_2( +; CHECK-SAME: <2 x i64> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <2 x i64> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x i64> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP0]], [[TMP1]] +; CHECK-NEXT: ret i64 [[TMP2]] +; +entry: + %rdx.add = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %p0) + ret i64 %rdx.add +} + +define noundef i64 @test_length_int64_3(<3 x i64> noundef %p0) { +; CHECK-LABEL: define noundef i64 @test_length_int64_3( +; CHECK-SAME: <3 x i64> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <3 x i64> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <3 x i64> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP0]], [[TMP1]] +; CHECK-NEXT: [[TMP3:%.*]] = extractelement <3 x i64> [[P0]], i64 2 +; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[TMP2]], [[TMP3]] +; CHECK-NEXT: ret i64 [[TMP4]] +; +entry: + %rdx.fadd = call i64 @llvm.vector.reduce.add.v3i64(<3 x i64> %p0) + ret i64 %rdx.fadd +} + +define noundef i64 @test_length_int64_4(<4 x i64> noundef %p0) { +; CHECK-LABEL: define noundef i64 @test_length_int64_4( +; CHECK-SAME: <4 x i64> noundef [[P0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <4 x i64> [[P0]], i64 0 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i64> [[P0]], i64 1 +; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP0]], [[TMP1]] +; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x i64> [[P0]], i64 2 +; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[TMP2]], [[TMP3]] +; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x i64> [[P0]], i64 3 +; CHECK-NEXT: [[TMP6:%.*]] = add i64 [[TMP4]], [[TMP5]] +; CHECK-NEXT: ret i64 [[TMP6]] +; +entry: + %rdx.fadd = call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p0) + ret i64 %rdx.fadd +} |
