323 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 in the default6; floating point environment.7 8define double @multiple_fadd(double %a, double %b) #0 {9; CHECK-LABEL: @multiple_fadd(10; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fadd.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0:[0-9]+]]11; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]12; CHECK-NEXT: ret double [[TMP1]]13;14 %1 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #015 %2 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #016 %3 = call double @foo.f64(double %1, double %2) #017 ret double %218}19 20define double @multiple_fadd_split(double %a, double %b) #0 {21; CHECK-LABEL: @multiple_fadd_split(22; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fadd.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]23; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]]24; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]25; CHECK-NEXT: ret double [[TMP1]]26;27 %1 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #028 call void @arbitraryfunc() #029 %2 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #030 %3 = call double @foo.f64(double %1, double %2) #031 ret double %232}33 34define double @multiple_fsub(double %a, double %b) #0 {35; CHECK-LABEL: @multiple_fsub(36; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fsub.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[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.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #041 %2 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #042 %3 = call double @foo.f64(double %1, double %2) #043 ret double %244}45 46define double @multiple_fsub_split(double %a, double %b) #0 {47; CHECK-LABEL: @multiple_fsub_split(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: call void @arbitraryfunc() #[[ATTR0]]50; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]51; CHECK-NEXT: ret double [[TMP1]]52;53 %1 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #054 call void @arbitraryfunc() #055 %2 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #056 %3 = call double @foo.f64(double %1, double %2) #057 ret double %258}59 60define double @multiple_fmul(double %a, double %b) #0 {61; CHECK-LABEL: @multiple_fmul(62; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fmul.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]63; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]64; CHECK-NEXT: ret double [[TMP1]]65;66 %1 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #067 %2 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #068 %3 = call double @foo.f64(double %1, double %2) #069 ret double %270}71 72define double @multiple_fmul_split(double %a, double %b) #0 {73; CHECK-LABEL: @multiple_fmul_split(74; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fmul.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]75; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]]76; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]77; CHECK-NEXT: ret double [[TMP1]]78;79 %1 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #080 call void @arbitraryfunc() #081 %2 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #082 %3 = call double @foo.f64(double %1, double %2) #083 ret double %284}85 86define double @multiple_fdiv(double %a, double %b) #0 {87; CHECK-LABEL: @multiple_fdiv(88; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fdiv.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]89; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]90; CHECK-NEXT: ret double [[TMP1]]91;92 %1 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #093 %2 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #094 %3 = call double @foo.f64(double %1, double %2) #095 ret double %296}97 98define double @multiple_fdiv_split(double %a, double %b) #0 {99; CHECK-LABEL: @multiple_fdiv_split(100; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fdiv.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]101; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]]102; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]103; CHECK-NEXT: ret double [[TMP1]]104;105 %1 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0106 call void @arbitraryfunc() #0107 %2 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0108 %3 = call double @foo.f64(double %1, double %2) #0109 ret double %2110}111 112define double @multiple_frem(double %a, double %b) #0 {113; CHECK-LABEL: @multiple_frem(114; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.frem.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]115; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]116; CHECK-NEXT: ret double [[TMP1]]117;118 %1 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0119 %2 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0120 %3 = call double @foo.f64(double %1, double %2) #0121 ret double %2122}123 124define double @multiple_frem_split(double %a, double %b) #0 {125; CHECK-LABEL: @multiple_frem_split(126; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.frem.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]127; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]]128; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]129; CHECK-NEXT: ret double [[TMP1]]130;131 %1 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0132 call void @arbitraryfunc() #0133 %2 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0134 %3 = call double @foo.f64(double %1, double %2) #0135 ret double %2136}137 138define i32 @multiple_fptoui(double %a) #0 {139; CHECK-LABEL: @multiple_fptoui(140; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double [[A:%.*]], metadata !"fpexcept.ignore") #[[ATTR0]]141; CHECK-NEXT: [[TMP2:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]]142; CHECK-NEXT: ret i32 [[TMP1]]143;144 %1 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.ignore") #0145 %2 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.ignore") #0146 %3 = call i32 @bar.i32(i32 %1, i32 %1) #0147 ret i32 %2148}149 150define i32 @multiple_fptoui_split(double %a, double %b) #0 {151; CHECK-LABEL: @multiple_fptoui_split(152; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double [[A:%.*]], metadata !"fpexcept.ignore") #[[ATTR0]]153; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]]154; CHECK-NEXT: [[TMP2:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]]155; CHECK-NEXT: ret i32 [[TMP1]]156;157 %1 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.ignore") #0158 call void @arbitraryfunc() #0159 %2 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.ignore") #0160 %3 = call i32 @bar.i32(i32 %1, i32 %1) #0161 ret i32 %2162}163 164define double @multiple_uitofp(i32 %a) #0 {165; CHECK-LABEL: @multiple_uitofp(166; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]167; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]168; CHECK-NEXT: ret double [[TMP1]]169;170 %1 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0171 %2 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0172 %3 = call double @foo.f64(double %1, double %1) #0173 ret double %2174}175 176define double @multiple_uitofp_split(i32 %a) #0 {177; CHECK-LABEL: @multiple_uitofp_split(178; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]179; CHECK-NEXT: call void @arbitraryfunc() #[[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.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0184 call void @arbitraryfunc() #0185 %2 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0186 %3 = call double @foo.f64(double %1, double %1) #0187 ret double %2188}189 190define i32 @multiple_fptosi(double %a) #0 {191; CHECK-LABEL: @multiple_fptosi(192; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double [[A:%.*]], metadata !"fpexcept.ignore") #[[ATTR0]]193; CHECK-NEXT: [[TMP2:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]]194; CHECK-NEXT: ret i32 [[TMP1]]195;196 %1 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.ignore") #0197 %2 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.ignore") #0198 %3 = call i32 @bar.i32(i32 %1, i32 %1) #0199 ret i32 %2200}201 202define i32 @multiple_fptosi_split(double %a, double %b) #0 {203; CHECK-LABEL: @multiple_fptosi_split(204; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double [[A:%.*]], metadata !"fpexcept.ignore") #[[ATTR0]]205; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]]206; CHECK-NEXT: [[TMP2:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]]207; CHECK-NEXT: ret i32 [[TMP1]]208;209 %1 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.ignore") #0210 call void @arbitraryfunc() #0211 %2 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.ignore") #0212 %3 = call i32 @bar.i32(i32 %1, i32 %1) #0213 ret i32 %2214}215 216define double @multiple_sitofp(i32 %a) #0 {217; CHECK-LABEL: @multiple_sitofp(218; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]219; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]220; CHECK-NEXT: ret double [[TMP1]]221;222 %1 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0223 %2 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0224 %3 = call double @foo.f64(double %1, double %1) #0225 ret double %2226}227 228define double @multiple_sitofp_split(i32 %a) #0 {229; CHECK-LABEL: @multiple_sitofp_split(230; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]231; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]]232; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]233; CHECK-NEXT: ret double [[TMP1]]234;235 %1 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0236 call void @arbitraryfunc() #0237 %2 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0238 %3 = call double @foo.f64(double %1, double %1) #0239 ret double %2240}241 242define i1 @multiple_fcmp(double %a, double %b) #0 {243; CHECK-LABEL: @multiple_fcmp(244; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.ignore") #[[ATTR0]]245; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP1]] to i32246; CHECK-NEXT: [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP2]], i32 [[TMP2]]) #[[ATTR0]]247; CHECK-NEXT: ret i1 [[TMP1]]248;249 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0250 %2 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0251 %3 = zext i1 %1 to i32252 %4 = zext i1 %2 to i32253 %5 = call i32 @bar.i32(i32 %3, i32 %4) #0254 ret i1 %2255}256 257define i1 @multiple_fcmp_split(double %a, double %b) #0 {258; CHECK-LABEL: @multiple_fcmp_split(259; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.ignore") #[[ATTR0]]260; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]]261; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP1]] to i32262; CHECK-NEXT: [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP2]], i32 [[TMP2]]) #[[ATTR0]]263; CHECK-NEXT: ret i1 [[TMP1]]264;265 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0266 call void @arbitraryfunc() #0267 %2 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0268 %3 = zext i1 %1 to i32269 %4 = zext i1 %2 to i32270 %5 = call i32 @bar.i32(i32 %3, i32 %4) #0271 ret i1 %2272}273 274define i1 @multiple_fcmps(double %a, double %b) #0 {275; CHECK-LABEL: @multiple_fcmps(276; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.ignore") #[[ATTR0]]277; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP1]] to i32278; CHECK-NEXT: [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP2]], i32 [[TMP2]]) #[[ATTR0]]279; CHECK-NEXT: ret i1 [[TMP1]]280;281 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0282 %2 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0283 %3 = zext i1 %1 to i32284 %4 = zext i1 %2 to i32285 %5 = call i32 @bar.i32(i32 %3, i32 %4) #0286 ret i1 %2287}288 289define i1 @multiple_fcmps_split(double %a, double %b) #0 {290; CHECK-LABEL: @multiple_fcmps_split(291; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.ignore") #[[ATTR0]]292; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]]293; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP1]] to i32294; CHECK-NEXT: [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP2]], i32 [[TMP2]]) #[[ATTR0]]295; CHECK-NEXT: ret i1 [[TMP1]]296;297 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0298 call void @arbitraryfunc() #0299 %2 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0300 %3 = zext i1 %1 to i32301 %4 = zext i1 %2 to i32302 %5 = call i32 @bar.i32(i32 %3, i32 %4) #0303 ret i1 %2304}305 306attributes #0 = { strictfp }307 308declare void @arbitraryfunc() #0309declare double @foo.f64(double, double) #0310declare i32 @bar.i32(i32, i32) #0311 312declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata)313declare double @llvm.experimental.constrained.fsub.f64(double, double, metadata, metadata)314declare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata)315declare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata)316declare double @llvm.experimental.constrained.frem.f64(double, double, metadata, metadata)317declare i32 @llvm.experimental.constrained.fptoui.i32.f64(double, metadata)318declare double @llvm.experimental.constrained.uitofp.f64.i32(i32, metadata, metadata)319declare i32 @llvm.experimental.constrained.fptosi.i32.f64(double, metadata)320declare double @llvm.experimental.constrained.sitofp.f64.i32(i32, metadata, metadata)321declare i1 @llvm.experimental.constrained.fcmp.f64(double, double, metadata, metadata)322declare i1 @llvm.experimental.constrained.fcmps.f64(double, double, metadata, metadata)323