1; RUN: opt -mtriple msp430 -passes=instcombine -S < %s | FileCheck %s 2 3; Test case was copied from pow_fp_int.ll but adjusted for 16-bit int. 4; Assuming that we can't generate test checks for the same reason (PR42740). 5 6define double @pow_sitofp_const_base_fast(i16 %x) { 7; CHECK-LABEL: @pow_sitofp_const_base_fast( 8; CHECK-NEXT: [[TMP1:%.*]] = tail call afn float @llvm.powi.f32.i16(float 7.000000e+00, i16 [[X:%.*]]) 9; CHECK-NEXT: [[RES:%.*]] = fpext float [[TMP1]] to double 10; CHECK-NEXT: ret double [[RES]] 11; 12 %subfp = sitofp i16 %x to float 13 %pow = tail call afn float @llvm.pow.f32(float 7.000000e+00, float %subfp) 14 %res = fpext float %pow to double 15 ret double %res 16} 17 18define double @pow_uitofp_const_base_fast(i15 %x) { 19; CHECK-LABEL: @pow_uitofp_const_base_fast( 20; CHECK-NEXT: [[TMP1:%.*]] = zext i15 [[X:%.*]] to i16 21; CHECK-NEXT: [[TMP2:%.*]] = tail call afn float @llvm.powi.f32.i16(float 7.000000e+00, i16 [[TMP1]]) 22; CHECK-NEXT: [[RES:%.*]] = fpext float [[TMP2]] to double 23; CHECK-NEXT: ret double [[RES]] 24; 25 %subfp = uitofp i15 %x to float 26 %pow = tail call afn float @llvm.pow.f32(float 7.000000e+00, float %subfp) 27 %res = fpext float %pow to double 28 ret double %res 29} 30 31define double @pow_sitofp_double_const_base_fast(i16 %x) { 32; CHECK-LABEL: @pow_sitofp_double_const_base_fast( 33; CHECK-NEXT: [[TMP1:%.*]] = tail call afn double @llvm.powi.f64.i16(double 7.000000e+00, i16 [[X:%.*]]) 34; CHECK-NEXT: ret double [[TMP1]] 35; 36 %subfp = sitofp i16 %x to double 37 %pow = tail call afn double @llvm.pow.f64(double 7.000000e+00, double %subfp) 38 ret double %pow 39} 40 41define double @pow_uitofp_double_const_base_fast(i15 %x) { 42; CHECK-LABEL: @pow_uitofp_double_const_base_fast( 43; CHECK-NEXT: [[TMP1:%.*]] = zext i15 [[X:%.*]] to i16 44; CHECK-NEXT: [[TMP2:%.*]] = tail call afn double @llvm.powi.f64.i16(double 7.000000e+00, i16 [[TMP1]]) 45; CHECK-NEXT: ret double [[TMP2]] 46; 47 %subfp = uitofp i15 %x to double 48 %pow = tail call afn double @llvm.pow.f64(double 7.000000e+00, double %subfp) 49 ret double %pow 50} 51 52define double @pow_sitofp_double_const_base_2_fast(i16 %x) { 53; CHECK-LABEL: @pow_sitofp_double_const_base_2_fast( 54; CHECK-NEXT: [[LDEXPF:%.*]] = tail call afn float @llvm.ldexp.f32.i16(float 1.000000e+00, i16 [[X:%.*]]) 55; CHECK-NEXT: [[RES:%.*]] = fpext float [[LDEXPF]] to double 56; CHECK-NEXT: ret double [[RES]] 57; 58 %subfp = sitofp i16 %x to float 59 %pow = tail call afn float @llvm.pow.f32(float 2.000000e+00, float %subfp) 60 %res = fpext float %pow to double 61 ret double %res 62} 63 64define double @pow_sitofp_double_const_base_power_of_2_fast(i16 %x) { 65; CHECK-LABEL: @pow_sitofp_double_const_base_power_of_2_fast( 66; CHECK-NEXT: [[SUBFP:%.*]] = sitofp i16 [[X:%.*]] to float 67; CHECK-NEXT: [[MUL:%.*]] = fmul afn float [[SUBFP]], 4.000000e+00 68; CHECK-NEXT: [[EXP2:%.*]] = tail call afn float @llvm.exp2.f32(float [[MUL]]) 69; CHECK-NEXT: [[RES:%.*]] = fpext float [[EXP2]] to double 70; CHECK-NEXT: ret double [[RES]] 71; 72 %subfp = sitofp i16 %x to float 73 %pow = tail call afn float @llvm.pow.f32(float 16.000000e+00, float %subfp) 74 %res = fpext float %pow to double 75 ret double %res 76} 77 78define double @pow_uitofp_const_base_2_fast(i15 %x) { 79; CHECK-LABEL: @pow_uitofp_const_base_2_fast( 80; CHECK-NEXT: [[TMP1:%.*]] = zext i15 [[X:%.*]] to i16 81; CHECK-NEXT: [[LDEXPF:%.*]] = tail call afn float @llvm.ldexp.f32.i16(float 1.000000e+00, i16 [[TMP1]]) 82; CHECK-NEXT: [[RES:%.*]] = fpext float [[LDEXPF]] to double 83; CHECK-NEXT: ret double [[RES]] 84; 85 %subfp = uitofp i15 %x to float 86 %pow = tail call afn float @llvm.pow.f32(float 2.000000e+00, float %subfp) 87 %res = fpext float %pow to double 88 ret double %res 89} 90 91define double @pow_uitofp_const_base_power_of_2_fast(i15 %x) { 92; CHECK-LABEL: @pow_uitofp_const_base_power_of_2_fast( 93; CHECK-NEXT: [[SUBFP:%.*]] = uitofp i15 [[X:%.*]] to float 94; CHECK-NEXT: [[MUL:%.*]] = fmul afn float [[SUBFP]], 4.000000e+00 95; CHECK-NEXT: [[EXP2:%.*]] = tail call afn float @llvm.exp2.f32(float [[MUL]]) 96; CHECK-NEXT: [[RES:%.*]] = fpext float [[EXP2]] to double 97; CHECK-NEXT: ret double [[RES]] 98; 99 %subfp = uitofp i15 %x to float 100 %pow = tail call afn float @llvm.pow.f32(float 16.000000e+00, float %subfp) 101 %res = fpext float %pow to double 102 ret double %res 103} 104 105define double @pow_sitofp_float_base_fast(float %base, i16 %x) { 106; CHECK-LABEL: @pow_sitofp_float_base_fast( 107; CHECK-NEXT: [[TMP1:%.*]] = tail call afn float @llvm.powi.f32.i16(float [[BASE:%.*]], i16 [[X:%.*]]) 108; CHECK-NEXT: [[RES:%.*]] = fpext float [[TMP1]] to double 109; CHECK-NEXT: ret double [[RES]] 110; 111 %subfp = sitofp i16 %x to float 112 %pow = tail call afn float @llvm.pow.f32(float %base, float %subfp) 113 %res = fpext float %pow to double 114 ret double %res 115} 116 117define double @pow_uitofp_float_base_fast(float %base, i15 %x) { 118; CHECK-LABEL: @pow_uitofp_float_base_fast( 119; CHECK-NEXT: [[TMP1:%.*]] = zext i15 [[X:%.*]] to i16 120; CHECK-NEXT: [[TMP2:%.*]] = tail call afn float @llvm.powi.f32.i16(float [[BASE:%.*]], i16 [[TMP1]]) 121; CHECK-NEXT: [[RES:%.*]] = fpext float [[TMP2]] to double 122; CHECK-NEXT: ret double [[RES]] 123; 124 %subfp = uitofp i15 %x to float 125 %pow = tail call afn float @llvm.pow.f32(float %base, float %subfp) 126 %res = fpext float %pow to double 127 ret double %res 128} 129 130define double @pow_sitofp_double_base_fast(double %base, i16 %x) { 131; CHECK-LABEL: @pow_sitofp_double_base_fast( 132; CHECK-NEXT: [[TMP1:%.*]] = tail call afn double @llvm.powi.f64.i16(double [[BASE:%.*]], i16 [[X:%.*]]) 133; CHECK-NEXT: ret double [[TMP1]] 134; 135 %subfp = sitofp i16 %x to double 136 %res = tail call afn double @llvm.pow.f64(double %base, double %subfp) 137 ret double %res 138} 139 140define double @pow_uitofp_double_base_fast(double %base, i15 %x) { 141; CHECK-LABEL: @pow_uitofp_double_base_fast( 142; CHECK-NEXT: [[TMP1:%.*]] = zext i15 [[X:%.*]] to i16 143; CHECK-NEXT: [[TMP2:%.*]] = tail call afn double @llvm.powi.f64.i16(double [[BASE:%.*]], i16 [[TMP1]]) 144; CHECK-NEXT: ret double [[TMP2]] 145; 146 %subfp = uitofp i15 %x to double 147 %res = tail call afn double @llvm.pow.f64(double %base, double %subfp) 148 ret double %res 149} 150 151define double @pow_sitofp_const_base_fast_i8(i8 %x) { 152; CHECK-LABEL: @pow_sitofp_const_base_fast_i8( 153; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[X:%.*]] to i16 154; CHECK-NEXT: [[TMP2:%.*]] = tail call afn float @llvm.powi.f32.i16(float 7.000000e+00, i16 [[TMP1]]) 155; CHECK-NEXT: [[RES:%.*]] = fpext float [[TMP2]] to double 156; CHECK-NEXT: ret double [[RES]] 157; 158 %subfp = sitofp i8 %x to float 159 %pow = tail call afn float @llvm.pow.f32(float 7.000000e+00, float %subfp) 160 %res = fpext float %pow to double 161 ret double %res 162} 163 164define double @pow_sitofp_const_base_fast_i16(i16 %x) { 165; CHECK-LABEL: @pow_sitofp_const_base_fast_i16( 166; CHECK-NEXT: [[TMP1:%.*]] = tail call afn float @llvm.powi.f32.i16(float 7.000000e+00, i16 [[X:%.*]]) 167; CHECK-NEXT: [[RES:%.*]] = fpext float [[TMP1]] to double 168; CHECK-NEXT: ret double [[RES]] 169; 170 %subfp = sitofp i16 %x to float 171 %pow = tail call afn float @llvm.pow.f32(float 7.000000e+00, float %subfp) 172 %res = fpext float %pow to double 173 ret double %res 174} 175 176 177define double @pow_uitofp_const_base_fast_i8(i8 %x) { 178; CHECK-LABEL: @pow_uitofp_const_base_fast_i8( 179; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[X:%.*]] to i16 180; CHECK-NEXT: [[TMP2:%.*]] = tail call afn float @llvm.powi.f32.i16(float 7.000000e+00, i16 [[TMP1]]) 181; CHECK-NEXT: [[RES:%.*]] = fpext float [[TMP2]] to double 182; CHECK-NEXT: ret double [[RES]] 183; 184 %subfp = uitofp i8 %x to float 185 %pow = tail call afn float @llvm.pow.f32(float 7.000000e+00, float %subfp) 186 %res = fpext float %pow to double 187 ret double %res 188} 189 190define double @pow_uitofp_const_base_afn_i16(i16 %x) { 191; CHECK-LABEL: @pow_uitofp_const_base_afn_i16( 192; CHECK-NEXT: [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float 193; CHECK-NEXT: [[POW:%.*]] = tail call afn float @llvm.pow.f32(float 7.000000e+00, float [[SUBFP]]) 194; CHECK-NEXT: [[RES:%.*]] = fpext float [[POW]] to double 195; CHECK-NEXT: ret double [[RES]] 196; 197 %subfp = uitofp i16 %x to float 198 %pow = tail call afn float @llvm.pow.f32(float 7.000000e+00, float %subfp) 199 %res = fpext float %pow to double 200 ret double %res 201} 202 203define double @powf_exp_const_int_fast(double %base) { 204; CHECK-LABEL: @powf_exp_const_int_fast( 205; CHECK-NEXT: [[TMP1:%.*]] = tail call fast double @llvm.powi.f64.i16(double [[BASE:%.*]], i16 40) 206; CHECK-NEXT: ret double [[TMP1]] 207; 208 %res = tail call fast double @llvm.pow.f64(double %base, double 4.000000e+01) 209 ret double %res 210} 211 212define double @powf_exp_const2_int_fast(double %base) { 213; CHECK-LABEL: @powf_exp_const2_int_fast( 214; CHECK-NEXT: [[TMP1:%.*]] = tail call fast double @llvm.powi.f64.i16(double [[BASE:%.*]], i16 -40) 215; CHECK-NEXT: ret double [[TMP1]] 216; 217 %res = tail call fast double @llvm.pow.f64(double %base, double -4.000000e+01) 218 ret double %res 219} 220 221; Negative tests 222 223define double @pow_uitofp_const_base_fast_i16(i16 %x) { 224; CHECK-LABEL: @pow_uitofp_const_base_fast_i16( 225; CHECK-NEXT: [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float 226; CHECK-NEXT: [[MUL:%.*]] = fmul fast float [[SUBFP]], 0x4006757{{.*}} 227; CHECK-NEXT: [[EXP2:%.*]] = tail call fast float @llvm.exp2.f32(float [[MUL]]) 228; CHECK-NEXT: [[RES:%.*]] = fpext float [[EXP2]] to double 229; CHECK-NEXT: ret double [[RES]] 230; 231 %subfp = uitofp i16 %x to float 232 %pow = tail call fast float @llvm.pow.f32(float 7.000000e+00, float %subfp) 233 %res = fpext float %pow to double 234 ret double %res 235} 236 237define double @pow_uitofp_const_base_2_fast_i16(i16 %x) { 238; CHECK-LABEL: @pow_uitofp_const_base_2_fast_i16( 239; CHECK-NEXT: [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float 240; CHECK-NEXT: [[EXP2:%.*]] = tail call fast float @llvm.exp2.f32(float [[SUBFP]]) 241; CHECK-NEXT: [[RES:%.*]] = fpext float [[EXP2]] to double 242; CHECK-NEXT: ret double [[RES]] 243; 244 %subfp = uitofp i16 %x to float 245 %pow = tail call fast float @llvm.pow.f32(float 2.000000e+00, float %subfp) 246 %res = fpext float %pow to double 247 ret double %res 248} 249 250define double @pow_uitofp_const_base_power_of_2_fast_i16(i16 %x) { 251; CHECK-LABEL: @pow_uitofp_const_base_power_of_2_fast_i16( 252; CHECK-NEXT: [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float 253; CHECK-NEXT: [[MUL:%.*]] = fmul fast float [[SUBFP]], 4.000000e+00 254; CHECK-NEXT: [[EXP2:%.*]] = tail call fast float @llvm.exp2.f32(float [[MUL]]) 255; CHECK-NEXT: [[RES:%.*]] = fpext float [[EXP2]] to double 256; CHECK-NEXT: ret double [[RES]] 257; 258 %subfp = uitofp i16 %x to float 259 %pow = tail call fast float @llvm.pow.f32(float 16.000000e+00, float %subfp) 260 %res = fpext float %pow to double 261 ret double %res 262} 263 264define double @pow_uitofp_float_base_fast_i16(float %base, i16 %x) { 265; CHECK-LABEL: @pow_uitofp_float_base_fast_i16( 266; CHECK-NEXT: [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float 267; CHECK-NEXT: [[POW:%.*]] = tail call fast float @llvm.pow.f32(float [[BASE:%.*]], float [[SUBFP]]) 268; CHECK-NEXT: [[RES:%.*]] = fpext float [[POW]] to double 269; CHECK-NEXT: ret double [[RES]] 270; 271 %subfp = uitofp i16 %x to float 272 %pow = tail call fast float @llvm.pow.f32(float %base, float %subfp) 273 %res = fpext float %pow to double 274 ret double %res 275} 276 277define double @pow_uitofp_double_base_fast_i16(double %base, i16 %x) { 278; CHECK-LABEL: @pow_uitofp_double_base_fast_i16( 279; CHECK-NEXT: [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to double 280; CHECK-NEXT: [[RES:%.*]] = tail call fast double @llvm.pow.f64(double [[BASE:%.*]], double [[SUBFP]]) 281; CHECK-NEXT: ret double [[RES]] 282; 283 %subfp = uitofp i16 %x to double 284 %res = tail call fast double @llvm.pow.f64(double %base, double %subfp) 285 ret double %res 286} 287 288define double @pow_sitofp_const_base_no_fast(i16 %x) { 289; CHECK-LABEL: @pow_sitofp_const_base_no_fast( 290; CHECK-NEXT: [[SUBFP:%.*]] = sitofp i16 [[X:%.*]] to float 291; CHECK-NEXT: [[POW:%.*]] = tail call float @llvm.pow.f32(float 7.000000e+00, float [[SUBFP]]) 292; CHECK-NEXT: [[RES:%.*]] = fpext float [[POW]] to double 293; CHECK-NEXT: ret double [[RES]] 294; 295 %subfp = sitofp i16 %x to float 296 %pow = tail call float @llvm.pow.f32(float 7.000000e+00, float %subfp) 297 %res = fpext float %pow to double 298 ret double %res 299} 300 301define double @pow_uitofp_const_base_no_fast(i16 %x) { 302; CHECK-LABEL: @pow_uitofp_const_base_no_fast( 303; CHECK-NEXT: [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float 304; CHECK-NEXT: [[POW:%.*]] = tail call float @llvm.pow.f32(float 7.000000e+00, float [[SUBFP]]) 305; CHECK-NEXT: [[RES:%.*]] = fpext float [[POW]] to double 306; CHECK-NEXT: ret double [[RES]] 307; 308 %subfp = uitofp i16 %x to float 309 %pow = tail call float @llvm.pow.f32(float 7.000000e+00, float %subfp) 310 %res = fpext float %pow to double 311 ret double %res 312} 313 314define double @pow_sitofp_const_base_2_no_fast(i16 %x) { 315; CHECK-LABEL: @pow_sitofp_const_base_2_no_fast( 316; CHECK-NEXT: [[LDEXPF:%.*]] = tail call float @llvm.ldexp.f32.i16(float 1.000000e+00, i16 [[X:%.*]]) 317; CHECK-NEXT: [[RES:%.*]] = fpext float [[LDEXPF]] to double 318; CHECK-NEXT: ret double [[RES]] 319; 320 %subfp = sitofp i16 %x to float 321 %pow = tail call float @llvm.pow.f32(float 2.000000e+00, float %subfp) 322 %res = fpext float %pow to double 323 ret double %res 324} 325 326define double @pow_sitofp_const_base_power_of_2_no_fast(i16 %x) { 327; CHECK-LABEL: @pow_sitofp_const_base_power_of_2_no_fast( 328; CHECK-NEXT: [[SUBFP:%.*]] = sitofp i16 [[X:%.*]] to float 329; CHECK-NEXT: [[MUL:%.*]] = fmul float [[SUBFP]], 4.000000e+00 330; CHECK-NEXT: [[EXP2:%.*]] = tail call float @llvm.exp2.f32(float [[MUL]]) 331; CHECK-NEXT: [[RES:%.*]] = fpext float [[EXP2]] to double 332; CHECK-NEXT: ret double [[RES]] 333; 334 %subfp = sitofp i16 %x to float 335 %pow = tail call float @llvm.pow.f32(float 16.000000e+00, float %subfp) 336 %res = fpext float %pow to double 337 ret double %res 338} 339 340define double @pow_uitofp_const_base_2_no_fast(i16 %x) { 341; CHECK-LABEL: @pow_uitofp_const_base_2_no_fast( 342; CHECK-NEXT: [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float 343; CHECK-NEXT: [[EXP2:%.*]] = tail call float @llvm.exp2.f32(float [[SUBFP]]) 344; CHECK-NEXT: [[RES:%.*]] = fpext float [[EXP2]] to double 345; CHECK-NEXT: ret double [[RES]] 346; 347 %subfp = uitofp i16 %x to float 348 %pow = tail call float @llvm.pow.f32(float 2.000000e+00, float %subfp) 349 %res = fpext float %pow to double 350 ret double %res 351} 352 353define double @pow_uitofp_const_base_power_of_2_no_fast(i16 %x) { 354; CHECK-LABEL: @pow_uitofp_const_base_power_of_2_no_fast( 355; CHECK-NEXT: [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float 356; CHECK-NEXT: [[MUL:%.*]] = fmul float [[SUBFP]], 4.000000e+00 357; CHECK-NEXT: [[EXP2:%.*]] = tail call float @llvm.exp2.f32(float [[MUL]]) 358; CHECK-NEXT: [[RES:%.*]] = fpext float [[EXP2]] to double 359; CHECK-NEXT: ret double [[RES]] 360; 361 %subfp = uitofp i16 %x to float 362 %pow = tail call float @llvm.pow.f32(float 16.000000e+00, float %subfp) 363 %res = fpext float %pow to double 364 ret double %res 365} 366 367define double @pow_sitofp_float_base_no_fast(float %base, i16 %x) { 368; CHECK-LABEL: @pow_sitofp_float_base_no_fast( 369; CHECK-NEXT: [[SUBFP:%.*]] = sitofp i16 [[X:%.*]] to float 370; CHECK-NEXT: [[POW:%.*]] = tail call float @llvm.pow.f32(float [[BASE:%.*]], float [[SUBFP]]) 371; CHECK-NEXT: [[RES:%.*]] = fpext float [[POW]] to double 372; CHECK-NEXT: ret double [[RES]] 373; 374 %subfp = sitofp i16 %x to float 375 %pow = tail call float @llvm.pow.f32(float %base, float %subfp) 376 %res = fpext float %pow to double 377 ret double %res 378} 379 380define double @pow_uitofp_float_base_no_fast(float %base, i16 %x) { 381; CHECK-LABEL: @pow_uitofp_float_base_no_fast( 382; CHECK-NEXT: [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float 383; CHECK-NEXT: [[POW:%.*]] = tail call float @llvm.pow.f32(float [[BASE:%.*]], float [[SUBFP]]) 384; CHECK-NEXT: [[RES:%.*]] = fpext float [[POW]] to double 385; CHECK-NEXT: ret double [[RES]] 386; 387 %subfp = uitofp i16 %x to float 388 %pow = tail call float @llvm.pow.f32(float %base, float %subfp) 389 %res = fpext float %pow to double 390 ret double %res 391} 392 393define double @pow_sitofp_double_base_no_fast(double %base, i16 %x) { 394; CHECK-LABEL: @pow_sitofp_double_base_no_fast( 395; CHECK-NEXT: [[SUBFP:%.*]] = sitofp i16 [[X:%.*]] to double 396; CHECK-NEXT: [[POW:%.*]] = tail call double @llvm.pow.f64(double [[BASE:%.*]], double [[SUBFP]]) 397; CHECK-NEXT: ret double [[POW]] 398; 399 %subfp = sitofp i16 %x to double 400 %pow = tail call double @llvm.pow.f64(double %base, double %subfp) 401 ret double %pow 402} 403 404define double @pow_uitofp_double_base_no_fast(double %base, i16 %x) { 405; CHECK-LABEL: @pow_uitofp_double_base_no_fast( 406; CHECK-NEXT: [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to double 407; CHECK-NEXT: [[POW:%.*]] = tail call double @llvm.pow.f64(double [[BASE:%.*]], double [[SUBFP]]) 408; CHECK-NEXT: ret double [[POW]] 409; 410 %subfp = uitofp i16 %x to double 411 %pow = tail call double @llvm.pow.f64(double %base, double %subfp) 412 ret double %pow 413} 414 415; negative test - pow with no FMF is not the same as the loosely-specified powi 416 417define double @powf_exp_const_int_no_fast(double %base) { 418; CHECK-LABEL: @powf_exp_const_int_no_fast( 419; CHECK-NEXT: [[RES:%.*]] = tail call double @llvm.pow.f64(double [[BASE:%.*]], double 4.000000e+01) 420; CHECK-NEXT: ret double [[RES]] 421; 422 %res = tail call double @llvm.pow.f64(double %base, double 4.000000e+01) 423 ret double %res 424} 425 426define double @powf_exp_const_not_int_fast(double %base) { 427; CHECK-LABEL: @powf_exp_const_not_int_fast( 428; CHECK-NEXT: [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[BASE:%.*]]) 429; CHECK-NEXT: [[POWI:%.*]] = tail call fast double @llvm.powi.f64.i16(double [[BASE]], i16 37) 430; CHECK-NEXT: [[RES:%.*]] = fmul fast double [[POWI]], [[SQRT]] 431; CHECK-NEXT: ret double [[RES]] 432; 433 %res = tail call fast double @llvm.pow.f64(double %base, double 3.750000e+01) 434 ret double %res 435} 436 437define double @powf_exp_const_not_int_no_fast(double %base) { 438; CHECK-LABEL: @powf_exp_const_not_int_no_fast( 439; CHECK-NEXT: [[RES:%.*]] = tail call double @llvm.pow.f64(double [[BASE:%.*]], double 3.750000e+01) 440; CHECK-NEXT: ret double [[RES]] 441; 442 %res = tail call double @llvm.pow.f64(double %base, double 3.750000e+01) 443 ret double %res 444} 445 446; negative test - pow with no FMF is not the same as the loosely-specified powi 447 448define double @powf_exp_const2_int_no_fast(double %base) { 449; CHECK-LABEL: @powf_exp_const2_int_no_fast( 450; CHECK-NEXT: [[RES:%.*]] = tail call double @llvm.pow.f64(double [[BASE:%.*]], double -4.000000e+01) 451; CHECK-NEXT: ret double [[RES]] 452; 453 %res = tail call double @llvm.pow.f64(double %base, double -4.000000e+01) 454 ret double %res 455} 456 457declare float @llvm.pow.f32(float, float) 458declare double @llvm.pow.f64(double, double) 459