1
+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
1
2
; RUN: opt -S -scalarizer -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s
2
3
3
4
; Make sure dxil operation function calls for frac are generated for float and half.
4
5
5
6
define 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
+ ;
6
13
entry:
7
- ; CHECK:call half @dx.op.unary.f16(i32 22, half %{{.*}})
8
14
%dx.frac = call half @llvm.dx.frac.f16 (half %a )
9
15
ret half %dx.frac
10
16
}
11
17
12
18
define 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
+ ;
13
25
entry:
14
- ; CHECK:call float @dx.op.unary.f32(i32 22, float %{{.*}})
15
26
%dx.frac = call float @llvm.dx.frac.f32 (float %a )
16
27
ret float %dx.frac
17
28
}
18
29
19
30
define 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
+ ;
20
48
entry:
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 )
34
50
ret <4 x float > %2
35
51
}
36
52
37
53
declare half @llvm.dx.frac.f16 (half )
38
54
declare 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