1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3 2; RUN: opt -S -passes=instsimplify %s | FileCheck %s 3 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: ret { float, i32 } [[FREXP0]] 16; 17 %frexp0 = call { float, i32 } @llvm.frexp.f32.i32(float %x) 18 %frexp0.0 = extractvalue { float, i32 } %frexp0, 0 19 %frexp1 = call { float, i32 } @llvm.frexp.f32.i32(float %frexp0.0) 20 ret { float, i32 } %frexp1 21} 22 23define { <2 x float>, <2 x i32> } @frexp_frexp_vector(<2 x float> %x) { 24; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_frexp_vector( 25; CHECK-SAME: <2 x float> [[X:%.*]]) { 26; CHECK-NEXT: [[FREXP0:%.*]] = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> [[X]]) 27; CHECK-NEXT: ret { <2 x float>, <2 x i32> } [[FREXP0]] 28; 29 %frexp0 = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %x) 30 %frexp0.0 = extractvalue { <2 x float>, <2 x i32> } %frexp0, 0 31 %frexp1 = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %frexp0.0) 32 ret { <2 x float>, <2 x i32> } %frexp1 33} 34 35define { float, i32 } @frexp_frexp_const(float %x) { 36; CHECK-LABEL: define { float, i32 } @frexp_frexp_const( 37; CHECK-SAME: float [[X:%.*]]) { 38; CHECK-NEXT: ret { float, i32 } { float 6.562500e-01, i32 0 } 39; 40 %frexp0 = call { float, i32 } @llvm.frexp.f32.i32(float 42.0) 41 %frexp0.0 = extractvalue { float, i32 } %frexp0, 0 42 %frexp1 = call { float, i32 } @llvm.frexp.f32.i32(float %frexp0.0) 43 ret { float, i32 } %frexp1 44} 45 46define { <vscale x 2 x float>, <vscale x 2 x i32> } @frexp_frexp_scalable_vector(<vscale x 2 x float> %x) { 47; CHECK-LABEL: define { <vscale x 2 x float>, <vscale x 2 x i32> } @frexp_frexp_scalable_vector( 48; CHECK-SAME: <vscale x 2 x float> [[X:%.*]]) { 49; CHECK-NEXT: [[FREXP0:%.*]] = call { <vscale x 2 x float>, <vscale x 2 x i32> } @llvm.frexp.nxv2f32.nxv2i32(<vscale x 2 x float> [[X]]) 50; CHECK-NEXT: ret { <vscale x 2 x float>, <vscale x 2 x i32> } [[FREXP0]] 51; 52 %frexp0 = call { <vscale x 2 x float>, <vscale x 2 x i32> } @llvm.frexp.nxv2f32.nxv2i32(<vscale x 2 x float> %x) 53 %frexp0.0 = extractvalue { <vscale x 2 x float>, <vscale x 2 x i32> } %frexp0, 0 54 %frexp1 = call { <vscale x 2 x float>, <vscale x 2 x i32> } @llvm.frexp.nxv2f32.nxv2i32(<vscale x 2 x float> %frexp0.0) 55 ret { <vscale x 2 x float>, <vscale x 2 x i32> } %frexp1 56} 57 58define { float, i32 } @frexp_poison() { 59; CHECK-LABEL: define { float, i32 } @frexp_poison() { 60; CHECK-NEXT: ret { float, i32 } poison 61; 62 %ret = call { float, i32 } @llvm.frexp.f32.i32(float poison) 63 ret { float, i32 } %ret 64} 65 66define { <2 x float>, <2 x i32> } @frexp_poison_vector() { 67; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_poison_vector() { 68; CHECK-NEXT: ret { <2 x float>, <2 x i32> } poison 69; 70 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> poison) 71 ret { <2 x float>, <2 x i32> } %ret 72} 73 74define { <vscale x 2 x float>, <vscale x 2 x i32> } @frexp_poison_scaleable_vector() { 75; CHECK-LABEL: define { <vscale x 2 x float>, <vscale x 2 x i32> } @frexp_poison_scaleable_vector() { 76; CHECK-NEXT: ret { <vscale x 2 x float>, <vscale x 2 x i32> } poison 77; 78 %ret = call { <vscale x 2 x float>, <vscale x 2 x i32> } @llvm.frexp.nxv2f32.nxv2i32(<vscale x 2 x float> poison) 79 ret { <vscale x 2 x float>, <vscale x 2 x i32> } %ret 80} 81 82define { float, i32 } @frexp_undef() { 83; CHECK-LABEL: define { float, i32 } @frexp_undef() { 84; CHECK-NEXT: [[RET:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float undef) 85; CHECK-NEXT: ret { float, i32 } [[RET]] 86; 87 %ret = call { float, i32 } @llvm.frexp.f32.i32(float undef) 88 ret { float, i32 } %ret 89} 90define { <2 x float>, <2 x i32> } @frexp_undef_vector() { 91; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_undef_vector() { 92; CHECK-NEXT: [[RET:%.*]] = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> undef) 93; CHECK-NEXT: ret { <2 x float>, <2 x i32> } [[RET]] 94; 95 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> undef) 96 ret { <2 x float>, <2 x i32> } %ret 97} 98 99define { <2 x float>, <2 x i32> } @frexp_zero_vector() { 100; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_zero_vector() { 101; CHECK-NEXT: ret { <2 x float>, <2 x i32> } zeroinitializer 102; 103 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> zeroinitializer) 104 ret { <2 x float>, <2 x i32> } %ret 105} 106 107define { <vscale x 2 x float>, <vscale x 2 x i32> } @frexp_zero_scalable_vector() { 108; CHECK-LABEL: define { <vscale x 2 x float>, <vscale x 2 x i32> } @frexp_zero_scalable_vector() { 109; CHECK-NEXT: [[RET:%.*]] = call { <vscale x 2 x float>, <vscale x 2 x i32> } @llvm.frexp.nxv2f32.nxv2i32(<vscale x 2 x float> zeroinitializer) 110; CHECK-NEXT: ret { <vscale x 2 x float>, <vscale x 2 x i32> } [[RET]] 111; 112 %ret = call { <vscale x 2 x float>, <vscale x 2 x i32> } @llvm.frexp.nxv2f32.nxv2i32(<vscale x 2 x float> zeroinitializer) 113 ret { <vscale x 2 x float>, <vscale x 2 x i32> } %ret 114} 115 116define { <2 x float>, <2 x i32> } @frexp_zero_negzero_vector() { 117; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_zero_negzero_vector() { 118; CHECK-NEXT: ret { <2 x float>, <2 x i32> } { <2 x float> <float 0.000000e+00, float -0.000000e+00>, <2 x i32> zeroinitializer } 119; 120 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> <float 0.0, float -0.0>) 121 ret { <2 x float>, <2 x i32> } %ret 122} 123 124define { <4 x float>, <4 x i32> } @frexp_nonsplat_vector() { 125; CHECK-LABEL: define { <4 x float>, <4 x i32> } @frexp_nonsplat_vector() { 126; 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>) 127; CHECK-NEXT: ret { <4 x float>, <4 x i32> } [[RET]] 128; 129 %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>) 130 ret { <4 x float>, <4 x i32> } %ret 131} 132 133define { float, i32 } @frexp_zero() { 134; CHECK-LABEL: define { float, i32 } @frexp_zero() { 135; CHECK-NEXT: ret { float, i32 } zeroinitializer 136; 137 %ret = call { float, i32 } @llvm.frexp.f32.i32(float 0.0) 138 ret { float, i32 } %ret 139} 140 141define { float, i32 } @frexp_negzero() { 142; CHECK-LABEL: define { float, i32 } @frexp_negzero() { 143; CHECK-NEXT: ret { float, i32 } { float -0.000000e+00, i32 0 } 144; 145 %ret = call { float, i32 } @llvm.frexp.f32.i32(float -0.0) 146 ret { float, i32 } %ret 147} 148 149define { float, i32 } @frexp_one() { 150; CHECK-LABEL: define { float, i32 } @frexp_one() { 151; CHECK-NEXT: ret { float, i32 } { float 5.000000e-01, i32 1 } 152; 153 %ret = call { float, i32 } @llvm.frexp.f32.i32(float 1.0) 154 ret { float, i32 } %ret 155} 156 157define { float, i32 } @frexp_negone() { 158; CHECK-LABEL: define { float, i32 } @frexp_negone() { 159; CHECK-NEXT: ret { float, i32 } { float -5.000000e-01, i32 1 } 160; 161 %ret = call { float, i32 } @llvm.frexp.f32.i32(float -1.0) 162 ret { float, i32 } %ret 163} 164 165define { float, i32 } @frexp_two() { 166; CHECK-LABEL: define { float, i32 } @frexp_two() { 167; CHECK-NEXT: ret { float, i32 } { float 5.000000e-01, i32 2 } 168; 169 %ret = call { float, i32 } @llvm.frexp.f32.i32(float 2.0) 170 ret { float, i32 } %ret 171} 172 173define { float, i32 } @frexp_negtwo() { 174; CHECK-LABEL: define { float, i32 } @frexp_negtwo() { 175; CHECK-NEXT: ret { float, i32 } { float -5.000000e-01, i32 2 } 176; 177 %ret = call { float, i32 } @llvm.frexp.f32.i32(float -2.0) 178 ret { float, i32 } %ret 179} 180 181define { float, i32 } @frexp_inf() { 182; CHECK-LABEL: define { float, i32 } @frexp_inf() { 183; CHECK-NEXT: ret { float, i32 } { float 0x7FF0000000000000, i32 0 } 184; 185 %ret = call { float, i32 } @llvm.frexp.f32.i32(float 0x7FF0000000000000) 186 ret { float, i32 } %ret 187} 188 189define { float, i32 } @frexp_neginf() { 190; CHECK-LABEL: define { float, i32 } @frexp_neginf() { 191; CHECK-NEXT: ret { float, i32 } { float 0xFFF0000000000000, i32 0 } 192; 193 %ret = call { float, i32 } @llvm.frexp.f32.i32(float 0xFFF0000000000000) 194 ret { float, i32 } %ret 195} 196 197define { float, i32 } @frexp_qnan() { 198; CHECK-LABEL: define { float, i32 } @frexp_qnan() { 199; CHECK-NEXT: ret { float, i32 } { float 0x7FF8000000000000, i32 0 } 200; 201 %ret = call { float, i32 } @llvm.frexp.f32.i32(float 0x7FF8000000000000) 202 ret { float, i32 } %ret 203} 204 205define { float, i32 } @frexp_snan() { 206; CHECK-LABEL: define { float, i32 } @frexp_snan() { 207; CHECK-NEXT: ret { float, i32 } { float 0x7FF8000020000000, i32 0 } 208; 209 %ret = call { float, i32 } @llvm.frexp.f32.i32(float bitcast (i32 2139095041 to float)) 210 ret { float, i32 } %ret 211} 212 213define { float, i32 } @frexp_pos_denorm() { 214; CHECK-LABEL: define { float, i32 } @frexp_pos_denorm() { 215; CHECK-NEXT: ret { float, i32 } { float 0x3FEFFFFFC0000000, i32 -126 } 216; 217 %ret = call { float, i32 } @llvm.frexp.f32.i32(float bitcast (i32 8388607 to float)) 218 ret { float, i32 } %ret 219} 220 221define { float, i32 } @frexp_neg_denorm() { 222; CHECK-LABEL: define { float, i32 } @frexp_neg_denorm() { 223; CHECK-NEXT: ret { float, i32 } { float 0xBFEFFFFFC0000000, i32 -126 } 224; 225 %ret = call { float, i32 } @llvm.frexp.f32.i32(float bitcast (i32 -2139095041 to float)) 226 ret { float, i32 } %ret 227} 228 229define { ppc_fp128, i32 } @frexp_one_ppcf128() { 230; CHECK-LABEL: define { ppc_fp128, i32 } @frexp_one_ppcf128() { 231; CHECK-NEXT: ret { ppc_fp128, i32 } { ppc_fp128 0xM3FE00000000000000000000000000000, i32 1 } 232; 233 %ret = call { ppc_fp128, i32 } @llvm.frexp.ppcf128.i32(ppc_fp128 0xM3FF00000000000000000000000000000) 234 ret { ppc_fp128, i32 } %ret 235} 236 237define { ppc_fp128, i32 } @frexp_negone_ppcf128() { 238; CHECK-LABEL: define { ppc_fp128, i32 } @frexp_negone_ppcf128() { 239; CHECK-NEXT: ret { ppc_fp128, i32 } { ppc_fp128 0xMBFE00000000000000000000000000000, i32 1 } 240; 241 %ret = call { ppc_fp128, i32 } @llvm.frexp.ppcf128.i32(ppc_fp128 0xMBFF00000000000000000000000000000) 242 ret { ppc_fp128, i32 } %ret 243} 244 245define { ppc_fp128, i32} @canonicalize_noncanonical_zero_1_ppcf128() { 246; CHECK-LABEL: define { ppc_fp128, i32 } @canonicalize_noncanonical_zero_1_ppcf128() { 247; CHECK-NEXT: ret { ppc_fp128, i32 } { ppc_fp128 0xM00000000000000000000000000000001, i32 0 } 248; 249 %ret = call { ppc_fp128, i32 } @llvm.frexp.ppcf128.i32(ppc_fp128 0xM00000000000000000000000000000001) 250 ret { ppc_fp128, i32 } %ret 251} 252 253define { <2 x float>, <2 x i32> } @frexp_splat_4() { 254; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_splat_4() { 255; CHECK-NEXT: ret { <2 x float>, <2 x i32> } { <2 x float> splat (float 5.000000e-01), <2 x i32> splat (i32 3) } 256; 257 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> <float 4.0, float 4.0>) 258 ret { <2 x float>, <2 x i32> } %ret 259} 260 261define { <2 x float>, <2 x i32> } @frexp_splat_qnan() { 262; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_splat_qnan() { 263; CHECK-NEXT: ret { <2 x float>, <2 x i32> } { <2 x float> splat (float 0x7FF8000000000000), <2 x i32> zeroinitializer } 264; 265 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> <float 0x7FF8000000000000, float 0x7FF8000000000000>) 266 ret { <2 x float>, <2 x i32> } %ret 267} 268 269define { <2 x float>, <2 x i32> } @frexp_splat_inf() { 270; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_splat_inf() { 271; CHECK-NEXT: ret { <2 x float>, <2 x i32> } { <2 x float> splat (float 0x7FF0000000000000), <2 x i32> zeroinitializer } 272; 273 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> <float 0x7FF0000000000000, float 0x7FF0000000000000>) 274 ret { <2 x float>, <2 x i32> } %ret 275} 276 277define { <2 x float>, <2 x i32> } @frexp_splat_neginf() { 278; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_splat_neginf() { 279; CHECK-NEXT: ret { <2 x float>, <2 x i32> } { <2 x float> splat (float 0xFFF0000000000000), <2 x i32> zeroinitializer } 280; 281 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> <float 0xFFF0000000000000, float 0xFFF0000000000000>) 282 ret { <2 x float>, <2 x i32> } %ret 283} 284 285define { <2 x float>, <2 x i32> } @frexp_splat_undef_inf() { 286; CHECK-LABEL: define { <2 x float>, <2 x i32> } @frexp_splat_undef_inf() { 287; CHECK-NEXT: [[RET:%.*]] = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> <float undef, float 0x7FF0000000000000>) 288; CHECK-NEXT: ret { <2 x float>, <2 x i32> } [[RET]] 289; 290 %ret = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> <float undef, float 0x7FF0000000000000>) 291 ret { <2 x float>, <2 x i32> } %ret 292} 293