Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / amdgpu-simplify-libcall-ldexp-splat.ll
blob1f6b8ef6a3266f6a02bd3022ad986bfa70bcd630
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2 ; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=amdgpu-simplifylib %s | FileCheck %s
4 target datalayout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-p7:160:256:256:32-p8:128:128-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8"
6 declare <2 x float> @_Z5ldexpDv2_fi(<2 x float>, i32)
7 declare <3 x float> @_Z5ldexpDv3_fi(<3 x float>, i32)
8 declare <4 x float> @_Z5ldexpDv4_fi(<4 x float>, i32)
9 declare <8 x float> @_Z5ldexpDv8_fi(<8 x float>, i32)
10 declare <16 x float> @_Z5ldexpDv16_fi(<16 x float>, i32)
11 declare <2 x double> @_Z5ldexpDv2_di(<2 x double>, i32)
12 declare <3 x double> @_Z5ldexpDv3_di(<3 x double>, i32)
13 declare <4 x double> @_Z5ldexpDv4_di(<4 x double>, i32)
14 declare <8 x double> @_Z5ldexpDv8_di(<8 x double>, i32)
15 declare <16 x double> @_Z5ldexpDv16_di(<16 x double>, i32)
16 declare <2 x half> @_Z5ldexpDv2_Dhi(<2 x half>, i32)
17 declare <3 x half> @_Z5ldexpDv3_Dhi(<3 x half>, i32)
18 declare <4 x half> @_Z5ldexpDv4_Dhi(<4 x half>, i32)
19 declare <8 x half> @_Z5ldexpDv8_Dhi(<8 x half>, i32)
20 declare <16 x half> @_Z5ldexpDv16_Dhi(<16 x half>, i32)
22 define <2 x float> @test_ldexp_v2f32_i32(<2 x float> %x, i32 %y) {
23 ; CHECK-LABEL: define <2 x float> @test_ldexp_v2f32_i32
24 ; CHECK-SAME: (<2 x float> [[X:%.*]], i32 [[Y:%.*]]) {
25 ; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <2 x i32> poison, i32 [[Y]], i64 0
26 ; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <2 x i32> [[DOTSPLATINSERT]], <2 x i32> poison, <2 x i32> zeroinitializer
27 ; CHECK-NEXT:    [[LDEXP:%.*]] = tail call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> [[DOTSPLAT]])
28 ; CHECK-NEXT:    ret <2 x float> [[LDEXP]]
30   %ldexp = tail call <2 x float> @_Z5ldexpDv2_fi(<2 x float> %x, i32 %y)
31   ret <2 x float> %ldexp
34 define <3 x float> @test_ldexp_v3f32_i32(<3 x float> %x, i32 %y) {
35 ; CHECK-LABEL: define <3 x float> @test_ldexp_v3f32_i32
36 ; CHECK-SAME: (<3 x float> [[X:%.*]], i32 [[Y:%.*]]) {
37 ; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <3 x i32> poison, i32 [[Y]], i64 0
38 ; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <3 x i32> [[DOTSPLATINSERT]], <3 x i32> poison, <3 x i32> zeroinitializer
39 ; CHECK-NEXT:    [[LDEXP:%.*]] = tail call <3 x float> @llvm.ldexp.v3f32.v3i32(<3 x float> [[X]], <3 x i32> [[DOTSPLAT]])
40 ; CHECK-NEXT:    ret <3 x float> [[LDEXP]]
42   %ldexp = tail call <3 x float> @_Z5ldexpDv3_fi(<3 x float> %x, i32 %y)
43   ret <3 x float> %ldexp
46 define <4 x float> @test_ldexp_v4f32_i32(<4 x float> %x, i32 %y) {
47 ; CHECK-LABEL: define <4 x float> @test_ldexp_v4f32_i32
48 ; CHECK-SAME: (<4 x float> [[X:%.*]], i32 [[Y:%.*]]) {
49 ; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[Y]], i64 0
50 ; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <4 x i32> [[DOTSPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
51 ; CHECK-NEXT:    [[LDEXP:%.*]] = tail call <4 x float> @llvm.ldexp.v4f32.v4i32(<4 x float> [[X]], <4 x i32> [[DOTSPLAT]])
52 ; CHECK-NEXT:    ret <4 x float> [[LDEXP]]
54   %ldexp = tail call <4 x float> @_Z5ldexpDv4_fi(<4 x float> %x, i32 %y)
55   ret <4 x float> %ldexp
58 define <8 x float> @test_ldexp_v8f32_i32(<8 x float> %x, i32 %y) {
59 ; CHECK-LABEL: define <8 x float> @test_ldexp_v8f32_i32
60 ; CHECK-SAME: (<8 x float> [[X:%.*]], i32 [[Y:%.*]]) {
61 ; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <8 x i32> poison, i32 [[Y]], i64 0
62 ; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <8 x i32> [[DOTSPLATINSERT]], <8 x i32> poison, <8 x i32> zeroinitializer
63 ; CHECK-NEXT:    [[LDEXP:%.*]] = tail call <8 x float> @llvm.ldexp.v8f32.v8i32(<8 x float> [[X]], <8 x i32> [[DOTSPLAT]])
64 ; CHECK-NEXT:    ret <8 x float> [[LDEXP]]
66   %ldexp = tail call <8 x float> @_Z5ldexpDv8_fi(<8 x float> %x, i32 %y)
67   ret <8 x float> %ldexp
70 define <16 x float> @test_ldexp_v16f32_i32(<16 x float> %x, i32 %y) {
71 ; CHECK-LABEL: define <16 x float> @test_ldexp_v16f32_i32
72 ; CHECK-SAME: (<16 x float> [[X:%.*]], i32 [[Y:%.*]]) {
73 ; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <16 x i32> poison, i32 [[Y]], i64 0
74 ; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <16 x i32> [[DOTSPLATINSERT]], <16 x i32> poison, <16 x i32> zeroinitializer
75 ; CHECK-NEXT:    [[LDEXP:%.*]] = tail call <16 x float> @llvm.ldexp.v16f32.v16i32(<16 x float> [[X]], <16 x i32> [[DOTSPLAT]])
76 ; CHECK-NEXT:    ret <16 x float> [[LDEXP]]
78   %ldexp = tail call <16 x float> @_Z5ldexpDv16_fi(<16 x float> %x, i32 %y)
79   ret <16 x float> %ldexp
82 define <2 x double> @test_ldexp_v2f64_i32(<2 x double> %x, i32 %y) {
83 ; CHECK-LABEL: define <2 x double> @test_ldexp_v2f64_i32
84 ; CHECK-SAME: (<2 x double> [[X:%.*]], i32 [[Y:%.*]]) {
85 ; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <2 x i32> poison, i32 [[Y]], i64 0
86 ; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <2 x i32> [[DOTSPLATINSERT]], <2 x i32> poison, <2 x i32> zeroinitializer
87 ; CHECK-NEXT:    [[LDEXP:%.*]] = tail call <2 x double> @llvm.ldexp.v2f64.v2i32(<2 x double> [[X]], <2 x i32> [[DOTSPLAT]])
88 ; CHECK-NEXT:    ret <2 x double> [[LDEXP]]
90   %ldexp = tail call <2 x double> @_Z5ldexpDv2_di(<2 x double> %x, i32 %y)
91   ret <2 x double> %ldexp
94 define <3 x double> @test_ldexp_v3f64_i32(<3 x double> %x, i32 %y) {
95 ; CHECK-LABEL: define <3 x double> @test_ldexp_v3f64_i32
96 ; CHECK-SAME: (<3 x double> [[X:%.*]], i32 [[Y:%.*]]) {
97 ; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <3 x i32> poison, i32 [[Y]], i64 0
98 ; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <3 x i32> [[DOTSPLATINSERT]], <3 x i32> poison, <3 x i32> zeroinitializer
99 ; CHECK-NEXT:    [[LDEXP:%.*]] = tail call <3 x double> @llvm.ldexp.v3f64.v3i32(<3 x double> [[X]], <3 x i32> [[DOTSPLAT]])
100 ; CHECK-NEXT:    ret <3 x double> [[LDEXP]]
102   %ldexp = tail call <3 x double> @_Z5ldexpDv3_di(<3 x double> %x, i32 %y)
103   ret <3 x double> %ldexp
106 define <4 x double> @test_ldexp_v4f64_i32(<4 x double> %x, i32 %y) {
107 ; CHECK-LABEL: define <4 x double> @test_ldexp_v4f64_i32
108 ; CHECK-SAME: (<4 x double> [[X:%.*]], i32 [[Y:%.*]]) {
109 ; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[Y]], i64 0
110 ; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <4 x i32> [[DOTSPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
111 ; CHECK-NEXT:    [[LDEXP:%.*]] = tail call <4 x double> @llvm.ldexp.v4f64.v4i32(<4 x double> [[X]], <4 x i32> [[DOTSPLAT]])
112 ; CHECK-NEXT:    ret <4 x double> [[LDEXP]]
114   %ldexp = tail call <4 x double> @_Z5ldexpDv4_di(<4 x double> %x, i32 %y)
115   ret <4 x double> %ldexp
118 define <8 x double> @test_ldexp_v8f64_i32(<8 x double> %x, i32 %y) {
119 ; CHECK-LABEL: define <8 x double> @test_ldexp_v8f64_i32
120 ; CHECK-SAME: (<8 x double> [[X:%.*]], i32 [[Y:%.*]]) {
121 ; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <8 x i32> poison, i32 [[Y]], i64 0
122 ; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <8 x i32> [[DOTSPLATINSERT]], <8 x i32> poison, <8 x i32> zeroinitializer
123 ; CHECK-NEXT:    [[LDEXP:%.*]] = tail call <8 x double> @llvm.ldexp.v8f64.v8i32(<8 x double> [[X]], <8 x i32> [[DOTSPLAT]])
124 ; CHECK-NEXT:    ret <8 x double> [[LDEXP]]
126   %ldexp = tail call <8 x double> @_Z5ldexpDv8_di(<8 x double> %x, i32 %y)
127   ret <8 x double> %ldexp
130 define <16 x double> @test_ldexp_v16f64_i32(<16 x double> %x, i32 %y) {
131 ; CHECK-LABEL: define <16 x double> @test_ldexp_v16f64_i32
132 ; CHECK-SAME: (<16 x double> [[X:%.*]], i32 [[Y:%.*]]) {
133 ; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <16 x i32> poison, i32 [[Y]], i64 0
134 ; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <16 x i32> [[DOTSPLATINSERT]], <16 x i32> poison, <16 x i32> zeroinitializer
135 ; CHECK-NEXT:    [[LDEXP:%.*]] = tail call <16 x double> @llvm.ldexp.v16f64.v16i32(<16 x double> [[X]], <16 x i32> [[DOTSPLAT]])
136 ; CHECK-NEXT:    ret <16 x double> [[LDEXP]]
138   %ldexp = tail call <16 x double> @_Z5ldexpDv16_di(<16 x double> %x, i32 %y)
139   ret <16 x double> %ldexp
142 define <2 x half> @test_ldexp_v2f16_i32(<2 x half> %x, i32 %y) {
143 ; CHECK-LABEL: define <2 x half> @test_ldexp_v2f16_i32
144 ; CHECK-SAME: (<2 x half> [[X:%.*]], i32 [[Y:%.*]]) {
145 ; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <2 x i32> poison, i32 [[Y]], i64 0
146 ; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <2 x i32> [[DOTSPLATINSERT]], <2 x i32> poison, <2 x i32> zeroinitializer
147 ; CHECK-NEXT:    [[LDEXP:%.*]] = tail call <2 x half> @llvm.ldexp.v2f16.v2i32(<2 x half> [[X]], <2 x i32> [[DOTSPLAT]])
148 ; CHECK-NEXT:    ret <2 x half> [[LDEXP]]
150   %ldexp = tail call <2 x half> @_Z5ldexpDv2_Dhi(<2 x half> %x, i32 %y)
151   ret <2 x half> %ldexp
154 define <3 x half> @test_ldexp_v3f16_i32(<3 x half> %x, i32 %y) {
155 ; CHECK-LABEL: define <3 x half> @test_ldexp_v3f16_i32
156 ; CHECK-SAME: (<3 x half> [[X:%.*]], i32 [[Y:%.*]]) {
157 ; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <3 x i32> poison, i32 [[Y]], i64 0
158 ; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <3 x i32> [[DOTSPLATINSERT]], <3 x i32> poison, <3 x i32> zeroinitializer
159 ; CHECK-NEXT:    [[LDEXP:%.*]] = tail call <3 x half> @llvm.ldexp.v3f16.v3i32(<3 x half> [[X]], <3 x i32> [[DOTSPLAT]])
160 ; CHECK-NEXT:    ret <3 x half> [[LDEXP]]
162   %ldexp = tail call <3 x half> @_Z5ldexpDv3_Dhi(<3 x half> %x, i32 %y)
163   ret <3 x half> %ldexp
166 define <4 x half> @test_ldexp_v4f16_i32(<4 x half> %x, i32 %y) {
167 ; CHECK-LABEL: define <4 x half> @test_ldexp_v4f16_i32
168 ; CHECK-SAME: (<4 x half> [[X:%.*]], i32 [[Y:%.*]]) {
169 ; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[Y]], i64 0
170 ; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <4 x i32> [[DOTSPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
171 ; CHECK-NEXT:    [[LDEXP:%.*]] = tail call <4 x half> @llvm.ldexp.v4f16.v4i32(<4 x half> [[X]], <4 x i32> [[DOTSPLAT]])
172 ; CHECK-NEXT:    ret <4 x half> [[LDEXP]]
174   %ldexp = tail call <4 x half> @_Z5ldexpDv4_Dhi(<4 x half> %x, i32 %y)
175   ret <4 x half> %ldexp
178 define <8 x half> @test_ldexp_v8f16_i32(<8 x half> %x, i32 %y) {
179 ; CHECK-LABEL: define <8 x half> @test_ldexp_v8f16_i32
180 ; CHECK-SAME: (<8 x half> [[X:%.*]], i32 [[Y:%.*]]) {
181 ; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <8 x i32> poison, i32 [[Y]], i64 0
182 ; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <8 x i32> [[DOTSPLATINSERT]], <8 x i32> poison, <8 x i32> zeroinitializer
183 ; CHECK-NEXT:    [[LDEXP:%.*]] = tail call <8 x half> @llvm.ldexp.v8f16.v8i32(<8 x half> [[X]], <8 x i32> [[DOTSPLAT]])
184 ; CHECK-NEXT:    ret <8 x half> [[LDEXP]]
186   %ldexp = tail call <8 x half> @_Z5ldexpDv8_Dhi(<8 x half> %x, i32 %y)
187   ret <8 x half> %ldexp
190 define <16 x half> @test_ldexp_v16f16_i32(<16 x half> %x, i32 %y) {
191 ; CHECK-LABEL: define <16 x half> @test_ldexp_v16f16_i32
192 ; CHECK-SAME: (<16 x half> [[X:%.*]], i32 [[Y:%.*]]) {
193 ; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <16 x i32> poison, i32 [[Y]], i64 0
194 ; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <16 x i32> [[DOTSPLATINSERT]], <16 x i32> poison, <16 x i32> zeroinitializer
195 ; CHECK-NEXT:    [[LDEXP:%.*]] = tail call <16 x half> @llvm.ldexp.v16f16.v16i32(<16 x half> [[X]], <16 x i32> [[DOTSPLAT]])
196 ; CHECK-NEXT:    ret <16 x half> [[LDEXP]]
198   %ldexp = tail call <16 x half> @_Z5ldexpDv16_Dhi(<16 x half> %x, i32 %y)
199   ret <16 x half> %ldexp