xref: /llvm-project/llvm/test/Transforms/Scalarizer/frexp.ll (revision dcbf2c2ca078367fcd84feae9a51226b9761117a)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2; RUN: opt %s -passes='function(scalarizer)' -S | FileCheck %s
3
4define void @test_vector_frexp_void(<2 x double> noundef %d) {
5; CHECK-LABEL: define void @test_vector_frexp_void(
6; CHECK-SAME: <2 x double> noundef [[D:%.*]]) {
7; CHECK-NEXT:    [[D_I0:%.*]] = extractelement <2 x double> [[D]], i64 0
8; CHECK-NEXT:    [[DOTI0:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double [[D_I0]])
9; CHECK-NEXT:    [[D_I1:%.*]] = extractelement <2 x double> [[D]], i64 1
10; CHECK-NEXT:    [[DOTI1:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double [[D_I1]])
11; CHECK-NEXT:    ret void
12;
13  %1 =  call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %d)
14  ret void
15}
16
17define noundef <2 x half> @test_vector_half_frexp_half(<2 x half> noundef %h) {
18; CHECK-LABEL: define noundef <2 x half> @test_vector_half_frexp_half(
19; CHECK-SAME: <2 x half> noundef [[H:%.*]]) {
20; CHECK-NEXT:    [[H_I0:%.*]] = extractelement <2 x half> [[H]], i64 0
21; CHECK-NEXT:    [[R_I0:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[H_I0]])
22; CHECK-NEXT:    [[H_I1:%.*]] = extractelement <2 x half> [[H]], i64 1
23; CHECK-NEXT:    [[R_I1:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[H_I1]])
24; CHECK-NEXT:    [[E0_ELEM0:%.*]] = extractvalue { half, i32 } [[R_I0]], 0
25; CHECK-NEXT:    [[E0_ELEM01:%.*]] = extractvalue { half, i32 } [[R_I1]], 0
26; CHECK-NEXT:    [[E0_UPTO0:%.*]] = insertelement <2 x half> poison, half [[E0_ELEM0]], i64 0
27; CHECK-NEXT:    [[E0:%.*]] = insertelement <2 x half> [[E0_UPTO0]], half [[E0_ELEM01]], i64 1
28; CHECK-NEXT:    ret <2 x half> [[E0]]
29;
30  %r =  call { <2 x half>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x half> %h)
31  %e0 = extractvalue { <2 x half>, <2 x i32> } %r, 0
32  ret <2 x half> %e0
33}
34
35define noundef <2 x i32> @test_vector_half_frexp_int(<2 x half> noundef %h) {
36; CHECK-LABEL: define noundef <2 x i32> @test_vector_half_frexp_int(
37; CHECK-SAME: <2 x half> noundef [[H:%.*]]) {
38; CHECK-NEXT:    [[H_I0:%.*]] = extractelement <2 x half> [[H]], i64 0
39; CHECK-NEXT:    [[R_I0:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[H_I0]])
40; CHECK-NEXT:    [[H_I1:%.*]] = extractelement <2 x half> [[H]], i64 1
41; CHECK-NEXT:    [[R_I1:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[H_I1]])
42; CHECK-NEXT:    [[E1_ELEM1:%.*]] = extractvalue { half, i32 } [[R_I0]], 1
43; CHECK-NEXT:    [[E1_ELEM11:%.*]] = extractvalue { half, i32 } [[R_I1]], 1
44; CHECK-NEXT:    [[E1_UPTO0:%.*]] = insertelement <2 x i32> poison, i32 [[E1_ELEM1]], i64 0
45; CHECK-NEXT:    [[E1:%.*]] = insertelement <2 x i32> [[E1_UPTO0]], i32 [[E1_ELEM11]], i64 1
46; CHECK-NEXT:    ret <2 x i32> [[E1]]
47;
48  %r =  call { <2 x half>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x half> %h)
49  %e1 = extractvalue { <2 x half>, <2 x i32> } %r, 1
50  ret <2 x i32> %e1
51}
52
53define noundef <2 x float> @test_vector_float_frexp_int(<2 x float> noundef %f) {
54; CHECK-LABEL: define noundef <2 x float> @test_vector_float_frexp_int(
55; CHECK-SAME: <2 x float> noundef [[F:%.*]]) {
56; CHECK-NEXT:    [[F_I0:%.*]] = extractelement <2 x float> [[F]], i64 0
57; CHECK-NEXT:    [[DOTI0:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[F_I0]])
58; CHECK-NEXT:    [[F_I1:%.*]] = extractelement <2 x float> [[F]], i64 1
59; CHECK-NEXT:    [[DOTI1:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[F_I1]])
60; CHECK-NEXT:    [[DOTELEM0:%.*]] = extractvalue { float, i32 } [[DOTI0]], 0
61; CHECK-NEXT:    [[DOTELEM01:%.*]] = extractvalue { float, i32 } [[DOTI1]], 0
62; CHECK-NEXT:    [[DOTUPTO010:%.*]] = insertelement <2 x float> poison, float [[DOTELEM0]], i64 0
63; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x float> [[DOTUPTO010]], float [[DOTELEM01]], i64 1
64; CHECK-NEXT:    [[DOTELEM1:%.*]] = extractvalue { float, i32 } [[DOTI0]], 1
65; CHECK-NEXT:    [[DOTELEM12:%.*]] = extractvalue { float, i32 } [[DOTI1]], 1
66; CHECK-NEXT:    ret <2 x float> [[TMP1]]
67;
68  %1 =  call { <2 x float>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x float> %f)
69  %2 = extractvalue { <2 x float>, <2 x i32> } %1, 0
70  %3 = extractvalue { <2 x float>, <2 x i32> } %1, 1
71  ret <2 x float> %2
72}
73
74define noundef <2 x double> @test_vector_double_frexp_int(<2 x double> noundef %d) {
75; CHECK-LABEL: define noundef <2 x double> @test_vector_double_frexp_int(
76; CHECK-SAME: <2 x double> noundef [[D:%.*]]) {
77; CHECK-NEXT:    [[D_I0:%.*]] = extractelement <2 x double> [[D]], i64 0
78; CHECK-NEXT:    [[DOTI0:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double [[D_I0]])
79; CHECK-NEXT:    [[D_I1:%.*]] = extractelement <2 x double> [[D]], i64 1
80; CHECK-NEXT:    [[DOTI1:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double [[D_I1]])
81; CHECK-NEXT:    [[DOTELEM0:%.*]] = extractvalue { double, i32 } [[DOTI0]], 0
82; CHECK-NEXT:    [[DOTELEM01:%.*]] = extractvalue { double, i32 } [[DOTI1]], 0
83; CHECK-NEXT:    [[DOTUPTO010:%.*]] = insertelement <2 x double> poison, double [[DOTELEM0]], i64 0
84; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> [[DOTUPTO010]], double [[DOTELEM01]], i64 1
85; CHECK-NEXT:    [[DOTELEM1:%.*]] = extractvalue { double, i32 } [[DOTI0]], 1
86; CHECK-NEXT:    [[DOTELEM12:%.*]] = extractvalue { double, i32 } [[DOTI1]], 1
87; CHECK-NEXT:    ret <2 x double> [[TMP1]]
88;
89  %1 =  call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %d)
90  %2 = extractvalue { <2 x double>, <2 x i32> } %1, 0
91  %3 = extractvalue { <2 x double>, <2 x i32> } %1, 1
92  ret <2 x double> %2
93}
94