523 lines · plain
1; RUN: opt -O3 -S < %s | FileCheck %s2 3; Test to verify that constants aren't folded when the rounding mode is unknown.4; CHECK-LABEL: @f15; CHECK: call double @llvm.experimental.constrained.fdiv.f646define 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") #013 ret double %div14}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 is20; // downward, this shouldn't be simplified.21; return a - 0.0;22; }23;24; CHECK-LABEL: @f225; CHECK: call double @llvm.experimental.constrained.fsub.f6426define 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") #032 ret double %div33}34 35; Verify that '-((-a)*b)' isn't simplified to 'a*b' when the rounding mode is36; unknown.37;38; double f3(double a, double b) {39; // Because the intermediate value involved in this calculation may require40; // rounding, this shouldn't be simplified.41; return -((-a)*b);42; }43;44; CHECK-LABEL: @f345; CHECK: call double @llvm.experimental.constrained.fsub.f6446; CHECK: call double @llvm.experimental.constrained.fmul.f6447; CHECK: call double @llvm.experimental.constrained.fsub.f6448define 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") #054 %mul = call double @llvm.experimental.constrained.fmul.f64(55 double %sub, double %b,56 metadata !"round.dynamic",57 metadata !"fpexcept.strict") #058 %ret = call double @llvm.experimental.constrained.fsub.f64(59 double -0.000000e+00,60 double %mul,61 metadata !"round.dynamic",62 metadata !"fpexcept.strict") #063 ret double %ret64}65 66; Verify that FP operations are not performed speculatively when FP exceptions67; 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: @f478; CHECK-NOT: select79; CHECK: br i1 %cmp80define double @f4(i32 %n, double %a) #0 {81entry:82 %cmp = icmp sgt i32 %n, 083 br i1 %cmp, label %if.then, label %if.end84 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") #090 br label %if.end91 92if.end:93 %a.0 = phi double [%add, %if.then], [ %a, %entry ]94 ret double %a.095}96 97; Verify that sqrt(42.0) isn't simplified when the rounding mode is unknown.98; CHECK-LABEL: f599; CHECK: call double @llvm.experimental.constrained.sqrt100define double @f5() #0 {101entry:102 %result = call double @llvm.experimental.constrained.sqrt.f64(double 42.0,103 metadata !"round.dynamic",104 metadata !"fpexcept.strict") #0105 ret double %result106}107 108; Verify that pow(42.1, 3.0) isn't simplified when the rounding mode is unknown.109; CHECK-LABEL: f6110; CHECK: call double @llvm.experimental.constrained.pow111define 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") #0117 ret double %result118}119 120; Verify that powi(42.1, 3) isn't simplified when the rounding mode is unknown.121; CHECK-LABEL: f7122; CHECK: call double @llvm.experimental.constrained.powi123define 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") #0129 ret double %result130}131 132; Verify that sin(42.0) isn't simplified when the rounding mode is unknown.133; CHECK-LABEL: f8134; CHECK: call double @llvm.experimental.constrained.sin135define double @f8() #0 {136entry:137 %result = call double @llvm.experimental.constrained.sin.f64(double 42.0,138 metadata !"round.dynamic",139 metadata !"fpexcept.strict") #0140 ret double %result141}142 143; Verify that cos(42.0) isn't simplified when the rounding mode is unknown.144; CHECK-LABEL: f9145; CHECK: call double @llvm.experimental.constrained.cos146define double @f9() #0 {147entry:148 %result = call double @llvm.experimental.constrained.cos.f64(double 42.0,149 metadata !"round.dynamic",150 metadata !"fpexcept.strict") #0151 ret double %result152}153 154; Verify that tan(42.0) isn't simplified when the rounding mode is unknown.155; CHECK-LABEL: ftan156; CHECK: call double @llvm.experimental.constrained.tan157define double @ftan() #0 {158entry:159 %result = call double @llvm.experimental.constrained.tan.f64(double 42.0,160 metadata !"round.dynamic",161 metadata !"fpexcept.strict") #0162 ret double %result163}164 165; Verify that acos(42.0) isn't simplified when the rounding mode is unknown.166; CHECK-LABEL: facos167; CHECK: call double @llvm.experimental.constrained.acos168define double @facos() #0 {169entry:170 %result = call double @llvm.experimental.constrained.acos.f64(double 42.0,171 metadata !"round.dynamic",172 metadata !"fpexcept.strict") #0173 ret double %result174}175 176; Verify that asin(42.0) isn't simplified when the rounding mode is unknown.177; CHECK-LABEL: fasin178; CHECK: call double @llvm.experimental.constrained.asin179define double @fasin() #0 {180entry:181 %result = call double @llvm.experimental.constrained.asin.f64(double 42.0,182 metadata !"round.dynamic",183 metadata !"fpexcept.strict") #0184 ret double %result185}186 187; Verify that atan(42.0, 23.0) isn't simplified when the rounding mode is unknown.188; CHECK-LABEL: fatan189; CHECK: call double @llvm.experimental.constrained.atan190define double @fatan() #0 {191entry:192 %result = call double @llvm.experimental.constrained.atan.f64(double 42.0,193 metadata !"round.dynamic",194 metadata !"fpexcept.strict") #0195 ret double %result196}197 198; Verify that atan2(42.0) isn't simplified when the rounding mode is unknown.199; CHECK-LABEL: fatan2200; CHECK: call double @llvm.experimental.constrained.atan2201define 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") #0208 ret double %result209}210 211; Verify that cosh(42.0) isn't simplified when the rounding mode is unknown.212; CHECK-LABEL: fcosh213; CHECK: call double @llvm.experimental.constrained.cosh214define double @fcosh() #0 {215entry:216 %result = call double @llvm.experimental.constrained.cosh.f64(double 42.0,217 metadata !"round.dynamic",218 metadata !"fpexcept.strict") #0219 ret double %result220}221 222; Verify that sinh(42.0) isn't simplified when the rounding mode is unknown.223; CHECK-LABEL: fsinh224; CHECK: call double @llvm.experimental.constrained.sinh225define double @fsinh() #0 {226entry:227 %result = call double @llvm.experimental.constrained.sinh.f64(double 42.0,228 metadata !"round.dynamic",229 metadata !"fpexcept.strict") #0230 ret double %result231}232 233; Verify that tanh(42.0) isn't simplified when the rounding mode is unknown.234; CHECK-LABEL: ftanh235; CHECK: call double @llvm.experimental.constrained.tanh236define double @ftanh() #0 {237entry:238 %result = call double @llvm.experimental.constrained.tanh.f64(double 42.0,239 metadata !"round.dynamic",240 metadata !"fpexcept.strict") #0241 ret double %result242}243 244; Verify that exp(42.0) isn't simplified when the rounding mode is unknown.245; CHECK-LABEL: f10246; CHECK: call double @llvm.experimental.constrained.exp247define double @f10() #0 {248entry:249 %result = call double @llvm.experimental.constrained.exp.f64(double 42.0,250 metadata !"round.dynamic",251 metadata !"fpexcept.strict") #0252 ret double %result253}254 255; Verify that exp2(42.1) isn't simplified when the rounding mode is unknown.256; CHECK-LABEL: f11257; CHECK: call double @llvm.experimental.constrained.exp2258define double @f11() #0 {259entry:260 %result = call double @llvm.experimental.constrained.exp2.f64(double 42.1,261 metadata !"round.dynamic",262 metadata !"fpexcept.strict") #0263 ret double %result264}265 266; Verify that log(42.0) isn't simplified when the rounding mode is unknown.267; CHECK-LABEL: f12268; CHECK: call double @llvm.experimental.constrained.log269define double @f12() #0 {270entry:271 %result = call double @llvm.experimental.constrained.log.f64(double 42.0,272 metadata !"round.dynamic",273 metadata !"fpexcept.strict") #0274 ret double %result275}276 277; Verify that log10(42.0) isn't simplified when the rounding mode is unknown.278; CHECK-LABEL: f13279; CHECK: call double @llvm.experimental.constrained.log10280define double @f13() #0 {281entry:282 %result = call double @llvm.experimental.constrained.log10.f64(double 42.0,283 metadata !"round.dynamic",284 metadata !"fpexcept.strict") #0285 ret double %result286}287 288; Verify that log2(42.0) isn't simplified when the rounding mode is unknown.289; CHECK-LABEL: f14290; CHECK: call double @llvm.experimental.constrained.log2291define double @f14() #0 {292entry:293 %result = call double @llvm.experimental.constrained.log2.f64(double 42.0,294 metadata !"round.dynamic",295 metadata !"fpexcept.strict") #0296 ret double %result297}298 299; Verify that rint(42.1) isn't simplified when the rounding mode is unknown.300; CHECK-LABEL: f15301; CHECK: call double @llvm.experimental.constrained.rint302define double @f15() #0 {303entry:304 %result = call double @llvm.experimental.constrained.rint.f64(double 42.1,305 metadata !"round.dynamic",306 metadata !"fpexcept.strict") #0307 ret double %result308}309 310; Verify that nearbyint(42.1) isn't simplified when the rounding mode is311; unknown.312; CHECK-LABEL: f16313; CHECK: call double @llvm.experimental.constrained.nearbyint314define 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") #0320 ret double %result321}322 323; Verify that fma(42.1) isn't simplified when the rounding mode is324; unknown.325; CHECK-LABEL: f17326; CHECK: call double @llvm.experimental.constrained.fma327define 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") #0332 ret double %result333}334 335; Verify that fptoui(42.1) isn't simplified when the rounding mode is336; unknown.337; CHECK-LABEL: f18338; CHECK: call zeroext i32 @llvm.experimental.constrained.fptoui339define zeroext i32 @f18() #0 {340entry:341 %result = call zeroext i32 @llvm.experimental.constrained.fptoui.i32.f64(342 double 42.1,343 metadata !"fpexcept.strict") #0344 ret i32 %result345}346 347; Verify that fptosi(42.1) isn't simplified when the rounding mode is348; unknown.349; CHECK-LABEL: f19350; CHECK: call i32 @llvm.experimental.constrained.fptosi351define i32 @f19() #0 {352entry:353 %result = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double 42.1,354 metadata !"fpexcept.strict") #0355 ret i32 %result356}357 358; Verify that fptrunc(42.1) isn't simplified when the rounding mode is359; unknown.360; CHECK-LABEL: f20361; CHECK: call float @llvm.experimental.constrained.fptrunc362define 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") #0368 ret float %result369}370 371; Verify that fpext(42.1) isn't simplified when the rounding mode is372; unknown.373; CHECK-LABEL: f21374; CHECK: call double @llvm.experimental.constrained.fpext375define double @f21() #0 {376entry:377 %result = call double @llvm.experimental.constrained.fpext.f64.f32(float 42.0,378 metadata !"fpexcept.strict") #0379 ret double %result380}381 382; Verify that lrint(42.1) isn't simplified when the rounding mode is unknown.383; CHECK-LABEL: f22384; CHECK: call i32 @llvm.experimental.constrained.lrint385define 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") #0390 ret i32 %result391}392 393; Verify that lrintf(42.0) isn't simplified when the rounding mode is unknown.394; CHECK-LABEL: f23395; CHECK: call i32 @llvm.experimental.constrained.lrint396define 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") #0401 ret i32 %result402}403 404; Verify that llrint(42.1) isn't simplified when the rounding mode is unknown.405; CHECK-LABEL: f24406; CHECK: call i64 @llvm.experimental.constrained.llrint407define 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") #0412 ret i64 %result413}414 415; Verify that llrint(42.0) isn't simplified when the rounding mode is unknown.416; CHECK-LABEL: f25417; CHECK: call i64 @llvm.experimental.constrained.llrint418define 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") #0423 ret i64 %result424}425 426; Verify that lround(42.1) isn't simplified when the rounding mode is unknown.427; CHECK-LABEL: f26428; CHECK: call i32 @llvm.experimental.constrained.lround429define i32 @f26() #0 {430entry:431 %result = call i32 @llvm.experimental.constrained.lround.i32.f64(double 42.1,432 metadata !"fpexcept.strict") #0433 ret i32 %result434}435 436; Verify that lround(42.0) isn't simplified when the rounding mode is unknown.437; CHECK-LABEL: f27438; CHECK: call i32 @llvm.experimental.constrained.lround439define i32 @f27() #0 {440entry:441 %result = call i32 @llvm.experimental.constrained.lround.i32.f32(float 42.0,442 metadata !"fpexcept.strict") #0443 ret i32 %result444}445 446; Verify that llround(42.1) isn't simplified when the rounding mode is unknown.447; CHECK-LABEL: f28448; CHECK: call i64 @llvm.experimental.constrained.llround449define i64 @f28() #0 {450entry:451 %result = call i64 @llvm.experimental.constrained.llround.i64.f64(double 42.1,452 metadata !"fpexcept.strict") #0453 ret i64 %result454}455 456; Verify that llround(42.0) isn't simplified when the rounding mode is unknown.457; CHECK-LABEL: f29458; CHECK: call i64 @llvm.experimental.constrained.llround459define i64 @f29() #0 {460entry:461 %result = call i64 @llvm.experimental.constrained.llround.i64.f32(float 42.0,462 metadata !"fpexcept.strict") #0463 ret i64 %result464}465 466; Verify that sitofp(42) isn't simplified when the rounding mode is unknown.467; CHECK-LABEL: @f30468; CHECK: call double @llvm.experimental.constrained.sitofp469define double @f30() #0 {470entry:471 %result = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 42,472 metadata !"round.dynamic",473 metadata !"fpexcept.strict") #0474 ret double %result475}476 477; Verify that uitofp(42) isn't simplified when the rounding mode is unknown.478; CHECK-LABEL: @f31479; CHECK: call double @llvm.experimental.constrained.uitofp480define double @f31() #0 {481entry:482 %result = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 42,483 metadata !"round.dynamic",484 metadata !"fpexcept.strict") #0485 ret double %result486}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