@@ -11,7 +11,10 @@ define void @loadf64() {
1111      @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f64_1_0_0t (
1212          i32  0 , i32  1 , i32  1 , i32  0 , i1  false )
1313
14+   ret  void 
15+ 
1416  ; check we load an <2 x i32> instead of a double 
17+   ; CHECK-NOT: call {double, i1} @llvm.dx.resource.load.typedbuffer 
1518  ; CHECK: [[L0:%.*]] = call { <2 x i32>, i1 } 
1619  ; CHECK-SAME: @llvm.dx.resource.load.typedbuffer.v2i32.tdx.TypedBuffer_f64_1_0_0t( 
1720  ; CHECK-SAME: target("dx.TypedBuffer", double, 1, 0, 0) [[B]], i32 0)	 
@@ -22,7 +25,12 @@ define void @loadf64() {
2225  ; CHECK: [[D0:%.*]] = extractvalue { <2 x i32>, i1 } [[L0]], 0 
2326  ; CHECK: [[Lo:%.*]] = extractelement <2 x i32> [[D0]], i64 0 
2427  ; 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 
2634  %data0  = extractvalue  {double , i1 } %load0 , 0 
2735  ret  void 
2836}
@@ -52,7 +60,48 @@ define void @loadv2f64() {
5260  ; CHECK: [[Dbl1:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo1]], i32 [[Hi1]]) 
5361  ; CHECK: [[Vec:%.*]] = insertelement <2 x double> poison, double [[Dbl1]], i64 0 
5462  ; 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 
5669  %data0  = extractvalue  { <2  x double >, i1  } %load0 , 0 
5770  ret  void 
5871}
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