386 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -S -passes=early-cse -earlycse-debug-hash | FileCheck %s3; RUN: opt < %s -S -passes='early-cse<memssa>' | FileCheck %s4 5; Test use of constrained floating point intrinsics with consistent6; floating point environments. The default floating point environment7; is tested along with some alternate environments. All tests should8; trigger CSE.9 10define double @fadd_defaultenv(double %a, double %b) #0 {11; CHECK-LABEL: @fadd_defaultenv(12; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fadd.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0:[0-9]+]]13; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]14; CHECK-NEXT: ret double [[TMP1]]15;16 %1 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #017 %2 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #018 %3 = call double @foo.f64(double %1, double %2) #019 ret double %220}21 22define double @fadd_neginf(double %a, double %b) #0 {23; CHECK-LABEL: @fadd_neginf(24; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fadd.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.downward", metadata !"fpexcept.ignore") #[[ATTR0]]25; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]26; CHECK-NEXT: ret double [[TMP1]]27;28 %1 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.downward", metadata !"fpexcept.ignore") #029 %2 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.downward", metadata !"fpexcept.ignore") #030 %3 = call double @foo.f64(double %1, double %2) #031 ret double %232}33 34define double @fadd_maytrap(double %a, double %b) #0 {35; CHECK-LABEL: @fadd_maytrap(36; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fadd.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]37; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]38; CHECK-NEXT: ret double [[TMP1]]39;40 %1 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #041 %2 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #042 %3 = call double @foo.f64(double %1, double %2) #043 ret double %244}45 46define double @fsub_defaultenv(double %a, double %b) #0 {47; CHECK-LABEL: @fsub_defaultenv(48; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fsub.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]49; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]50; CHECK-NEXT: ret double [[TMP1]]51;52 %1 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #053 %2 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #054 %3 = call double @foo.f64(double %1, double %2) #055 ret double %256}57 58define double @fsub_neginf(double %a, double %b) #0 {59; CHECK-LABEL: @fsub_neginf(60; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fsub.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.downward", metadata !"fpexcept.ignore") #[[ATTR0]]61; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]62; CHECK-NEXT: ret double [[TMP1]]63;64 %1 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.downward", metadata !"fpexcept.ignore") #065 %2 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.downward", metadata !"fpexcept.ignore") #066 %3 = call double @foo.f64(double %1, double %2) #067 ret double %268}69 70define double @fsub_maytrap(double %a, double %b) #0 {71; CHECK-LABEL: @fsub_maytrap(72; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fsub.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]73; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]74; CHECK-NEXT: ret double [[TMP1]]75;76 %1 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #077 %2 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #078 %3 = call double @foo.f64(double %1, double %2) #079 ret double %280}81 82define double @fmul_defaultenv(double %a, double %b) #0 {83; CHECK-LABEL: @fmul_defaultenv(84; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fmul.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]85; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]86; CHECK-NEXT: ret double [[TMP1]]87;88 %1 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #089 %2 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #090 %3 = call double @foo.f64(double %1, double %2) #091 ret double %292}93 94define double @fmul_neginf(double %a, double %b) #0 {95; CHECK-LABEL: @fmul_neginf(96; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fmul.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.downward", metadata !"fpexcept.ignore") #[[ATTR0]]97; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]98; CHECK-NEXT: ret double [[TMP1]]99;100 %1 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.downward", metadata !"fpexcept.ignore") #0101 %2 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.downward", metadata !"fpexcept.ignore") #0102 %3 = call double @foo.f64(double %1, double %2) #0103 ret double %2104}105define double @fmul_maytrap(double %a, double %b) #0 {106; CHECK-LABEL: @fmul_maytrap(107; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fmul.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]108; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]109; CHECK-NEXT: ret double [[TMP1]]110;111 %1 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0112 %2 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0113 %3 = call double @foo.f64(double %1, double %2) #0114 ret double %2115}116 117define double @fdiv_defaultenv(double %a, double %b) #0 {118; CHECK-LABEL: @fdiv_defaultenv(119; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fdiv.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]120; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]121; CHECK-NEXT: ret double [[TMP1]]122;123 %1 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0124 %2 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0125 %3 = call double @foo.f64(double %1, double %2) #0126 ret double %2127}128 129define double @fdiv_neginf(double %a, double %b) #0 {130; CHECK-LABEL: @fdiv_neginf(131; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fdiv.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.downward", metadata !"fpexcept.ignore") #[[ATTR0]]132; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]133; CHECK-NEXT: ret double [[TMP1]]134;135 %1 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.downward", metadata !"fpexcept.ignore") #0136 %2 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.downward", metadata !"fpexcept.ignore") #0137 %3 = call double @foo.f64(double %1, double %2) #0138 ret double %2139}140 141define double @fdiv_maytrap(double %a, double %b) #0 {142; CHECK-LABEL: @fdiv_maytrap(143; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fdiv.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]144; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]145; CHECK-NEXT: ret double [[TMP1]]146;147 %1 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0148 %2 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0149 %3 = call double @foo.f64(double %1, double %2) #0150 ret double %2151}152 153define double @frem_defaultenv(double %a, double %b) #0 {154; CHECK-LABEL: @frem_defaultenv(155; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.frem.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]156; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]157; CHECK-NEXT: ret double [[TMP1]]158;159 %1 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0160 %2 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0161 %3 = call double @foo.f64(double %1, double %2) #0162 ret double %2163}164 165define double @frem_neginf(double %a, double %b) #0 {166; CHECK-LABEL: @frem_neginf(167; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.frem.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.downward", metadata !"fpexcept.ignore") #[[ATTR0]]168; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]169; CHECK-NEXT: ret double [[TMP1]]170;171 %1 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.downward", metadata !"fpexcept.ignore") #0172 %2 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.downward", metadata !"fpexcept.ignore") #0173 %3 = call double @foo.f64(double %1, double %2) #0174 ret double %2175}176 177define double @frem_maytrap(double %a, double %b) #0 {178; CHECK-LABEL: @frem_maytrap(179; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.frem.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]180; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]181; CHECK-NEXT: ret double [[TMP1]]182;183 %1 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0184 %2 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0185 %3 = call double @foo.f64(double %1, double %2) #0186 ret double %2187}188 189define i32 @fptoui_defaultenv(double %a) #0 {190; CHECK-LABEL: @fptoui_defaultenv(191; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double [[A:%.*]], metadata !"fpexcept.ignore") #[[ATTR0]]192; CHECK-NEXT: [[TMP2:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]]193; CHECK-NEXT: ret i32 [[TMP1]]194;195 %1 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.ignore") #0196 %2 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.ignore") #0197 %3 = call i32 @bar.i32(i32 %1, i32 %1) #0198 ret i32 %2199}200 201define i32 @fptoui_maytrap(double %a) #0 {202; CHECK-LABEL: @fptoui_maytrap(203; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double [[A:%.*]], metadata !"fpexcept.maytrap") #[[ATTR0]]204; CHECK-NEXT: [[TMP2:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]]205; CHECK-NEXT: ret i32 [[TMP1]]206;207 %1 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.maytrap") #0208 %2 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.maytrap") #0209 %3 = call i32 @bar.i32(i32 %1, i32 %1) #0210 ret i32 %2211}212 213define double @uitofp_defaultenv(i32 %a) #0 {214; CHECK-LABEL: @uitofp_defaultenv(215; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]216; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]217; CHECK-NEXT: ret double [[TMP1]]218;219 %1 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0220 %2 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0221 %3 = call double @foo.f64(double %1, double %1) #0222 ret double %2223}224 225define double @uitofp_neginf(i32 %a) #0 {226; CHECK-LABEL: @uitofp_neginf(227; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 [[A:%.*]], metadata !"round.downward", metadata !"fpexcept.ignore") #[[ATTR0]]228; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]229; CHECK-NEXT: ret double [[TMP1]]230;231 %1 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.downward", metadata !"fpexcept.ignore") #0232 %2 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.downward", metadata !"fpexcept.ignore") #0233 %3 = call double @foo.f64(double %1, double %1) #0234 ret double %2235}236 237define double @uitofp_maytrap(i32 %a) #0 {238; CHECK-LABEL: @uitofp_maytrap(239; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]240; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]241; CHECK-NEXT: ret double [[TMP1]]242;243 %1 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0244 %2 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0245 %3 = call double @foo.f64(double %1, double %1) #0246 ret double %2247}248 249define i32 @fptosi_defaultenv(double %a) #0 {250; CHECK-LABEL: @fptosi_defaultenv(251; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double [[A:%.*]], metadata !"fpexcept.ignore") #[[ATTR0]]252; CHECK-NEXT: [[TMP2:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]]253; CHECK-NEXT: ret i32 [[TMP1]]254;255 %1 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.ignore") #0256 %2 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.ignore") #0257 %3 = call i32 @bar.i32(i32 %1, i32 %1) #0258 ret i32 %2259}260 261define i32 @fptosi_maytrap(double %a) #0 {262; CHECK-LABEL: @fptosi_maytrap(263; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double [[A:%.*]], metadata !"fpexcept.maytrap") #[[ATTR0]]264; CHECK-NEXT: [[TMP2:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]]265; CHECK-NEXT: ret i32 [[TMP1]]266;267 %1 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.maytrap") #0268 %2 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.maytrap") #0269 %3 = call i32 @bar.i32(i32 %1, i32 %1) #0270 ret i32 %2271}272 273define double @sitofp_defaultenv(i32 %a) #0 {274; CHECK-LABEL: @sitofp_defaultenv(275; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]276; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]277; CHECK-NEXT: ret double [[TMP1]]278;279 %1 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0280 %2 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0281 %3 = call double @foo.f64(double %1, double %1) #0282 ret double %2283}284 285define double @sitofp_neginf(i32 %a) #0 {286; CHECK-LABEL: @sitofp_neginf(287; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 [[A:%.*]], metadata !"round.downward", metadata !"fpexcept.ignore") #[[ATTR0]]288; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]289; CHECK-NEXT: ret double [[TMP1]]290;291 %1 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.downward", metadata !"fpexcept.ignore") #0292 %2 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.downward", metadata !"fpexcept.ignore") #0293 %3 = call double @foo.f64(double %1, double %1) #0294 ret double %2295}296 297define double @sitofp_maytrap(i32 %a) #0 {298; CHECK-LABEL: @sitofp_maytrap(299; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]300; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]301; CHECK-NEXT: ret double [[TMP1]]302;303 %1 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0304 %2 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0305 %3 = call double @foo.f64(double %1, double %1) #0306 ret double %2307}308 309define i1 @fcmp_defaultenv(double %a, double %b) #0 {310; CHECK-LABEL: @fcmp_defaultenv(311; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.ignore") #[[ATTR0]]312; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP1]] to i32313; CHECK-NEXT: [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP2]], i32 [[TMP2]]) #[[ATTR0]]314; CHECK-NEXT: ret i1 [[TMP1]]315;316 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0317 %2 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0318 %3 = zext i1 %1 to i32319 %4 = zext i1 %2 to i32320 %5 = call i32 @bar.i32(i32 %3, i32 %4) #0321 ret i1 %2322}323 324define i1 @fcmp_maytrap(double %a, double %b) #0 {325; CHECK-LABEL: @fcmp_maytrap(326; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.maytrap") #[[ATTR0]]327; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP1]] to i32328; CHECK-NEXT: [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP2]], i32 [[TMP2]]) #[[ATTR0]]329; CHECK-NEXT: ret i1 [[TMP1]]330;331 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.maytrap") #0332 %2 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.maytrap") #0333 %3 = zext i1 %1 to i32334 %4 = zext i1 %2 to i32335 %5 = call i32 @bar.i32(i32 %3, i32 %4) #0336 ret i1 %2337}338 339define i1 @fcmps_defaultenv(double %a, double %b) #0 {340; CHECK-LABEL: @fcmps_defaultenv(341; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.ignore") #[[ATTR0]]342; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP1]] to i32343; CHECK-NEXT: [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP2]], i32 [[TMP2]]) #[[ATTR0]]344; CHECK-NEXT: ret i1 [[TMP1]]345;346 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0347 %2 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0348 %3 = zext i1 %1 to i32349 %4 = zext i1 %2 to i32350 %5 = call i32 @bar.i32(i32 %3, i32 %4) #0351 ret i1 %2352}353 354define i1 @fcmps_maytrap(double %a, double %b) #0 {355; CHECK-LABEL: @fcmps_maytrap(356; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.maytrap") #[[ATTR0]]357; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP1]] to i32358; CHECK-NEXT: [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP2]], i32 [[TMP2]]) #[[ATTR0]]359; CHECK-NEXT: ret i1 [[TMP1]]360;361 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.maytrap") #0362 %2 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.maytrap") #0363 %3 = zext i1 %1 to i32364 %4 = zext i1 %2 to i32365 %5 = call i32 @bar.i32(i32 %3, i32 %4) #0366 ret i1 %2367}368 369attributes #0 = { strictfp }370 371declare void @arbitraryfunc() #0372declare double @foo.f64(double, double) #0373declare i32 @bar.i32(i32, i32) #0374 375declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata)376declare double @llvm.experimental.constrained.fsub.f64(double, double, metadata, metadata)377declare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata)378declare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata)379declare double @llvm.experimental.constrained.frem.f64(double, double, metadata, metadata)380declare i32 @llvm.experimental.constrained.fptoui.i32.f64(double, metadata)381declare double @llvm.experimental.constrained.uitofp.f64.i32(i32, metadata, metadata)382declare i32 @llvm.experimental.constrained.fptosi.i32.f64(double, metadata)383declare double @llvm.experimental.constrained.sitofp.f64.i32(i32, metadata, metadata)384declare i1 @llvm.experimental.constrained.fcmp.f64(double, double, metadata, metadata)385declare i1 @llvm.experimental.constrained.fcmps.f64(double, double, metadata, metadata)386