blob: 24d0406b4c690b8abc856da82942a17e474050cb [file] [log] [blame]
Matt Arsenaultd2c8a332017-02-16 02:01:13 +00001; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck %s
Krzysztof Parzyszek3bf4aec2016-09-02 19:48:55 +00002;
3; This testcase used to cause the following crash:
4;
5; *** Couldn't join subrange!
6;
7; UNREACHABLE executed at lib/CodeGen/RegisterCoalescer.cpp:2666!
8;
9; The insertelement instructions became subregister definitions: one virtual
10; register was defined and re-defined by one group of the consecutive insert-
11; elements, and another was defined by the second group.
12; Since a copy between the two full registers was present in the program,
13; the coalescer tried to merge them. The join algorithm for the main range
14; decided that it was correct to do so, while the subrange join unexpectedly
15; failed. This was caused by the live interval subranges not being computed
16; correctly: subregister defs are not uses for the purpose of subranges.
17;
18; Test for a valid output:
19; CHECK: image_sample_c_d_o
Krzysztof Parzyszek3bf4aec2016-09-02 19:48:55 +000020define amdgpu_ps <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, float, float, float, float, float, float, float, float, float, float, float, float, float, float }> @main([17 x <16 x i8>] addrspace(2)* byval dereferenceable(18446744073709551615) %arg, [16 x <16 x i8>] addrspace(2)* byval dereferenceable(18446744073709551615) %arg1, [32 x <8 x i32>] addrspace(2)* byval dereferenceable(18446744073709551615) %arg2, [16 x <8 x i32>] addrspace(2)* byval dereferenceable(18446744073709551615) %arg3, [16 x <4 x i32>] addrspace(2)* byval dereferenceable(18446744073709551615) %arg4, float inreg %arg5, i32 inreg %arg6, <2 x i32> %arg7, <2 x i32> %arg8, <2 x i32> %arg9, <3 x i32> %arg10, <2 x i32> %arg11, <2 x i32> %arg12, <2 x i32> %arg13, float %arg14, float %arg15, float %arg16, float %arg17, float %arg18, i32 %arg19, i32 %arg20, float %arg21, i32 %arg22) #0 {
21main_body:
Matt Arsenaultd2c8a332017-02-16 02:01:13 +000022 %i.i = extractelement <2 x i32> %arg8, i32 0
23 %j.i = extractelement <2 x i32> %arg8, i32 1
24 %i.f.i = bitcast i32 %i.i to float
25 %j.f.i = bitcast i32 %j.i to float
26 %p1.i = call float @llvm.amdgcn.interp.p1(float %i.f.i, i32 3, i32 0, i32 %arg6) #1
27 %p2.i = call float @llvm.amdgcn.interp.p2(float %p1.i, float %j.f.i, i32 3, i32 0, i32 %arg6) #1
28 %tmp23 = fadd float %p2.i, 0xBFA99999A0000000
29 %tmp24 = fadd float %p2.i, 0x3FA99999A0000000
Krzysztof Parzyszek3bf4aec2016-09-02 19:48:55 +000030 %tmp25 = bitcast float %tmp23 to i32
31 %tmp26 = insertelement <16 x i32> <i32 212739, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>, i32 %tmp25, i32 1
32 %tmp27 = insertelement <16 x i32> %tmp26, i32 undef, i32 2
33 %tmp28 = insertelement <16 x i32> %tmp27, i32 undef, i32 3
34 %tmp29 = insertelement <16 x i32> %tmp28, i32 undef, i32 4
35 %tmp30 = insertelement <16 x i32> %tmp29, i32 0, i32 5
36 %tmp31 = insertelement <16 x i32> %tmp30, i32 undef, i32 6
37 %tmp32 = insertelement <16 x i32> %tmp31, i32 undef, i32 7
38 %tmp33 = insertelement <16 x i32> %tmp32, i32 undef, i32 8
39 %tmp34 = call <4 x float> @llvm.SI.image.sample.c.d.o.v16i32(<16 x i32> %tmp33, <8 x i32> undef, <4 x i32> undef, i32 15, i32 0, i32 0, i32 1, i32 0, i32 0, i32 0, i32 0)
40 %tmp35 = extractelement <4 x float> %tmp34, i32 0
41 %tmp36 = bitcast float %tmp24 to i32
42 %tmp37 = insertelement <16 x i32> <i32 212739, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>, i32 %tmp36, i32 1
43 %tmp38 = insertelement <16 x i32> %tmp37, i32 undef, i32 2
44 %tmp39 = insertelement <16 x i32> %tmp38, i32 undef, i32 3
45 %tmp40 = insertelement <16 x i32> %tmp39, i32 undef, i32 4
46 %tmp41 = insertelement <16 x i32> %tmp40, i32 0, i32 5
47 %tmp42 = insertelement <16 x i32> %tmp41, i32 undef, i32 6
48 %tmp43 = insertelement <16 x i32> %tmp42, i32 undef, i32 7
49 %tmp44 = insertelement <16 x i32> %tmp43, i32 undef, i32 8
50 %tmp45 = call <4 x float> @llvm.SI.image.sample.c.d.o.v16i32(<16 x i32> %tmp44, <8 x i32> undef, <4 x i32> undef, i32 15, i32 0, i32 0, i32 1, i32 0, i32 0, i32 0, i32 0)
51 %tmp46 = extractelement <4 x float> %tmp45, i32 0
52 %tmp47 = fmul float %tmp35, %tmp46
53 %tmp48 = insertvalue <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, float, float, float, float, float, float, float, float, float, float, float, float, float, float }> undef, float %tmp47, 14
54 %tmp49 = insertvalue <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, float, float, float, float, float, float, float, float, float, float, float, float, float, float }> %tmp48, float %arg21, 24
55 ret <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, float, float, float, float, float, float, float, float, float, float, float, float, float, float }> %tmp49
56}
57
Matt Arsenaultd2c8a332017-02-16 02:01:13 +000058; Function Attrs: nounwind readnone
59declare float @llvm.SI.load.const(<16 x i8>, i32) #0
Krzysztof Parzyszek3bf4aec2016-09-02 19:48:55 +000060
Matt Arsenaultd2c8a332017-02-16 02:01:13 +000061; Function Attrs: nounwind readnone
62declare <4 x float> @llvm.SI.image.sample.c.d.o.v16i32(<16 x i32>, <8 x i32>, <4 x i32>, i32, i32, i32, i32, i32, i32, i32, i32) #0
63
64; Function Attrs: nounwind readnone
65declare float @llvm.amdgcn.interp.p1(float, i32, i32, i32) #0
66
67; Function Attrs: nounwind readnone
68declare float @llvm.amdgcn.interp.p2(float, float, i32, i32, i32) #0
69
70; Function Attrs: nounwind readnone
71declare float @llvm.amdgcn.interp.mov(i32, i32, i32, i32) #0
72
73attributes #0 = { nounwind readnone }
74attributes #1 = { nounwind }