1; RUN: opt -O3 -S < %s | FileCheck %s 2 3; Test to verify that constants aren't folded when the rounding mode is unknown. 4; CHECK-LABEL: @f1 5; CHECK: call double @llvm.experimental.constrained.fdiv.f64 6define double @f1() #0 { 7entry: 8 %div = call double @llvm.experimental.constrained.fdiv.f64( 9 double 1.000000e+00, 10 double 1.000000e+01, 11 metadata !"round.dynamic", 12 metadata !"fpexcept.strict") #0 13 ret double %div 14} 15 16; Verify that 'a - 0' isn't simplified to 'a' when the rounding mode is unknown. 17; 18; double f2(double a) { 19; // Because the result of '0 - 0' is negative zero if rounding mode is 20; // downward, this shouldn't be simplified. 21; return a - 0.0; 22; } 23; 24; CHECK-LABEL: @f2 25; CHECK: call double @llvm.experimental.constrained.fsub.f64 26define double @f2(double %a) #0 { 27entry: 28 %div = call double @llvm.experimental.constrained.fsub.f64( 29 double %a, double 0.000000e+00, 30 metadata !"round.dynamic", 31 metadata !"fpexcept.strict") #0 32 ret double %div 33} 34 35; Verify that '-((-a)*b)' isn't simplified to 'a*b' when the rounding mode is 36; unknown. 37; 38; double f3(double a, double b) { 39; // Because the intermediate value involved in this calculation may require 40; // rounding, this shouldn't be simplified. 41; return -((-a)*b); 42; } 43; 44; CHECK-LABEL: @f3 45; CHECK: call double @llvm.experimental.constrained.fsub.f64 46; CHECK: call double @llvm.experimental.constrained.fmul.f64 47; CHECK: call double @llvm.experimental.constrained.fsub.f64 48define double @f3(double %a, double %b) #0 { 49entry: 50 %sub = call double @llvm.experimental.constrained.fsub.f64( 51 double -0.000000e+00, double %a, 52 metadata !"round.dynamic", 53 metadata !"fpexcept.strict") #0 54 %mul = call double @llvm.experimental.constrained.fmul.f64( 55 double %sub, double %b, 56 metadata !"round.dynamic", 57 metadata !"fpexcept.strict") #0 58 %ret = call double @llvm.experimental.constrained.fsub.f64( 59 double -0.000000e+00, 60 double %mul, 61 metadata !"round.dynamic", 62 metadata !"fpexcept.strict") #0 63 ret double %ret 64} 65 66; Verify that FP operations are not performed speculatively when FP exceptions 67; are not being ignored. 68; 69; double f4(int n, double a) { 70; // Because a + 1 may overflow, this should not be simplified. 71; if (n > 0) 72; return a + 1.0; 73; return a; 74; } 75; 76; 77; CHECK-LABEL: @f4 78; CHECK-NOT: select 79; CHECK: br i1 %cmp 80define double @f4(i32 %n, double %a) #0 { 81entry: 82 %cmp = icmp sgt i32 %n, 0 83 br i1 %cmp, label %if.then, label %if.end 84 85if.then: 86 %add = call double @llvm.experimental.constrained.fadd.f64( 87 double 1.000000e+00, double %a, 88 metadata !"round.dynamic", 89 metadata !"fpexcept.strict") #0 90 br label %if.end 91 92if.end: 93 %a.0 = phi double [%add, %if.then], [ %a, %entry ] 94 ret double %a.0 95} 96 97; Verify that sqrt(42.0) isn't simplified when the rounding mode is unknown. 98; CHECK-LABEL: f5 99; CHECK: call double @llvm.experimental.constrained.sqrt 100define double @f5() #0 { 101entry: 102 %result = call double @llvm.experimental.constrained.sqrt.f64(double 42.0, 103 metadata !"round.dynamic", 104 metadata !"fpexcept.strict") #0 105 ret double %result 106} 107 108; Verify that pow(42.1, 3.0) isn't simplified when the rounding mode is unknown. 109; CHECK-LABEL: f6 110; CHECK: call double @llvm.experimental.constrained.pow 111define double @f6() #0 { 112entry: 113 %result = call double @llvm.experimental.constrained.pow.f64(double 42.1, 114 double 3.0, 115 metadata !"round.dynamic", 116 metadata !"fpexcept.strict") #0 117 ret double %result 118} 119 120; Verify that powi(42.1, 3) isn't simplified when the rounding mode is unknown. 121; CHECK-LABEL: f7 122; CHECK: call double @llvm.experimental.constrained.powi 123define double @f7() #0 { 124entry: 125 %result = call double @llvm.experimental.constrained.powi.f64(double 42.1, 126 i32 3, 127 metadata !"round.dynamic", 128 metadata !"fpexcept.strict") #0 129 ret double %result 130} 131 132; Verify that sin(42.0) isn't simplified when the rounding mode is unknown. 133; CHECK-LABEL: f8 134; CHECK: call double @llvm.experimental.constrained.sin 135define double @f8() #0 { 136entry: 137 %result = call double @llvm.experimental.constrained.sin.f64(double 42.0, 138 metadata !"round.dynamic", 139 metadata !"fpexcept.strict") #0 140 ret double %result 141} 142 143; Verify that cos(42.0) isn't simplified when the rounding mode is unknown. 144; CHECK-LABEL: f9 145; CHECK: call double @llvm.experimental.constrained.cos 146define double @f9() #0 { 147entry: 148 %result = call double @llvm.experimental.constrained.cos.f64(double 42.0, 149 metadata !"round.dynamic", 150 metadata !"fpexcept.strict") #0 151 ret double %result 152} 153 154; Verify that tan(42.0) isn't simplified when the rounding mode is unknown. 155; CHECK-LABEL: ftan 156; CHECK: call double @llvm.experimental.constrained.tan 157define double @ftan() #0 { 158entry: 159 %result = call double @llvm.experimental.constrained.tan.f64(double 42.0, 160 metadata !"round.dynamic", 161 metadata !"fpexcept.strict") #0 162 ret double %result 163} 164 165; Verify that acos(42.0) isn't simplified when the rounding mode is unknown. 166; CHECK-LABEL: facos 167; CHECK: call double @llvm.experimental.constrained.acos 168define double @facos() #0 { 169entry: 170 %result = call double @llvm.experimental.constrained.acos.f64(double 42.0, 171 metadata !"round.dynamic", 172 metadata !"fpexcept.strict") #0 173 ret double %result 174} 175 176; Verify that asin(42.0) isn't simplified when the rounding mode is unknown. 177; CHECK-LABEL: fasin 178; CHECK: call double @llvm.experimental.constrained.asin 179define double @fasin() #0 { 180entry: 181 %result = call double @llvm.experimental.constrained.asin.f64(double 42.0, 182 metadata !"round.dynamic", 183 metadata !"fpexcept.strict") #0 184 ret double %result 185} 186 187; Verify that atan(42.0, 23.0) isn't simplified when the rounding mode is unknown. 188; CHECK-LABEL: fatan 189; CHECK: call double @llvm.experimental.constrained.atan 190define double @fatan() #0 { 191entry: 192 %result = call double @llvm.experimental.constrained.atan.f64(double 42.0, 193 metadata !"round.dynamic", 194 metadata !"fpexcept.strict") #0 195 ret double %result 196} 197 198; Verify that atan2(42.0) isn't simplified when the rounding mode is unknown. 199; CHECK-LABEL: fatan2 200; CHECK: call double @llvm.experimental.constrained.atan2 201define double @fatan2() #0 { 202entry: 203 %result = call double @llvm.experimental.constrained.atan2.f64( 204 double 42.0, 205 double 23.0, 206 metadata !"round.dynamic", 207 metadata !"fpexcept.strict") #0 208 ret double %result 209} 210 211; Verify that cosh(42.0) isn't simplified when the rounding mode is unknown. 212; CHECK-LABEL: fcosh 213; CHECK: call double @llvm.experimental.constrained.cosh 214define double @fcosh() #0 { 215entry: 216 %result = call double @llvm.experimental.constrained.cosh.f64(double 42.0, 217 metadata !"round.dynamic", 218 metadata !"fpexcept.strict") #0 219 ret double %result 220} 221 222; Verify that sinh(42.0) isn't simplified when the rounding mode is unknown. 223; CHECK-LABEL: fsinh 224; CHECK: call double @llvm.experimental.constrained.sinh 225define double @fsinh() #0 { 226entry: 227 %result = call double @llvm.experimental.constrained.sinh.f64(double 42.0, 228 metadata !"round.dynamic", 229 metadata !"fpexcept.strict") #0 230 ret double %result 231} 232 233; Verify that tanh(42.0) isn't simplified when the rounding mode is unknown. 234; CHECK-LABEL: ftanh 235; CHECK: call double @llvm.experimental.constrained.tanh 236define double @ftanh() #0 { 237entry: 238 %result = call double @llvm.experimental.constrained.tanh.f64(double 42.0, 239 metadata !"round.dynamic", 240 metadata !"fpexcept.strict") #0 241 ret double %result 242} 243 244; Verify that exp(42.0) isn't simplified when the rounding mode is unknown. 245; CHECK-LABEL: f10 246; CHECK: call double @llvm.experimental.constrained.exp 247define double @f10() #0 { 248entry: 249 %result = call double @llvm.experimental.constrained.exp.f64(double 42.0, 250 metadata !"round.dynamic", 251 metadata !"fpexcept.strict") #0 252 ret double %result 253} 254 255; Verify that exp2(42.1) isn't simplified when the rounding mode is unknown. 256; CHECK-LABEL: f11 257; CHECK: call double @llvm.experimental.constrained.exp2 258define double @f11() #0 { 259entry: 260 %result = call double @llvm.experimental.constrained.exp2.f64(double 42.1, 261 metadata !"round.dynamic", 262 metadata !"fpexcept.strict") #0 263 ret double %result 264} 265 266; Verify that log(42.0) isn't simplified when the rounding mode is unknown. 267; CHECK-LABEL: f12 268; CHECK: call double @llvm.experimental.constrained.log 269define double @f12() #0 { 270entry: 271 %result = call double @llvm.experimental.constrained.log.f64(double 42.0, 272 metadata !"round.dynamic", 273 metadata !"fpexcept.strict") #0 274 ret double %result 275} 276 277; Verify that log10(42.0) isn't simplified when the rounding mode is unknown. 278; CHECK-LABEL: f13 279; CHECK: call double @llvm.experimental.constrained.log10 280define double @f13() #0 { 281entry: 282 %result = call double @llvm.experimental.constrained.log10.f64(double 42.0, 283 metadata !"round.dynamic", 284 metadata !"fpexcept.strict") #0 285 ret double %result 286} 287 288; Verify that log2(42.0) isn't simplified when the rounding mode is unknown. 289; CHECK-LABEL: f14 290; CHECK: call double @llvm.experimental.constrained.log2 291define double @f14() #0 { 292entry: 293 %result = call double @llvm.experimental.constrained.log2.f64(double 42.0, 294 metadata !"round.dynamic", 295 metadata !"fpexcept.strict") #0 296 ret double %result 297} 298 299; Verify that rint(42.1) isn't simplified when the rounding mode is unknown. 300; CHECK-LABEL: f15 301; CHECK: call double @llvm.experimental.constrained.rint 302define double @f15() #0 { 303entry: 304 %result = call double @llvm.experimental.constrained.rint.f64(double 42.1, 305 metadata !"round.dynamic", 306 metadata !"fpexcept.strict") #0 307 ret double %result 308} 309 310; Verify that nearbyint(42.1) isn't simplified when the rounding mode is 311; unknown. 312; CHECK-LABEL: f16 313; CHECK: call double @llvm.experimental.constrained.nearbyint 314define double @f16() #0 { 315entry: 316 %result = call double @llvm.experimental.constrained.nearbyint.f64( 317 double 42.1, 318 metadata !"round.dynamic", 319 metadata !"fpexcept.strict") #0 320 ret double %result 321} 322 323; Verify that fma(42.1) isn't simplified when the rounding mode is 324; unknown. 325; CHECK-LABEL: f17 326; CHECK: call double @llvm.experimental.constrained.fma 327define double @f17() #0 { 328entry: 329 %result = call double @llvm.experimental.constrained.fma.f64(double 42.1, double 42.1, double 42.1, 330 metadata !"round.dynamic", 331 metadata !"fpexcept.strict") #0 332 ret double %result 333} 334 335; Verify that fptoui(42.1) isn't simplified when the rounding mode is 336; unknown. 337; CHECK-LABEL: f18 338; CHECK: call zeroext i32 @llvm.experimental.constrained.fptoui 339define zeroext i32 @f18() #0 { 340entry: 341 %result = call zeroext i32 @llvm.experimental.constrained.fptoui.i32.f64( 342 double 42.1, 343 metadata !"fpexcept.strict") #0 344 ret i32 %result 345} 346 347; Verify that fptosi(42.1) isn't simplified when the rounding mode is 348; unknown. 349; CHECK-LABEL: f19 350; CHECK: call i32 @llvm.experimental.constrained.fptosi 351define i32 @f19() #0 { 352entry: 353 %result = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double 42.1, 354 metadata !"fpexcept.strict") #0 355 ret i32 %result 356} 357 358; Verify that fptrunc(42.1) isn't simplified when the rounding mode is 359; unknown. 360; CHECK-LABEL: f20 361; CHECK: call float @llvm.experimental.constrained.fptrunc 362define float @f20() #0 { 363entry: 364 %result = call float @llvm.experimental.constrained.fptrunc.f32.f64( 365 double 42.1, 366 metadata !"round.dynamic", 367 metadata !"fpexcept.strict") #0 368 ret float %result 369} 370 371; Verify that fpext(42.1) isn't simplified when the rounding mode is 372; unknown. 373; CHECK-LABEL: f21 374; CHECK: call double @llvm.experimental.constrained.fpext 375define double @f21() #0 { 376entry: 377 %result = call double @llvm.experimental.constrained.fpext.f64.f32(float 42.0, 378 metadata !"fpexcept.strict") #0 379 ret double %result 380} 381 382; Verify that lrint(42.1) isn't simplified when the rounding mode is unknown. 383; CHECK-LABEL: f22 384; CHECK: call i32 @llvm.experimental.constrained.lrint 385define i32 @f22() #0 { 386entry: 387 %result = call i32 @llvm.experimental.constrained.lrint.i32.f64(double 42.1, 388 metadata !"round.dynamic", 389 metadata !"fpexcept.strict") #0 390 ret i32 %result 391} 392 393; Verify that lrintf(42.0) isn't simplified when the rounding mode is unknown. 394; CHECK-LABEL: f23 395; CHECK: call i32 @llvm.experimental.constrained.lrint 396define i32 @f23() #0 { 397entry: 398 %result = call i32 @llvm.experimental.constrained.lrint.i32.f32(float 42.0, 399 metadata !"round.dynamic", 400 metadata !"fpexcept.strict") #0 401 ret i32 %result 402} 403 404; Verify that llrint(42.1) isn't simplified when the rounding mode is unknown. 405; CHECK-LABEL: f24 406; CHECK: call i64 @llvm.experimental.constrained.llrint 407define i64 @f24() #0 { 408entry: 409 %result = call i64 @llvm.experimental.constrained.llrint.i64.f64(double 42.1, 410 metadata !"round.dynamic", 411 metadata !"fpexcept.strict") #0 412 ret i64 %result 413} 414 415; Verify that llrint(42.0) isn't simplified when the rounding mode is unknown. 416; CHECK-LABEL: f25 417; CHECK: call i64 @llvm.experimental.constrained.llrint 418define i64 @f25() #0 { 419entry: 420 %result = call i64 @llvm.experimental.constrained.llrint.i64.f32(float 42.0, 421 metadata !"round.dynamic", 422 metadata !"fpexcept.strict") #0 423 ret i64 %result 424} 425 426; Verify that lround(42.1) isn't simplified when the rounding mode is unknown. 427; CHECK-LABEL: f26 428; CHECK: call i32 @llvm.experimental.constrained.lround 429define i32 @f26() #0 { 430entry: 431 %result = call i32 @llvm.experimental.constrained.lround.i32.f64(double 42.1, 432 metadata !"fpexcept.strict") #0 433 ret i32 %result 434} 435 436; Verify that lround(42.0) isn't simplified when the rounding mode is unknown. 437; CHECK-LABEL: f27 438; CHECK: call i32 @llvm.experimental.constrained.lround 439define i32 @f27() #0 { 440entry: 441 %result = call i32 @llvm.experimental.constrained.lround.i32.f32(float 42.0, 442 metadata !"fpexcept.strict") #0 443 ret i32 %result 444} 445 446; Verify that llround(42.1) isn't simplified when the rounding mode is unknown. 447; CHECK-LABEL: f28 448; CHECK: call i64 @llvm.experimental.constrained.llround 449define i64 @f28() #0 { 450entry: 451 %result = call i64 @llvm.experimental.constrained.llround.i64.f64(double 42.1, 452 metadata !"fpexcept.strict") #0 453 ret i64 %result 454} 455 456; Verify that llround(42.0) isn't simplified when the rounding mode is unknown. 457; CHECK-LABEL: f29 458; CHECK: call i64 @llvm.experimental.constrained.llround 459define i64 @f29() #0 { 460entry: 461 %result = call i64 @llvm.experimental.constrained.llround.i64.f32(float 42.0, 462 metadata !"fpexcept.strict") #0 463 ret i64 %result 464} 465 466; Verify that sitofp(42) isn't simplified when the rounding mode is unknown. 467; CHECK-LABEL: @f30 468; CHECK: call double @llvm.experimental.constrained.sitofp 469define double @f30() #0 { 470entry: 471 %result = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 42, 472 metadata !"round.dynamic", 473 metadata !"fpexcept.strict") #0 474 ret double %result 475} 476 477; Verify that uitofp(42) isn't simplified when the rounding mode is unknown. 478; CHECK-LABEL: @f31 479; CHECK: call double @llvm.experimental.constrained.uitofp 480define double @f31() #0 { 481entry: 482 %result = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 42, 483 metadata !"round.dynamic", 484 metadata !"fpexcept.strict") #0 485 ret double %result 486} 487 488attributes #0 = { strictfp } 489 490@llvm.fp.env = thread_local global i8 zeroinitializer, section "llvm.metadata" 491declare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata) 492declare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata) 493declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata) 494declare double @llvm.experimental.constrained.fsub.f64(double, double, metadata, metadata) 495declare double @llvm.experimental.constrained.sqrt.f64(double, metadata, metadata) 496declare double @llvm.experimental.constrained.pow.f64(double, double, metadata, metadata) 497declare double @llvm.experimental.constrained.powi.f64(double, i32, metadata, metadata) 498declare double @llvm.experimental.constrained.sin.f64(double, metadata, metadata) 499declare double @llvm.experimental.constrained.cos.f64(double, metadata, metadata) 500declare double @llvm.experimental.constrained.tan.f64(double, metadata, metadata) 501declare double @llvm.experimental.constrained.exp.f64(double, metadata, metadata) 502declare double @llvm.experimental.constrained.exp2.f64(double, metadata, metadata) 503declare double @llvm.experimental.constrained.log.f64(double, metadata, metadata) 504declare double @llvm.experimental.constrained.log10.f64(double, metadata, metadata) 505declare double @llvm.experimental.constrained.log2.f64(double, metadata, metadata) 506declare double @llvm.experimental.constrained.rint.f64(double, metadata, metadata) 507declare double @llvm.experimental.constrained.nearbyint.f64(double, metadata, metadata) 508declare double @llvm.experimental.constrained.fma.f64(double, double, double, metadata, metadata) 509declare i32 @llvm.experimental.constrained.fptosi.i32.f64(double, metadata) 510declare i32 @llvm.experimental.constrained.fptoui.i32.f64(double, metadata) 511declare float @llvm.experimental.constrained.fptrunc.f32.f64(double, metadata, metadata) 512declare double @llvm.experimental.constrained.fpext.f64.f32(float, metadata) 513declare i32 @llvm.experimental.constrained.lrint.i32.f64(double, metadata, metadata) 514declare i32 @llvm.experimental.constrained.lrint.i32.f32(float, metadata, metadata) 515declare i64 @llvm.experimental.constrained.llrint.i64.f64(double, metadata, metadata) 516declare i64 @llvm.experimental.constrained.llrint.i64.f32(float, metadata, metadata) 517declare i32 @llvm.experimental.constrained.lround.i32.f64(double, metadata) 518declare i32 @llvm.experimental.constrained.lround.i32.f32(float, metadata) 519declare i64 @llvm.experimental.constrained.llround.i64.f64(double, metadata) 520declare i64 @llvm.experimental.constrained.llround.i64.f32(float, metadata) 521declare double @llvm.experimental.constrained.sitofp.f64.i32(i32, metadata, metadata) 522declare double @llvm.experimental.constrained.uitofp.f64.i32(i32, metadata, metadata) 523