brintos

brintos / llvm-project-archived public Read only

0
0
Text · 22.6 KiB · 3acf559 Raw
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