1+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
12; RUN: opt -S -scalarizer -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s
23
34; Make sure dxil operation function calls for frac are generated for float and half.
45
56define noundef half @frac_half (half noundef %a ) {
7+ ; CHECK-LABEL: define noundef half @frac_half(
8+ ; CHECK-SAME: half noundef [[A:%.*]]) {
9+ ; CHECK-NEXT: [[ENTRY:.*:]]
10+ ; CHECK-NEXT: [[DX_FRAC1:%.*]] = call half @dx.op.unary.f16(i32 22, half [[A]])
11+ ; CHECK-NEXT: ret half [[DX_FRAC1]]
12+ ;
613entry:
7- ; CHECK:call half @dx.op.unary.f16(i32 22, half %{{.*}})
814 %dx.frac = call half @llvm.dx.frac.f16 (half %a )
915 ret half %dx.frac
1016}
1117
1218define noundef float @frac_float (float noundef %a ) #0 {
19+ ; CHECK-LABEL: define noundef float @frac_float(
20+ ; CHECK-SAME: float noundef [[A:%.*]]) {
21+ ; CHECK-NEXT: [[ENTRY:.*:]]
22+ ; CHECK-NEXT: [[DX_FRAC1:%.*]] = call float @dx.op.unary.f32(i32 22, float [[A]])
23+ ; CHECK-NEXT: ret float [[DX_FRAC1]]
24+ ;
1325entry:
14- ; CHECK:call float @dx.op.unary.f32(i32 22, float %{{.*}})
1526 %dx.frac = call float @llvm.dx.frac.f32 (float %a )
1627 ret float %dx.frac
1728}
1829
1930define noundef <4 x float > @frac_float4 (<4 x float > noundef %a ) #0 {
31+ ; CHECK-LABEL: define noundef <4 x float> @frac_float4(
32+ ; CHECK-SAME: <4 x float> noundef [[A:%.*]]) {
33+ ; CHECK-NEXT: [[ENTRY:.*:]]
34+ ; CHECK-NEXT: [[A_I0:%.*]] = extractelement <4 x float> [[A]], i64 0
35+ ; CHECK-NEXT: [[DOTI04:%.*]] = call float @dx.op.unary.f32(i32 22, float [[A_I0]])
36+ ; CHECK-NEXT: [[A_I1:%.*]] = extractelement <4 x float> [[A]], i64 1
37+ ; CHECK-NEXT: [[DOTI13:%.*]] = call float @dx.op.unary.f32(i32 22, float [[A_I1]])
38+ ; CHECK-NEXT: [[A_I2:%.*]] = extractelement <4 x float> [[A]], i64 2
39+ ; CHECK-NEXT: [[DOTI22:%.*]] = call float @dx.op.unary.f32(i32 22, float [[A_I2]])
40+ ; CHECK-NEXT: [[A_I3:%.*]] = extractelement <4 x float> [[A]], i64 3
41+ ; CHECK-NEXT: [[DOTI31:%.*]] = call float @dx.op.unary.f32(i32 22, float [[A_I3]])
42+ ; CHECK-NEXT: [[DOTUPTO0:%.*]] = insertelement <4 x float> poison, float [[DOTI04]], i64 0
43+ ; CHECK-NEXT: [[DOTUPTO1:%.*]] = insertelement <4 x float> [[DOTUPTO0]], float [[DOTI13]], i64 1
44+ ; CHECK-NEXT: [[DOTUPTO2:%.*]] = insertelement <4 x float> [[DOTUPTO1]], float [[DOTI22]], i64 2
45+ ; CHECK-NEXT: [[TMP0:%.*]] = insertelement <4 x float> [[DOTUPTO2]], float [[DOTI31]], i64 3
46+ ; CHECK-NEXT: ret <4 x float> [[TMP0]]
47+ ;
2048entry:
21- ; CHECK: [[ee0:%.*]] = extractelement <4 x float> %a, i64 0
22- ; CHECK: [[ie0:%.*]] = call float @dx.op.unary.f32(i32 22, float [[ee0]])
23- ; CHECK: [[ee1:%.*]] = extractelement <4 x float> %a, i64 1
24- ; CHECK: [[ie1:%.*]] = call float @dx.op.unary.f32(i32 22, float [[ee1]])
25- ; CHECK: [[ee2:%.*]] = extractelement <4 x float> %a, i64 2
26- ; CHECK: [[ie2:%.*]] = call float @dx.op.unary.f32(i32 22, float [[ee2]])
27- ; CHECK: [[ee3:%.*]] = extractelement <4 x float> %a, i64 3
28- ; CHECK: [[ie3:%.*]] = call float @dx.op.unary.f32(i32 22, float [[ee3]])
29- ; CHECK: insertelement <4 x float> poison, float [[ie0]], i64 0
30- ; CHECK: insertelement <4 x float> %{{.*}}, float [[ie1]], i64 1
31- ; CHECK: insertelement <4 x float> %{{.*}}, float [[ie2]], i64 2
32- ; CHECK: insertelement <4 x float> %{{.*}}, float [[ie3]], i64 3
33- %2 = call <4 x float > @llvm.dx.frac.v4f32 (<4 x float > %a )
49+ %2 = call <4 x float > @llvm.dx.frac.v4f32 (<4 x float > %a )
3450 ret <4 x float > %2
3551}
3652
3753declare half @llvm.dx.frac.f16 (half )
3854declare float @llvm.dx.frac.f32 (float )
39- declare <4 x float > @llvm.dx.frac.v4f32 (<4 x float >)
55+ declare <4 x float > @llvm.dx.frac.v4f32 (<4 x float >)
0 commit comments