1- ; RUN: opt -S -dxil-intrinsic-expansion %s | FileCheck %s
2-
3- target triple = "dxil-pc-shadermodel6.2-compute"
1+ ; RUN: opt -mtriple=dxil-pc-shadermodel6.2-compute -S -dxil-intrinsic-expansion %s | FileCheck %s --check-prefixes=CHECK,CHECK62
2+ ; RUN: opt -mtriple=dxil-pc-shadermodel6.3-compute -S -dxil-intrinsic-expansion %s | FileCheck %s --check-prefixes=CHECK,CHECK63
43
54define void @loadf64 (i32 %index ) {
65 ; check the handle from binding is unchanged
@@ -11,20 +10,26 @@ define void @loadf64(i32 %index) {
1110 @llvm.dx.resource.handlefrombinding.tdx.Rawbuffer_f64_1_0_0t (
1211 i32 0 , i32 1 , i32 1 , i32 0 , i1 false , ptr null )
1312
13+ ; check we don't modify the code in sm6.3 or later
14+ ; CHECK63: [[L0:%.*]] = call { double, i1 } @llvm.dx.resource.load.rawbuffer
15+ ; CHECK63-SAME: target("dx.Rawbuffer", double, 0, 0) [[B]], i32 %index, i32 0)
16+
1417 ; check we load an <2 x i32> instead of a double
15- ; CHECK -NOT: call {double, i1} @llvm.dx.resource.load.rawbuffer
16- ; CHECK : [[L0:%.*]] = call { <2 x i32>, i1 }
17- ; CHECK -SAME: @llvm.dx.resource.load.rawbuffer.v2i32.tdx.Rawbuffer_f64_0_0t(
18- ; CHECK -SAME: target("dx.Rawbuffer", double, 0, 0) [[B]], i32 %index, i32 0)
18+ ; CHECK62 -NOT: call {double, i1} @llvm.dx.resource.load.rawbuffer
19+ ; CHECK62 : [[L0:%.*]] = call { <2 x i32>, i1 }
20+ ; CHECK62 -SAME: @llvm.dx.resource.load.rawbuffer.v2i32.tdx.Rawbuffer_f64_0_0t(
21+ ; CHECK62 -SAME: target("dx.Rawbuffer", double, 0, 0) [[B]], i32 %index, i32 0)
1922 %load0 = call {double , i1 } @llvm.dx.resource.load.rawbuffer (
2023 target ("dx.Rawbuffer" , double , 0 , 0 ) %buffer , i32 %index , i32 0 )
2124
25+ ; CHECK63: extractvalue { double, i1 } [[L0]], 0
26+
2227 ; check we extract the two i32 and construct a double
23- ; CHECK : [[D0:%.*]] = extractvalue { <2 x i32>, i1 } [[L0]], 0
24- ; CHECK : [[Lo:%.*]] = extractelement <2 x i32> [[D0]], i32 0
25- ; CHECK : [[Hi:%.*]] = extractelement <2 x i32> [[D0]], i32 1
26- ; CHECK : [[DBL:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo]], i32 [[Hi]])
27- ; CHECK -NOT: extractvalue { double, i1 }
28+ ; CHECK62 : [[D0:%.*]] = extractvalue { <2 x i32>, i1 } [[L0]], 0
29+ ; CHECK62 : [[Lo:%.*]] = extractelement <2 x i32> [[D0]], i32 0
30+ ; CHECK62 : [[Hi:%.*]] = extractelement <2 x i32> [[D0]], i32 1
31+ ; CHECK62 : [[DBL:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo]], i32 [[Hi]])
32+ ; CHECK62 -NOT: extractvalue { double, i1 }
2833 %data0 = extractvalue {double , i1 } %load0 , 0
2934 ret void
3035}
@@ -38,24 +43,30 @@ define void @loadv2f64(i32 %index) {
3843 @llvm.dx.resource.handlefrombinding.tdx.Rawbuffer_v2f64_1_0_0t (
3944 i32 0 , i32 1 , i32 1 , i32 0 , i1 false , ptr null )
4045
46+ ; check we don't modify the code in sm6.3 or later
47+ ; CHECK63: [[L0:%.*]] = call { <2 x double>, i1 } @llvm.dx.resource.load.rawbuffer
48+ ; CHECK63-SAME: target("dx.Rawbuffer", <2 x double>, 0, 0) [[B]], i32 %index, i32 0)
49+
4150 ; check we load an <4 x i32> instead of a double2
42- ; CHECK : [[L0:%.*]] = call { <4 x i32>, i1 }
43- ; CHECK -SAME: @llvm.dx.resource.load.rawbuffer.v4i32.tdx.Rawbuffer_v2f64_0_0t(
44- ; CHECK -SAME: target("dx.Rawbuffer", <2 x double>, 0, 0) [[B]], i32 %index, i32 0)
51+ ; CHECK62 : [[L0:%.*]] = call { <4 x i32>, i1 }
52+ ; CHECK62 -SAME: @llvm.dx.resource.load.rawbuffer.v4i32.tdx.Rawbuffer_v2f64_0_0t(
53+ ; CHECK62 -SAME: target("dx.Rawbuffer", <2 x double>, 0, 0) [[B]], i32 %index, i32 0)
4554 %load0 = call { <2 x double >, i1 } @llvm.dx.resource.load.rawbuffer (
4655 target ("dx.Rawbuffer" , <2 x double >, 0 , 0 ) %buffer , i32 %index , i32 0 )
4756
57+ ; CHECK63: extractvalue { <2 x double>, i1 } [[L0]], 0
58+
4859 ; check we extract the 4 i32 and construct a <2 x double>
49- ; CHECK : [[D0:%.*]] = extractvalue { <4 x i32>, i1 } [[L0]], 0
50- ; CHECK : [[Lo1:%.*]] = extractelement <4 x i32> [[D0]], i32 0
51- ; CHECK : [[Hi1:%.*]] = extractelement <4 x i32> [[D0]], i32 1
52- ; CHECK : [[Lo2:%.*]] = extractelement <4 x i32> [[D0]], i32 2
53- ; CHECK : [[Hi2:%.*]] = extractelement <4 x i32> [[D0]], i32 3
54- ; CHECK : [[Dbl1:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo1]], i32 [[Hi1]])
55- ; CHECK : [[Vec:%.*]] = insertelement <2 x double> poison, double [[Dbl1]], i32 0
56- ; CHECK : [[Dbl2:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo2]], i32 [[Hi2]])
57- ; CHECK : [[Vec2:%.*]] = insertelement <2 x double> [[Vec]], double [[Dbl2]], i32 1
58- ; CHECK -NOT: extractvalue { <2 x double>, i1 }
60+ ; CHECK62 : [[D0:%.*]] = extractvalue { <4 x i32>, i1 } [[L0]], 0
61+ ; CHECK62 : [[Lo1:%.*]] = extractelement <4 x i32> [[D0]], i32 0
62+ ; CHECK62 : [[Hi1:%.*]] = extractelement <4 x i32> [[D0]], i32 1
63+ ; CHECK62 : [[Lo2:%.*]] = extractelement <4 x i32> [[D0]], i32 2
64+ ; CHECK62 : [[Hi2:%.*]] = extractelement <4 x i32> [[D0]], i32 3
65+ ; CHECK62 : [[Dbl1:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo1]], i32 [[Hi1]])
66+ ; CHECK62 : [[Vec:%.*]] = insertelement <2 x double> poison, double [[Dbl1]], i32 0
67+ ; CHECK62 : [[Dbl2:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo2]], i32 [[Hi2]])
68+ ; CHECK62 : [[Vec2:%.*]] = insertelement <2 x double> [[Vec]], double [[Dbl2]], i32 1
69+ ; CHECK62 -NOT: extractvalue { <2 x double>, i1 }
5970 %data0 = extractvalue { <2 x double >, i1 } %load0 , 0
6071 ret void
6172}
@@ -70,22 +81,29 @@ define void @loadf64WithCheckBit(i32 %index) {
7081 @llvm.dx.resource.handlefrombinding.tdx.Rawbuffer_f64_1_0_0t (
7182 i32 0 , i32 1 , i32 1 , i32 0 , i1 false , ptr null )
7283
84+ ; check we don't modify the code in sm6.3 or later
85+ ; CHECK63: [[L0:%.*]] = call { double, i1 } @llvm.dx.resource.load.rawbuffer
86+ ; CHECK63-SAME: target("dx.Rawbuffer", double, 0, 0) [[B]], i32 %index, i32 0)
87+
7388 ; check we load an <2 x i32> instead of a double
74- ; CHECK -NOT: call {double, i1} @llvm.dx.resource.load.rawbuffer
75- ; CHECK : [[L0:%.*]] = call { <2 x i32>, i1 }
76- ; CHECK -SAME: @llvm.dx.resource.load.rawbuffer.v2i32.tdx.Rawbuffer_f64_0_0t(
77- ; CHECK -SAME: target("dx.Rawbuffer", double, 0, 0) [[B]], i32 %index, i32 0)
89+ ; CHECK62 -NOT: call {double, i1} @llvm.dx.resource.load.rawbuffer
90+ ; CHECK62 : [[L0:%.*]] = call { <2 x i32>, i1 }
91+ ; CHECK62 -SAME: @llvm.dx.resource.load.rawbuffer.v2i32.tdx.Rawbuffer_f64_0_0t(
92+ ; CHECK62 -SAME: target("dx.Rawbuffer", double, 0, 0) [[B]], i32 %index, i32 0)
7893 %load0 = call {double , i1 } @llvm.dx.resource.load.rawbuffer (
7994 target ("dx.Rawbuffer" , double , 0 , 0 ) %buffer , i32 %index , i32 0 )
8095
96+ ; CHECK63: extractvalue { double, i1 } [[L0]], 0
97+ ; CHECK63: extractvalue { double, i1 } [[L0]], 1
98+
8199 ; check we extract the two i32 and construct a double
82- ; CHECK : [[D0:%.*]] = extractvalue { <2 x i32>, i1 } [[L0]], 0
83- ; CHECK : [[Lo:%.*]] = extractelement <2 x i32> [[D0]], i32 0
84- ; CHECK : [[Hi:%.*]] = extractelement <2 x i32> [[D0]], i32 1
85- ; CHECK : [[DBL:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo]], i32 [[Hi]])
100+ ; CHECK62 : [[D0:%.*]] = extractvalue { <2 x i32>, i1 } [[L0]], 0
101+ ; CHECK62 : [[Lo:%.*]] = extractelement <2 x i32> [[D0]], i32 0
102+ ; CHECK62 : [[Hi:%.*]] = extractelement <2 x i32> [[D0]], i32 1
103+ ; CHECK62 : [[DBL:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo]], i32 [[Hi]])
86104 %data0 = extractvalue {double , i1 } %load0 , 0
87- ; CHECK : extractvalue { <2 x i32>, i1 } [[L0]], 1
88- ; CHECK -NOT: extractvalue { double, i1 }
105+ ; CHECK62 : extractvalue { <2 x i32>, i1 } [[L0]], 1
106+ ; CHECK62 -NOT: extractvalue { double, i1 }
89107 %cb = extractvalue {double , i1 } %load0 , 1
90108 ret void
91109}
@@ -103,43 +121,49 @@ define void @loadv3f64(i32 %index) {
103121 @llvm.dx.resource.handlefrombinding.tdx.Rawbuffer_v3f64_0_0t (
104122 i32 0 , i32 0 , i32 1 , i32 0 , i1 false , ptr null )
105123
124+ ; check we don't modify the code in sm6.3 or later
125+ ; CHECK63: [[L0:%.*]] = call { <3 x double>, i1 } @llvm.dx.resource.load.rawbuffer
126+ ; CHECK63-SAME: target("dx.Rawbuffer", <3 x double>, 0, 0) [[B]], i32 %index, i32 0)
127+
106128 ; check we perform two loads
107129 ; and do 6 extracts and construct 3 doubles
108- ; CHECK -NOT: call {<3 x double>, i1} @llvm.dx.resource.load.rawbuffer
109- ; CHECK : [[L0:%.*]] = call { <4 x i32>, i1 }
110- ; CHECK -SAME: @llvm.dx.resource.load.rawbuffer.v4i32.tdx.Rawbuffer_v3f64_0_0t(
111- ; CHECK -SAME: target("dx.Rawbuffer", <3 x double>, 0, 0) [[B]], i32 %index, i32 0)
112-
113- ; CHECK : [[D0:%.*]] = extractvalue { <4 x i32>, i1 } [[L0]], 0
114- ; CHECK : [[Lo1:%.*]] = extractelement <4 x i32> [[D0]], i32 0
115- ; CHECK : [[Hi1:%.*]] = extractelement <4 x i32> [[D0]], i32 1
116- ; CHECK : [[Lo2:%.*]] = extractelement <4 x i32> [[D0]], i32 2
117- ; CHECK : [[Hi2:%.*]] = extractelement <4 x i32> [[D0]], i32 3
118- ; CHECK : [[DBL1:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo1]], i32 [[Hi1]])
119- ; CHECK : [[Vec1:%.*]] = insertelement <3 x double> poison, double [[DBL1]], i32 0
120- ; CHECK : [[DBL2:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo2]], i32 [[Hi2]])
121- ; CHECK : [[Vec2:%.*]] = insertelement <3 x double> [[Vec1]], double [[DBL2]], i32 1
130+ ; CHECK62 -NOT: call {<3 x double>, i1} @llvm.dx.resource.load.rawbuffer
131+ ; CHECK62 : [[L0:%.*]] = call { <4 x i32>, i1 }
132+ ; CHECK62 -SAME: @llvm.dx.resource.load.rawbuffer.v4i32.tdx.Rawbuffer_v3f64_0_0t(
133+ ; CHECK62 -SAME: target("dx.Rawbuffer", <3 x double>, 0, 0) [[B]], i32 %index, i32 0)
134+
135+ ; CHECK62 : [[D0:%.*]] = extractvalue { <4 x i32>, i1 } [[L0]], 0
136+ ; CHECK62 : [[Lo1:%.*]] = extractelement <4 x i32> [[D0]], i32 0
137+ ; CHECK62 : [[Hi1:%.*]] = extractelement <4 x i32> [[D0]], i32 1
138+ ; CHECK62 : [[Lo2:%.*]] = extractelement <4 x i32> [[D0]], i32 2
139+ ; CHECK62 : [[Hi2:%.*]] = extractelement <4 x i32> [[D0]], i32 3
140+ ; CHECK62 : [[DBL1:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo1]], i32 [[Hi1]])
141+ ; CHECK62 : [[Vec1:%.*]] = insertelement <3 x double> poison, double [[DBL1]], i32 0
142+ ; CHECK62 : [[DBL2:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo2]], i32 [[Hi2]])
143+ ; CHECK62 : [[Vec2:%.*]] = insertelement <3 x double> [[Vec1]], double [[DBL2]], i32 1
122144
123145 ; 2nd load
124- ; CHECK : [[L2:%.*]] = call { <2 x i32>, i1 }
125- ; CHECK -SAME: @llvm.dx.resource.load.rawbuffer.v2i32.tdx.Rawbuffer_v3f64_0_0t(
126- ; CHECK -SAME: target("dx.Rawbuffer", <3 x double>, 0, 0) [[B]], i32 %index, i32 16)
127-
128- ; CHECK : [[D2:%.*]] = extractvalue { <2 x i32>, i1 } [[L2]], 0
129- ; CHECK : [[Lo3:%.*]] = extractelement <2 x i32> [[D2]], i32 0
130- ; CHECK : [[Hi3:%.*]] = extractelement <2 x i32> [[D2]], i32 1
131- ; CHECK : [[DBL3:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo3]], i32 [[Hi3]])
132- ; CHECK : [[Vec3:%.*]] = insertelement <3 x double> [[Vec2]], double [[DBL3]], i32 2
146+ ; CHECK62 : [[L2:%.*]] = call { <2 x i32>, i1 }
147+ ; CHECK62 -SAME: @llvm.dx.resource.load.rawbuffer.v2i32.tdx.Rawbuffer_v3f64_0_0t(
148+ ; CHECK62 -SAME: target("dx.Rawbuffer", <3 x double>, 0, 0) [[B]], i32 %index, i32 16)
149+
150+ ; CHECK62 : [[D2:%.*]] = extractvalue { <2 x i32>, i1 } [[L2]], 0
151+ ; CHECK62 : [[Lo3:%.*]] = extractelement <2 x i32> [[D2]], i32 0
152+ ; CHECK62 : [[Hi3:%.*]] = extractelement <2 x i32> [[D2]], i32 1
153+ ; CHECK62 : [[DBL3:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo3]], i32 [[Hi3]])
154+ ; CHECK62 : [[Vec3:%.*]] = insertelement <3 x double> [[Vec2]], double [[DBL3]], i32 2
133155 %load0 = call {<3 x double >, i1 } @llvm.dx.resource.load.rawbuffer (
134156 target ("dx.Rawbuffer" , <3 x double >, 0 , 0 ) %buffer , i32 %index , i32 0 )
135157
158+ ; CHECK63: extractvalue { <3 x double>, i1 } [[L0]], 0
159+ ; CHECK63: extractvalue { <3 x double>, i1 } [[L0]], 1
136160
137- ; CHECK -NOT: extractvalue {<3 x double>, i1 }
161+ ; CHECK62 -NOT: extractvalue {<3 x double>, i1 }
138162 %data0 = extractvalue {<3 x double >, i1 } %load0 , 0
139163 ; check we extract checkbit from both loads and and them together
140- ; CHECK : [[B1:%.*]] = extractvalue { <4 x i32>, i1 } [[L0]], 1
141- ; CHECK : [[B2:%.*]] = extractvalue { <2 x i32>, i1 } [[L2]], 1
142- ; CHECK : and i1 [[B1]], [[B2]]
164+ ; CHECK62 : [[B1:%.*]] = extractvalue { <4 x i32>, i1 } [[L0]], 1
165+ ; CHECK62 : [[B2:%.*]] = extractvalue { <2 x i32>, i1 } [[L2]], 1
166+ ; CHECK62 : and i1 [[B1]], [[B2]]
143167 %cb = extractvalue {<3 x double >, i1 } %load0 , 1
144168 ret void
145169}
@@ -153,47 +177,53 @@ define void @loadv4f64(i32 %index) {
153177 @llvm.dx.resource.handlefrombinding.tdx.Rawbuffer_v4f64_0_0t (
154178 i32 0 , i32 0 , i32 1 , i32 0 , i1 false , ptr null )
155179
180+ ; check we don't modify the code in sm6.3 or later
181+ ; CHECK63: [[L0:%.*]] = call { <4 x double>, i1 } @llvm.dx.resource.load.rawbuffer
182+ ; CHECK63-SAME: target("dx.Rawbuffer", <4 x double>, 0, 0) [[B]], i32 %index, i32 0)
183+
156184 ; check we perform two loads
157185 ; and do 8 extracts and construct 4 doubles
158- ; CHECK -NOT: call {<4 x double>, i1} @llvm.dx.resource.load.rawbuffer
159- ; CHECK : [[L0:%.*]] = call { <4 x i32>, i1 }
160- ; CHECK -SAME: @llvm.dx.resource.load.rawbuffer.v4i32.tdx.Rawbuffer_v4f64_0_0t(
161- ; CHECK -SAME: target("dx.Rawbuffer", <4 x double>, 0, 0) [[B]], i32 %index, i32 0)
162-
163- ; CHECK : [[D0:%.*]] = extractvalue { <4 x i32>, i1 } [[L0]], 0
164- ; CHECK : [[Lo1:%.*]] = extractelement <4 x i32> [[D0]], i32 0
165- ; CHECK : [[Hi1:%.*]] = extractelement <4 x i32> [[D0]], i32 1
166- ; CHECK : [[Lo2:%.*]] = extractelement <4 x i32> [[D0]], i32 2
167- ; CHECK : [[Hi2:%.*]] = extractelement <4 x i32> [[D0]], i32 3
168- ; CHECK : [[DBL1:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo1]], i32 [[Hi1]])
169- ; CHECK : [[Vec1:%.*]] = insertelement <4 x double> poison, double [[DBL1]], i32 0
170- ; CHECK : [[DBL2:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo2]], i32 [[Hi2]])
171- ; CHECK : [[Vec2:%.*]] = insertelement <4 x double> [[Vec1]], double [[DBL2]], i32 1
186+ ; CHECK62 -NOT: call {<4 x double>, i1} @llvm.dx.resource.load.rawbuffer
187+ ; CHECK62 : [[L0:%.*]] = call { <4 x i32>, i1 }
188+ ; CHECK62 -SAME: @llvm.dx.resource.load.rawbuffer.v4i32.tdx.Rawbuffer_v4f64_0_0t(
189+ ; CHECK62 -SAME: target("dx.Rawbuffer", <4 x double>, 0, 0) [[B]], i32 %index, i32 0)
190+
191+ ; CHECK62 : [[D0:%.*]] = extractvalue { <4 x i32>, i1 } [[L0]], 0
192+ ; CHECK62 : [[Lo1:%.*]] = extractelement <4 x i32> [[D0]], i32 0
193+ ; CHECK62 : [[Hi1:%.*]] = extractelement <4 x i32> [[D0]], i32 1
194+ ; CHECK62 : [[Lo2:%.*]] = extractelement <4 x i32> [[D0]], i32 2
195+ ; CHECK62 : [[Hi2:%.*]] = extractelement <4 x i32> [[D0]], i32 3
196+ ; CHECK62 : [[DBL1:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo1]], i32 [[Hi1]])
197+ ; CHECK62 : [[Vec1:%.*]] = insertelement <4 x double> poison, double [[DBL1]], i32 0
198+ ; CHECK62 : [[DBL2:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo2]], i32 [[Hi2]])
199+ ; CHECK62 : [[Vec2:%.*]] = insertelement <4 x double> [[Vec1]], double [[DBL2]], i32 1
172200
173201 ; 2nd load
174- ; CHECK : [[L2:%.*]] = call { <4 x i32>, i1 }
175- ; CHECK -SAME: @llvm.dx.resource.load.rawbuffer.v4i32.tdx.Rawbuffer_v4f64_0_0t(
176- ; CHECK -SAME: target("dx.Rawbuffer", <4 x double>, 0, 0) [[B]], i32 %index, i32 16)
177-
178- ; CHECK : [[D2:%.*]] = extractvalue { <4 x i32>, i1 } [[L2]], 0
179- ; CHECK : [[Lo3:%.*]] = extractelement <4 x i32> [[D2]], i32 0
180- ; CHECK : [[Hi3:%.*]] = extractelement <4 x i32> [[D2]], i32 1
181- ; CHECK : [[Lo4:%.*]] = extractelement <4 x i32> [[D2]], i32 2
182- ; CHECK : [[Hi4:%.*]] = extractelement <4 x i32> [[D2]], i32 3
183- ; CHECK : [[DBL3:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo3]], i32 [[Hi3]])
184- ; CHECK : [[Vec3:%.*]] = insertelement <4 x double> [[Vec2]], double [[DBL3]], i32 2
185- ; CHECK : [[DBL4:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo4]], i32 [[Hi4]])
186- ; CHECK : [[Vec4:%.*]] = insertelement <4 x double> [[Vec3]], double [[DBL4]], i32 3
202+ ; CHECK62 : [[L2:%.*]] = call { <4 x i32>, i1 }
203+ ; CHECK62 -SAME: @llvm.dx.resource.load.rawbuffer.v4i32.tdx.Rawbuffer_v4f64_0_0t(
204+ ; CHECK62 -SAME: target("dx.Rawbuffer", <4 x double>, 0, 0) [[B]], i32 %index, i32 16)
205+
206+ ; CHECK62 : [[D2:%.*]] = extractvalue { <4 x i32>, i1 } [[L2]], 0
207+ ; CHECK62 : [[Lo3:%.*]] = extractelement <4 x i32> [[D2]], i32 0
208+ ; CHECK62 : [[Hi3:%.*]] = extractelement <4 x i32> [[D2]], i32 1
209+ ; CHECK62 : [[Lo4:%.*]] = extractelement <4 x i32> [[D2]], i32 2
210+ ; CHECK62 : [[Hi4:%.*]] = extractelement <4 x i32> [[D2]], i32 3
211+ ; CHECK62 : [[DBL3:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo3]], i32 [[Hi3]])
212+ ; CHECK62 : [[Vec3:%.*]] = insertelement <4 x double> [[Vec2]], double [[DBL3]], i32 2
213+ ; CHECK62 : [[DBL4:%.*]] = call double @llvm.dx.asdouble.i32(i32 [[Lo4]], i32 [[Hi4]])
214+ ; CHECK62 : [[Vec4:%.*]] = insertelement <4 x double> [[Vec3]], double [[DBL4]], i32 3
187215 %load0 = call {<4 x double >, i1 } @llvm.dx.resource.load.rawbuffer (
188216 target ("dx.Rawbuffer" , <4 x double >, 0 , 0 ) %buffer , i32 %index , i32 0 )
189217
218+ ; CHECK63: extractvalue { <4 x double>, i1 } [[L0]], 0
219+ ; CHECK63: extractvalue { <4 x double>, i1 } [[L0]], 1
190220
191- ; CHECK -NOT: extractvalue {<4 x double>, i1 }
221+ ; CHECK62 -NOT: extractvalue {<4 x double>, i1 }
192222 %data0 = extractvalue {<4 x double >, i1 } %load0 , 0
193223 ; check we extract checkbit from both loads and and them together
194- ; CHECK : [[B1:%.*]] = extractvalue { <4 x i32>, i1 } [[L0]], 1
195- ; CHECK : [[B2:%.*]] = extractvalue { <4 x i32>, i1 } [[L2]], 1
196- ; CHECK : and i1 [[B1]], [[B2]]
224+ ; CHECK62 : [[B1:%.*]] = extractvalue { <4 x i32>, i1 } [[L0]], 1
225+ ; CHECK62 : [[B2:%.*]] = extractvalue { <4 x i32>, i1 } [[L2]], 1
226+ ; CHECK62 : and i1 [[B1]], [[B2]]
197227 %cb = extractvalue {<4 x double >, i1 } %load0 , 1
198228 ret void
199229}
0 commit comments