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