|
1 |
| -; RUN: opt %s -passes='function(scalarizer<load-store>)' -S | FileCheck %s |
| 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 | + |
| 4 | +define 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 | +} |
2 | 16 |
|
3 |
| -; CHECK-LABEL: @test_vector_half_frexp_half |
4 | 17 | define noundef <2 x half> @test_vector_half_frexp_half(<2 x half> noundef %h) {
|
5 |
| - ; CHECK: [[ee0:%.*]] = extractelement <2 x half> %h, i64 0 |
6 |
| - ; CHECK-NEXT: [[ie0:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[ee0]]) |
7 |
| - ; CHECK-NEXT: [[ee1:%.*]] = extractelement <2 x half> %h, i64 1 |
8 |
| - ; CHECK-NEXT: [[ie1:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[ee1]]) |
9 |
| - ; CHECK-NEXT: [[ev00:%.*]] = extractvalue { half, i32 } [[ie0]], 0 |
10 |
| - ; CHECK-NEXT: [[ev01:%.*]] = extractvalue { half, i32 } [[ie1]], 0 |
11 |
| - ; CHECK-NEXT: insertelement <2 x half> poison, half [[ev00]], i64 0 |
12 |
| - ; CHECK-NEXT: insertelement <2 x half> %{{.*}}, half [[ev01]], i64 1 |
| 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 | +; |
13 | 30 | %r = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x half> %h)
|
14 | 31 | %e0 = extractvalue { <2 x half>, <2 x i32> } %r, 0
|
15 | 32 | ret <2 x half> %e0
|
16 | 33 | }
|
17 | 34 |
|
18 |
| -; CHECK-LABEL: @test_vector_half_frexp_int |
19 | 35 | define noundef <2 x i32> @test_vector_half_frexp_int(<2 x half> noundef %h) {
|
20 |
| - ; CHECK: [[ee0:%.*]] = extractelement <2 x half> %h, i64 0 |
21 |
| - ; CHECK-NEXT: [[ie0:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[ee0]]) |
22 |
| - ; CHECK-NEXT: [[ee1:%.*]] = extractelement <2 x half> %h, i64 1 |
23 |
| - ; CHECK-NEXT: [[ie1:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[ee1]]) |
24 |
| - ; CHECK-NEXT: [[ev10:%.*]] = extractvalue { half, i32 } [[ie0]], 1 |
25 |
| - ; CHECK-NEXT: [[ev11:%.*]] = extractvalue { half, i32 } [[ie1]], 1 |
26 |
| - ; CHECK-NEXT: insertelement <2 x i32> poison, i32 [[ev10]], i64 0 |
27 |
| - ; CHECK-NEXT: insertelement <2 x i32> %{{.*}}, i32 [[ev11]], i64 1 |
| 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 | +; |
28 | 48 | %r = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x half> %h)
|
29 | 49 | %e1 = extractvalue { <2 x half>, <2 x i32> } %r, 1
|
30 | 50 | ret <2 x i32> %e1
|
31 | 51 | }
|
32 | 52 |
|
33 |
| -; CHECK-LABEL: @test_vector_float_frexp_int |
34 | 53 | define noundef <2 x float> @test_vector_float_frexp_int(<2 x float> noundef %f) {
|
35 |
| - ; CHECK: [[ee0:%.*]] = extractelement <2 x float> %f, i64 0 |
36 |
| - ; CHECK-NEXT: [[ie0:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ee0]]) |
37 |
| - ; CHECK-NEXT: [[ee1:%.*]] = extractelement <2 x float> %f, i64 1 |
38 |
| - ; CHECK-NEXT: [[ie1:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ee1]]) |
39 |
| - ; CHECK-NEXT: [[ev00:%.*]] = extractvalue { float, i32 } [[ie0]], 0 |
40 |
| - ; CHECK-NEXT: [[ev01:%.*]] = extractvalue { float, i32 } [[ie1]], 0 |
41 |
| - ; CHECK-NEXT: insertelement <2 x float> poison, float [[ev00]], i64 0 |
42 |
| - ; CHECK-NEXT: insertelement <2 x float> %{{.*}}, float [[ev01]], i64 1 |
43 |
| - ; CHECK-NEXT: extractvalue { float, i32 } [[ie0]], 1 |
44 |
| - ; CHECK-NEXT: extractvalue { float, i32 } [[ie1]], 1 |
| 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 | +; |
45 | 68 | %1 = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x float> %f)
|
46 | 69 | %2 = extractvalue { <2 x float>, <2 x i32> } %1, 0
|
47 | 70 | %3 = extractvalue { <2 x float>, <2 x i32> } %1, 1
|
48 | 71 | ret <2 x float> %2
|
49 | 72 | }
|
50 | 73 |
|
51 |
| -; CHECK-LABEL: @test_vector_double_frexp_int |
52 | 74 | define noundef <2 x double> @test_vector_double_frexp_int(<2 x double> noundef %d) {
|
53 |
| - ; CHECK: [[ee0:%.*]] = extractelement <2 x double> %d, i64 0 |
54 |
| - ; CHECK-NEXT: [[ie0:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double [[ee0]]) |
55 |
| - ; CHECK-NEXT: [[ee1:%.*]] = extractelement <2 x double> %d, i64 1 |
56 |
| - ; CHECK-NEXT: [[ie1:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double [[ee1]]) |
57 |
| - ; CHECK-NEXT: [[ev00:%.*]] = extractvalue { double, i32 } [[ie0]], 0 |
58 |
| - ; CHECK-NEXT: [[ev01:%.*]] = extractvalue { double, i32 } [[ie1]], 0 |
59 |
| - ; CHECK-NEXT: insertelement <2 x double> poison, double [[ev00]], i64 0 |
60 |
| - ; CHECK-NEXT: insertelement <2 x double> %{{.*}}, double [[ev01]], i64 1 |
61 |
| - ; CHECK-NEXT: extractvalue { double, i32 } [[ie0]], 1 |
62 |
| - ; CHECK-NEXT: extractvalue { double, i32 } [[ie1]], 1 |
| 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 | +; |
63 | 89 | %1 = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %d)
|
64 | 90 | %2 = extractvalue { <2 x double>, <2 x i32> } %1, 0
|
65 | 91 | %3 = extractvalue { <2 x double>, <2 x i32> } %1, 1
|
|
0 commit comments