296 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 32; RUN: opt -S -passes=instcombine %s | FileCheck %s3 4declare { float, i32 } @llvm.frexp.f32.i32(float)5declare { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float>)6declare { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float>)7declare { ppc_fp128, i32 } @llvm.frexp.ppcf128.i32(ppc_fp128)8declare { <vscale x 2 x float>, <vscale x 2 x i32> } @llvm.frexp.nxv2f32.nxv2i32(<vscale x 2 x float>)9 10 11define { float, i32 } @frexp_frexp(float %x) {12; CHECK-LABEL: define { float, i32 } @frexp_frexp(13; CHECK-SAME: float [[X:%.*]]) {14; CHECK-NEXT: [[FREXP0:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[X]])15; CHECK-NEXT: [[FREXP1:%.*]] = insertvalue { float, i32 } [[FREXP0]], i32 0, 116; CHECK-NEXT: ret { float, i32 } [[FREXP1]]17;18 %frexp0 = call { float, i32 } @llvm.frexp.f32.i32(float %x)19 %frexp0.0 = extractvalue { float, i32 } %frexp0, 020 %frexp1 = call { float, i32 } @llvm.frexp.f32.i32(float %frexp0.0)21 ret { float, i32 } %frexp122}23 24define { <2 x float>, <2 x i32> } @frexp_frexp_vector(<2 x float> %x) {25; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_frexp_vector(26; CHECK-SAME: <2 x float> [[X:%.*]]) {27; CHECK-NEXT: [[FREXP0:%.*]] = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> [[X]])28; CHECK-NEXT: [[FREXP1:%.*]] = insertvalue { <2 x float>, <2 x i32> } [[FREXP0]], <2 x i32> zeroinitializer, 129; CHECK-NEXT: ret { <2 x float>, <2 x i32> } [[FREXP1]]30;31 %frexp0 = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %x)32 %frexp0.0 = extractvalue { <2 x float>, <2 x i32> } %frexp0, 033 %frexp1 = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %frexp0.0)34 ret { <2 x float>, <2 x i32> } %frexp135}36 37define { float, i32 } @frexp_frexp_const(float %x) {38; CHECK-LABEL: define { float, i32 } @frexp_frexp_const(39; CHECK-SAME: float [[X:%.*]]) {40; CHECK-NEXT: ret { float, i32 } { float 6.562500e-01, i32 0 }41;42 %frexp0 = call { float, i32 } @llvm.frexp.f32.i32(float 42.0)43 %frexp0.0 = extractvalue { float, i32 } %frexp0, 044 %frexp1 = call { float, i32 } @llvm.frexp.f32.i32(float %frexp0.0)45 ret { float, i32 } %frexp146}47 48define { <vscale x 2 x float>, <vscale x 2 x i32> } @frexp_frexp_scalable_vector(<vscale x 2 x float> %x) {49; CHECK-LABEL: define { <vscale x 2 x float>, <vscale x 2 x i32> } @frexp_frexp_scalable_vector(50; CHECK-SAME: <vscale x 2 x float> [[X:%.*]]) {51; CHECK-NEXT: [[FREXP0:%.*]] = call { <vscale x 2 x float>, <vscale x 2 x i32> } @llvm.frexp.nxv2f32.nxv2i32(<vscale x 2 x float> [[X]])52; CHECK-NEXT: [[FREXP1:%.*]] = insertvalue { <vscale x 2 x float>, <vscale x 2 x i32> } [[FREXP0]], <vscale x 2 x i32> zeroinitializer, 153; CHECK-NEXT: ret { <vscale x 2 x float>, <vscale x 2 x i32> } [[FREXP1]]54;55 %frexp0 = call { <vscale x 2 x float>, <vscale x 2 x i32> } @llvm.frexp.nxv2f32.nxv2i32(<vscale x 2 x float> %x)56 %frexp0.0 = extractvalue { <vscale x 2 x float>, <vscale x 2 x i32> } %frexp0, 057 %frexp1 = call { <vscale x 2 x float>, <vscale x 2 x i32> } @llvm.frexp.nxv2f32.nxv2i32(<vscale x 2 x float> %frexp0.0)58 ret { <vscale x 2 x float>, <vscale x 2 x i32> } %frexp159}60 61define { float, i32 } @frexp_poison() {62; CHECK-LABEL: define { float, i32 } @frexp_poison() {63; CHECK-NEXT: ret { float, i32 } poison64;65 %ret = call { float, i32 } @llvm.frexp.f32.i32(float poison)66 ret { float, i32 } %ret67}68 69define { <2 x float>, <2 x i32> } @frexp_poison_vector() {70; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_poison_vector() {71; CHECK-NEXT: ret { <2 x float>, <2 x i32> } poison72;73 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> poison)74 ret { <2 x float>, <2 x i32> } %ret75}76 77define { <vscale x 2 x float>, <vscale x 2 x i32> } @frexp_poison_scaleable_vector() {78; CHECK-LABEL: define { <vscale x 2 x float>, <vscale x 2 x i32> } @frexp_poison_scaleable_vector() {79; CHECK-NEXT: ret { <vscale x 2 x float>, <vscale x 2 x i32> } poison80;81 %ret = call { <vscale x 2 x float>, <vscale x 2 x i32> } @llvm.frexp.nxv2f32.nxv2i32(<vscale x 2 x float> poison)82 ret { <vscale x 2 x float>, <vscale x 2 x i32> } %ret83}84 85define { float, i32 } @frexp_undef() {86; CHECK-LABEL: define { float, i32 } @frexp_undef() {87; CHECK-NEXT: [[RET:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float undef)88; CHECK-NEXT: ret { float, i32 } [[RET]]89;90 %ret = call { float, i32 } @llvm.frexp.f32.i32(float undef)91 ret { float, i32 } %ret92}93define { <2 x float>, <2 x i32> } @frexp_undef_vector() {94; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_undef_vector() {95; CHECK-NEXT: [[RET:%.*]] = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> undef)96; CHECK-NEXT: ret { <2 x float>, <2 x i32> } [[RET]]97;98 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> undef)99 ret { <2 x float>, <2 x i32> } %ret100}101 102define { <2 x float>, <2 x i32> } @frexp_zero_vector() {103; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_zero_vector() {104; CHECK-NEXT: ret { <2 x float>, <2 x i32> } zeroinitializer105;106 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> zeroinitializer)107 ret { <2 x float>, <2 x i32> } %ret108}109 110define { <vscale x 2 x float>, <vscale x 2 x i32> } @frexp_zero_scalable_vector() {111; CHECK-LABEL: define { <vscale x 2 x float>, <vscale x 2 x i32> } @frexp_zero_scalable_vector() {112; CHECK-NEXT: [[RET:%.*]] = call { <vscale x 2 x float>, <vscale x 2 x i32> } @llvm.frexp.nxv2f32.nxv2i32(<vscale x 2 x float> zeroinitializer)113; CHECK-NEXT: ret { <vscale x 2 x float>, <vscale x 2 x i32> } [[RET]]114;115 %ret = call { <vscale x 2 x float>, <vscale x 2 x i32> } @llvm.frexp.nxv2f32.nxv2i32(<vscale x 2 x float> zeroinitializer)116 ret { <vscale x 2 x float>, <vscale x 2 x i32> } %ret117}118 119define { <2 x float>, <2 x i32> } @frexp_zero_negzero_vector() {120; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_zero_negzero_vector() {121; CHECK-NEXT: ret { <2 x float>, <2 x i32> } { <2 x float> <float 0.000000e+00, float -0.000000e+00>, <2 x i32> zeroinitializer }122;123 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> <float 0.0, float -0.0>)124 ret { <2 x float>, <2 x i32> } %ret125}126 127define { <4 x float>, <4 x i32> } @frexp_nonsplat_vector() {128; CHECK-LABEL: define { <4 x float>, <4 x i32> } @frexp_nonsplat_vector() {129; CHECK-NEXT: [[RET:%.*]] = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> <float 1.600000e+01, float -3.200000e+01, float undef, float 9.999000e+03>)130; CHECK-NEXT: ret { <4 x float>, <4 x i32> } [[RET]]131;132 %ret = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> <float 16.0, float -32.0, float undef, float 9999.0>)133 ret { <4 x float>, <4 x i32> } %ret134}135 136define { float, i32 } @frexp_zero() {137; CHECK-LABEL: define { float, i32 } @frexp_zero() {138; CHECK-NEXT: ret { float, i32 } zeroinitializer139;140 %ret = call { float, i32 } @llvm.frexp.f32.i32(float 0.0)141 ret { float, i32 } %ret142}143 144define { float, i32 } @frexp_negzero() {145; CHECK-LABEL: define { float, i32 } @frexp_negzero() {146; CHECK-NEXT: ret { float, i32 } { float -0.000000e+00, i32 0 }147;148 %ret = call { float, i32 } @llvm.frexp.f32.i32(float -0.0)149 ret { float, i32 } %ret150}151 152define { float, i32 } @frexp_one() {153; CHECK-LABEL: define { float, i32 } @frexp_one() {154; CHECK-NEXT: ret { float, i32 } { float 5.000000e-01, i32 1 }155;156 %ret = call { float, i32 } @llvm.frexp.f32.i32(float 1.0)157 ret { float, i32 } %ret158}159 160define { float, i32 } @frexp_negone() {161; CHECK-LABEL: define { float, i32 } @frexp_negone() {162; CHECK-NEXT: ret { float, i32 } { float -5.000000e-01, i32 1 }163;164 %ret = call { float, i32 } @llvm.frexp.f32.i32(float -1.0)165 ret { float, i32 } %ret166}167 168define { float, i32 } @frexp_two() {169; CHECK-LABEL: define { float, i32 } @frexp_two() {170; CHECK-NEXT: ret { float, i32 } { float 5.000000e-01, i32 2 }171;172 %ret = call { float, i32 } @llvm.frexp.f32.i32(float 2.0)173 ret { float, i32 } %ret174}175 176define { float, i32 } @frexp_negtwo() {177; CHECK-LABEL: define { float, i32 } @frexp_negtwo() {178; CHECK-NEXT: ret { float, i32 } { float -5.000000e-01, i32 2 }179;180 %ret = call { float, i32 } @llvm.frexp.f32.i32(float -2.0)181 ret { float, i32 } %ret182}183 184define { float, i32 } @frexp_inf() {185; CHECK-LABEL: define { float, i32 } @frexp_inf() {186; CHECK-NEXT: ret { float, i32 } { float 0x7FF0000000000000, i32 0 }187;188 %ret = call { float, i32 } @llvm.frexp.f32.i32(float 0x7FF0000000000000)189 ret { float, i32 } %ret190}191 192define { float, i32 } @frexp_neginf() {193; CHECK-LABEL: define { float, i32 } @frexp_neginf() {194; CHECK-NEXT: ret { float, i32 } { float 0xFFF0000000000000, i32 0 }195;196 %ret = call { float, i32 } @llvm.frexp.f32.i32(float 0xFFF0000000000000)197 ret { float, i32 } %ret198}199 200define { float, i32 } @frexp_qnan() {201; CHECK-LABEL: define { float, i32 } @frexp_qnan() {202; CHECK-NEXT: ret { float, i32 } { float 0x7FF8000000000000, i32 0 }203;204 %ret = call { float, i32 } @llvm.frexp.f32.i32(float 0x7FF8000000000000)205 ret { float, i32 } %ret206}207 208define { float, i32 } @frexp_snan() {209; CHECK-LABEL: define { float, i32 } @frexp_snan() {210; CHECK-NEXT: ret { float, i32 } { float 0x7FF8000020000000, i32 0 }211;212 %ret = call { float, i32 } @llvm.frexp.f32.i32(float bitcast (i32 2139095041 to float))213 ret { float, i32 } %ret214}215 216define { float, i32 } @frexp_pos_denorm() {217; CHECK-LABEL: define { float, i32 } @frexp_pos_denorm() {218; CHECK-NEXT: ret { float, i32 } { float 0x3FEFFFFFC0000000, i32 -126 }219;220 %ret = call { float, i32 } @llvm.frexp.f32.i32(float bitcast (i32 8388607 to float))221 ret { float, i32 } %ret222}223 224define { float, i32 } @frexp_neg_denorm() {225; CHECK-LABEL: define { float, i32 } @frexp_neg_denorm() {226; CHECK-NEXT: ret { float, i32 } { float 0xBFEFFFFFC0000000, i32 -126 }227;228 %ret = call { float, i32 } @llvm.frexp.f32.i32(float bitcast (i32 -2139095041 to float))229 ret { float, i32 } %ret230}231 232define { ppc_fp128, i32 } @frexp_one_ppcf128() {233; CHECK-LABEL: define { ppc_fp128, i32 } @frexp_one_ppcf128() {234; CHECK-NEXT: ret { ppc_fp128, i32 } { ppc_fp128 0xM3FE00000000000000000000000000000, i32 1 }235;236 %ret = call { ppc_fp128, i32 } @llvm.frexp.ppcf128.i32(ppc_fp128 0xM3FF00000000000000000000000000000)237 ret { ppc_fp128, i32 } %ret238}239 240define { ppc_fp128, i32 } @frexp_negone_ppcf128() {241; CHECK-LABEL: define { ppc_fp128, i32 } @frexp_negone_ppcf128() {242; CHECK-NEXT: ret { ppc_fp128, i32 } { ppc_fp128 0xMBFE00000000000000000000000000000, i32 1 }243;244 %ret = call { ppc_fp128, i32 } @llvm.frexp.ppcf128.i32(ppc_fp128 0xMBFF00000000000000000000000000000)245 ret { ppc_fp128, i32 } %ret246}247 248define { ppc_fp128, i32} @canonicalize_noncanonical_zero_1_ppcf128() {249; CHECK-LABEL: define { ppc_fp128, i32 } @canonicalize_noncanonical_zero_1_ppcf128() {250; CHECK-NEXT: ret { ppc_fp128, i32 } { ppc_fp128 0xM00000000000000000000000000000001, i32 0 }251;252 %ret = call { ppc_fp128, i32 } @llvm.frexp.ppcf128.i32(ppc_fp128 0xM00000000000000000000000000000001)253 ret { ppc_fp128, i32 } %ret254}255 256define { <2 x float>, <2 x i32> } @frexp_splat_4() {257; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_splat_4() {258; CHECK-NEXT: ret { <2 x float>, <2 x i32> } { <2 x float> splat (float 5.000000e-01), <2 x i32> splat (i32 3) }259;260 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> <float 4.0, float 4.0>)261 ret { <2 x float>, <2 x i32> } %ret262}263 264define { <2 x float>, <2 x i32> } @frexp_splat_qnan() {265; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_splat_qnan() {266; CHECK-NEXT: ret { <2 x float>, <2 x i32> } { <2 x float> splat (float 0x7FF8000000000000), <2 x i32> zeroinitializer }267;268 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> <float 0x7FF8000000000000, float 0x7FF8000000000000>)269 ret { <2 x float>, <2 x i32> } %ret270}271 272define { <2 x float>, <2 x i32> } @frexp_splat_inf() {273; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_splat_inf() {274; CHECK-NEXT: ret { <2 x float>, <2 x i32> } { <2 x float> splat (float 0x7FF0000000000000), <2 x i32> zeroinitializer }275;276 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> <float 0x7FF0000000000000, float 0x7FF0000000000000>)277 ret { <2 x float>, <2 x i32> } %ret278}279 280define { <2 x float>, <2 x i32> } @frexp_splat_neginf() {281; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_splat_neginf() {282; CHECK-NEXT: ret { <2 x float>, <2 x i32> } { <2 x float> splat (float 0xFFF0000000000000), <2 x i32> zeroinitializer }283;284 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> <float 0xFFF0000000000000, float 0xFFF0000000000000>)285 ret { <2 x float>, <2 x i32> } %ret286}287 288define { <2 x float>, <2 x i32> } @frexp_splat_undef_inf() {289; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_splat_undef_inf() {290; CHECK-NEXT: [[RET:%.*]] = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> <float undef, float 0x7FF0000000000000>)291; CHECK-NEXT: ret { <2 x float>, <2 x i32> } [[RET]]292;293 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> <float undef, float 0x7FF0000000000000>)294 ret { <2 x float>, <2 x i32> } %ret295}296