@@ -11,7 +11,10 @@ define void @loadf64() {
11
11
@llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f64_1_0_0t (
12
12
i32 0 , i32 1 , i32 1 , i32 0 , i1 false )
13
13
14
+ ret void
15
+
14
16
; check we load an <2 x i32> instead of a double
17
+ ; CHECK-NOT: call {double, i1} @llvm.dx.resource.load.typedbuffer
15
18
; CHECK: [[L0:%.*]] = call { <2 x i32>, i1 }
16
19
; CHECK-SAME: @llvm.dx.resource.load.typedbuffer.v2i32.tdx.TypedBuffer_f64_1_0_0t(
17
20
; CHECK-SAME: target("dx.TypedBuffer", double, 1, 0, 0) [[B]], i32 0)
@@ -22,7 +25,12 @@ define void @loadf64() {
22
25
; CHECK: [[D0:%.*]] = extractvalue { <2 x i32>, i1 } [[L0]], 0
23
26
; CHECK: [[Lo:%.*]] = extractelement <2 x i32> [[D0]], i64 0
24
27
; CHECK: [[Hi:%.*]] = extractelement <2 x i32> [[D0]], i64 1
25
- ; CHECK: call double @llvm.dx.asdouble.i32(i32 [[Lo]], i32 [[Hi]])
28
+ ; CHECK: [[DBL:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo]], i32 [[Hi]])
29
+ ; construct a new {double, i1}
30
+ ; CHECK: [[CB:%.*]] = extractvalue { <2 x i32>, i1 } [[L0]], 1
31
+ ; CHECK: [[S1:%.*]] = insertvalue { double, i1 } poison, double [[DBL]], 0
32
+ ; CHECK: [[S2:%.*]] = insertvalue { double, i1 } [[S1]], i1 [[CB]], 1
33
+ ; CHECK: extractvalue { double, i1 } [[S2]], 0
26
34
%data0 = extractvalue {double , i1 } %load0 , 0
27
35
ret void
28
36
}
@@ -52,7 +60,48 @@ define void @loadv2f64() {
52
60
; CHECK: [[Dbl1:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo1]], i32 [[Hi1]])
53
61
; CHECK: [[Vec:%.*]] = insertelement <2 x double> poison, double [[Dbl1]], i64 0
54
62
; CHECK: [[Dbl2:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo2]], i32 [[Hi2]])
55
- ; CHECK: insertelement <2 x double> [[Vec]], double [[Dbl2]], i64 1
63
+ ; CHECK: [[Vec2:%.*]] = insertelement <2 x double> [[Vec]], double [[Dbl2]], i64 1
64
+ ; construct a new {<2 x double>, i1}
65
+ ; CHECK: [[CB:%.*]] = extractvalue { <4 x i32>, i1 } [[L0]], 1
66
+ ; CHECK: [[S1:%.*]] = insertvalue { <2 x double>, i1 } poison, <2 x double> [[Vec2]], 0
67
+ ; CHECK: [[S2:%.*]] = insertvalue { <2 x double>, i1 } [[S1]], i1 [[CB]], 1
68
+ ; CHECK: extractvalue { <2 x double>, i1 } [[S2]], 0
56
69
%data0 = extractvalue { <2 x double >, i1 } %load0 , 0
57
70
ret void
58
71
}
72
+
73
+ ; show we properly handle extracting the check bit
74
+ define void @loadf64WithCheckBit () {
75
+ ; check the handle from binding is unchanged
76
+ ; CHECK: [[B:%.*]] = call target("dx.TypedBuffer", double, 1, 0, 0)
77
+ ; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f64_1_0_0t(
78
+ ; CHECK-SAME: i32 0, i32 1, i32 1, i32 0, i1 false)
79
+ %buffer = call target ("dx.TypedBuffer" , double , 1 , 0 , 0 )
80
+ @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f64_1_0_0t (
81
+ i32 0 , i32 1 , i32 1 , i32 0 , i1 false )
82
+
83
+ ret void
84
+
85
+ ; check we load an <2 x i32> instead of a double
86
+ ; CHECK-NOT: call {double, i1} @llvm.dx.resource.load.typedbuffer
87
+ ; CHECK: [[L0:%.*]] = call { <2 x i32>, i1 }
88
+ ; CHECK-SAME: @llvm.dx.resource.load.typedbuffer.v2i32.tdx.TypedBuffer_f64_1_0_0t(
89
+ ; CHECK-SAME: target("dx.TypedBuffer", double, 1, 0, 0) [[B]], i32 0)
90
+ %load0 = call {double , i1 } @llvm.dx.resource.load.typedbuffer (
91
+ target ("dx.TypedBuffer" , double , 1 , 0 , 0 ) %buffer , i32 0 )
92
+
93
+ ; check we extract the two i32 and construct a double
94
+ ; CHECK: [[D0:%.*]] = extractvalue { <2 x i32>, i1 } [[L0]], 0
95
+ ; CHECK: [[Lo:%.*]] = extractelement <2 x i32> [[D0]], i64 0
96
+ ; CHECK: [[Hi:%.*]] = extractelement <2 x i32> [[D0]], i64 1
97
+ ; CHECK: [[DBL:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo]], i32 [[Hi]])
98
+ ; construct a new {double, i1}
99
+ ; CHECK: [[CB:%.*]] = extractvalue { <2 x i32>, i1 } [[L0]], 1
100
+ ; CHECK: [[S1:%.*]] = insertvalue { double, i1 } poison, double [[DBL]], 0
101
+ ; CHECK: [[S2:%.*]] = insertvalue { double, i1 } [[S1]], i1 [[CB]], 1
102
+ ; CHECK: extractvalue { double, i1 } [[S2]], 0
103
+ %data0 = extractvalue {double , i1 } %load0 , 0
104
+ ; CHECK: extractvalue { double, i1 } [[S2]], 1
105
+ %cb = extractvalue {double , i1 } %load0 , 1
106
+ ret void
107
+ }
0 commit comments