@@ -2851,13 +2851,29 @@ TEST_F(IR_BuiltinPolyfillTest, Dot4U8Packed) {
2851
2851
EXPECT_EQ (expect, str ());
2852
2852
}
2853
2853
2854
- TEST_F (IR_BuiltinPolyfillTest, SubgroupBroadcastF16_NoPolyfill) {
2855
- Build (core::BuiltinFn::kSubgroupBroadcast , ty.f16 (), Vector{ty.f16 (), ty.u32 ()});
2854
+ class IR_SubgroupBroadcastPolyfillTest : public TransformTest {
2855
+ protected:
2856
+ // / Helper to build a function that calls subgroupBroadcast with the given type.
2857
+ // / @param type the type
2858
+ void Build (const core::type::Type* type) {
2859
+ auto * param = b.FunctionParam (" arg" , type);
2860
+ auto * func = b.Function (" foo" , type);
2861
+ func->SetParams ({param});
2862
+ b.Append (func->Block (), [&] {
2863
+ auto * result = b.Call (type, BuiltinFn::kSubgroupBroadcast , param, 1_u);
2864
+ b.Return (func, result);
2865
+ mod.SetName (result, " result" );
2866
+ });
2867
+ }
2868
+ };
2869
+
2870
+ TEST_F (IR_SubgroupBroadcastPolyfillTest, SubgroupBroadcastF16_NoPolyfill) {
2871
+ Build (ty.f16 ());
2856
2872
2857
2873
auto * src = R"(
2858
- %foo = func(%arg:f16, %arg_1:u32 ):f16 { # %arg_1: 'arg'
2874
+ %foo = func(%arg:f16):f16 {
2859
2875
$B1: {
2860
- %result:f16 = subgroupBroadcast %arg, %arg_1
2876
+ %result:f16 = subgroupBroadcast %arg, 1u
2861
2877
ret %result
2862
2878
}
2863
2879
}
@@ -2873,13 +2889,13 @@ TEST_F(IR_BuiltinPolyfillTest, SubgroupBroadcastF16_NoPolyfill) {
2873
2889
EXPECT_EQ (expect, str ());
2874
2890
}
2875
2891
2876
- TEST_F (IR_BuiltinPolyfillTest, SubgroupBroadcast_F32_NotPolyfilled ) {
2877
- Build (core::BuiltinFn:: kSubgroupBroadcast , ty.f32 (), Vector{ty. f32 (), ty. u32 ()} );
2892
+ TEST_F (IR_SubgroupBroadcastPolyfillTest, SubgroupBroadcastF32_NoPolyfill ) {
2893
+ Build (ty.f32 ());
2878
2894
2879
2895
auto * src = R"(
2880
- %foo = func(%arg:f32, %arg_1:u32 ):f32 { # %arg_1: 'arg'
2896
+ %foo = func(%arg:f32):f32 {
2881
2897
$B1: {
2882
- %result:f32 = subgroupBroadcast %arg, %arg_1
2898
+ %result:f32 = subgroupBroadcast %arg, 1u
2883
2899
ret %result
2884
2900
}
2885
2901
}
@@ -2895,27 +2911,27 @@ TEST_F(IR_BuiltinPolyfillTest, SubgroupBroadcast_F32_NotPolyfilled) {
2895
2911
EXPECT_EQ (expect, str ());
2896
2912
}
2897
2913
2898
- TEST_F (IR_BuiltinPolyfillTest , SubgroupBroadcastF16_Scalar) {
2899
- Build (core::BuiltinFn:: kSubgroupBroadcast , ty.f16 (), Vector{ty. f16 (), ty. u32 ()} );
2914
+ TEST_F (IR_SubgroupBroadcastPolyfillTest , SubgroupBroadcastF16_Scalar) {
2915
+ Build (ty.f16 ());
2900
2916
2901
2917
auto * src = R"(
2902
- %foo = func(%arg:f16, %arg_1:u32 ):f16 { # %arg_1: 'arg'
2918
+ %foo = func(%arg:f16):f16 {
2903
2919
$B1: {
2904
- %result:f16 = subgroupBroadcast %arg, %arg_1
2920
+ %result:f16 = subgroupBroadcast %arg, 1u
2905
2921
ret %result
2906
2922
}
2907
2923
}
2908
2924
)" ;
2909
2925
2910
2926
auto * expect = R"(
2911
- %foo = func(%arg:f16, %arg_1:u32 ):f16 { # %arg_1: 'arg'
2927
+ %foo = func(%arg:f16):f16 {
2912
2928
$B1: {
2913
- %4 :vec2<f16> = construct %arg, 0.0h
2914
- %5 :u32 = bitcast %4
2915
- %6 :u32 = subgroupBroadcast %5, %arg_1
2916
- %7 :vec2<f16> = bitcast %6
2917
- %8 :f16 = access %7 , 0u
2918
- ret %8
2929
+ %3 :vec2<f16> = construct %arg, 0.0h
2930
+ %4 :u32 = bitcast %3
2931
+ %5 :u32 = subgroupBroadcast %4, 1u
2932
+ %6 :vec2<f16> = bitcast %5
2933
+ %7 :f16 = access %6 , 0u
2934
+ ret %7
2919
2935
}
2920
2936
}
2921
2937
)" ;
@@ -2929,25 +2945,25 @@ TEST_F(IR_BuiltinPolyfillTest, SubgroupBroadcastF16_Scalar) {
2929
2945
EXPECT_EQ (expect, str ());
2930
2946
}
2931
2947
2932
- TEST_F (IR_BuiltinPolyfillTest , SubgroupBroadcastF16_Vec2) {
2933
- Build (core::BuiltinFn:: kSubgroupBroadcast , ty.vec2 <f16 >(), Vector{ty. vec2 < f16 >(), ty. u32 ()} );
2948
+ TEST_F (IR_SubgroupBroadcastPolyfillTest , SubgroupBroadcastF16_Vec2) {
2949
+ Build (ty.vec2 <f16 >());
2934
2950
2935
2951
auto * src = R"(
2936
- %foo = func(%arg:vec2<f16>, %arg_1:u32 ):vec2<f16> { # %arg_1: 'arg'
2952
+ %foo = func(%arg:vec2<f16>):vec2<f16> {
2937
2953
$B1: {
2938
- %result:vec2<f16> = subgroupBroadcast %arg, %arg_1
2954
+ %result:vec2<f16> = subgroupBroadcast %arg, 1u
2939
2955
ret %result
2940
2956
}
2941
2957
}
2942
2958
)" ;
2943
2959
2944
2960
auto * expect = R"(
2945
- %foo = func(%arg:vec2<f16>, %arg_1:u32 ):vec2<f16> { # %arg_1: 'arg'
2961
+ %foo = func(%arg:vec2<f16>):vec2<f16> {
2946
2962
$B1: {
2947
- %4 :u32 = bitcast %arg
2948
- %5 :u32 = subgroupBroadcast %4, %arg_1
2949
- %6 :vec2<f16> = bitcast %5
2950
- ret %6
2963
+ %3 :u32 = bitcast %arg
2964
+ %4 :u32 = subgroupBroadcast %3, 1u
2965
+ %5 :vec2<f16> = bitcast %4
2966
+ ret %5
2951
2967
}
2952
2968
}
2953
2969
)" ;
@@ -2961,27 +2977,27 @@ TEST_F(IR_BuiltinPolyfillTest, SubgroupBroadcastF16_Vec2) {
2961
2977
EXPECT_EQ (expect, str ());
2962
2978
}
2963
2979
2964
- TEST_F (IR_BuiltinPolyfillTest , SubgroupBroadcastF16_Vec3) {
2965
- Build (core::BuiltinFn:: kSubgroupBroadcast , ty.vec3 <f16 >(), Vector{ty. vec3 < f16 >(), ty. u32 ()} );
2980
+ TEST_F (IR_SubgroupBroadcastPolyfillTest , SubgroupBroadcastF16_Vec3) {
2981
+ Build (ty.vec3 <f16 >());
2966
2982
2967
2983
auto * src = R"(
2968
- %foo = func(%arg:vec3<f16>, %arg_1:u32 ):vec3<f16> { # %arg_1: 'arg'
2984
+ %foo = func(%arg:vec3<f16>):vec3<f16> {
2969
2985
$B1: {
2970
- %result:vec3<f16> = subgroupBroadcast %arg, %arg_1
2986
+ %result:vec3<f16> = subgroupBroadcast %arg, 1u
2971
2987
ret %result
2972
2988
}
2973
2989
}
2974
2990
)" ;
2975
2991
2976
2992
auto * expect = R"(
2977
- %foo = func(%arg:vec3<f16>, %arg_1:u32 ):vec3<f16> { # %arg_1: 'arg'
2993
+ %foo = func(%arg:vec3<f16>):vec3<f16> {
2978
2994
$B1: {
2979
- %4 :vec4<f16> = construct %arg, 0.0h
2980
- %5 :vec2<u32> = bitcast %4
2981
- %6 :vec2<u32> = subgroupBroadcast %5, %arg_1
2982
- %7 :vec4<f16> = bitcast %6
2983
- %8 :vec3<f16> = swizzle %7 , xyz
2984
- ret %8
2995
+ %3 :vec4<f16> = construct %arg, 0.0h
2996
+ %4 :vec2<u32> = bitcast %3
2997
+ %5 :vec2<u32> = subgroupBroadcast %4, 1u
2998
+ %6 :vec4<f16> = bitcast %5
2999
+ %7 :vec3<f16> = swizzle %6 , xyz
3000
+ ret %7
2985
3001
}
2986
3002
}
2987
3003
)" ;
@@ -2995,25 +3011,25 @@ TEST_F(IR_BuiltinPolyfillTest, SubgroupBroadcastF16_Vec3) {
2995
3011
EXPECT_EQ (expect, str ());
2996
3012
}
2997
3013
2998
- TEST_F (IR_BuiltinPolyfillTest , SubgroupBroadcastF16_Vec4) {
2999
- Build (core::BuiltinFn:: kSubgroupBroadcast , ty.vec4 <f16 >(), Vector{ty. vec4 < f16 >(), ty. u32 ()} );
3014
+ TEST_F (IR_SubgroupBroadcastPolyfillTest , SubgroupBroadcastF16_Vec4) {
3015
+ Build (ty.vec4 <f16 >());
3000
3016
3001
3017
auto * src = R"(
3002
- %foo = func(%arg:vec4<f16>, %arg_1:u32 ):vec4<f16> { # %arg_1: 'arg'
3018
+ %foo = func(%arg:vec4<f16>):vec4<f16> {
3003
3019
$B1: {
3004
- %result:vec4<f16> = subgroupBroadcast %arg, %arg_1
3020
+ %result:vec4<f16> = subgroupBroadcast %arg, 1u
3005
3021
ret %result
3006
3022
}
3007
3023
}
3008
3024
)" ;
3009
3025
3010
3026
auto * expect = R"(
3011
- %foo = func(%arg:vec4<f16>, %arg_1:u32 ):vec4<f16> { # %arg_1: 'arg'
3027
+ %foo = func(%arg:vec4<f16>):vec4<f16> {
3012
3028
$B1: {
3013
- %4 :vec2<u32> = bitcast %arg
3014
- %5 :vec2<u32> = subgroupBroadcast %4, %arg_1
3015
- %6 :vec4<f16> = bitcast %5
3016
- ret %6
3029
+ %3 :vec2<u32> = bitcast %arg
3030
+ %4 :vec2<u32> = subgroupBroadcast %3, 1u
3031
+ %5 :vec4<f16> = bitcast %4
3032
+ ret %5
3017
3033
}
3018
3034
}
3019
3035
)" ;
0 commit comments