692 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S -passes=instcombine < %s | FileCheck %s3 4; Test that floating point operations are not treated as sources of5; poison.6 7define float @freeze_fneg(float %arg) {8; CHECK-LABEL: define float @freeze_fneg(9; CHECK-SAME: float [[ARG:%.*]]) {10; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]11; CHECK-NEXT: [[OP:%.*]] = fneg float [[ARG_FR]]12; CHECK-NEXT: ret float [[OP]]13;14 %op = fneg float %arg15 %freeze = freeze float %op16 ret float %freeze17}18 19define float @freeze_fadd(float %arg0, float noundef %arg1) {20; CHECK-LABEL: define float @freeze_fadd(21; CHECK-SAME: float [[ARG0:%.*]], float noundef [[ARG1:%.*]]) {22; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]23; CHECK-NEXT: [[OP:%.*]] = fadd float [[ARG0_FR]], [[ARG1]]24; CHECK-NEXT: ret float [[OP]]25;26 %op = fadd float %arg0, %arg127 %freeze = freeze float %op28 ret float %freeze29}30 31define float @freeze_fsub(float %arg0, float noundef %arg1) {32; CHECK-LABEL: define float @freeze_fsub(33; CHECK-SAME: float [[ARG0:%.*]], float noundef [[ARG1:%.*]]) {34; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]35; CHECK-NEXT: [[OP:%.*]] = fsub float [[ARG0_FR]], [[ARG1]]36; CHECK-NEXT: ret float [[OP]]37;38 %op = fsub float %arg0, %arg139 %freeze = freeze float %op40 ret float %freeze41}42 43define float @freeze_fmul(float %arg0, float noundef %arg1) {44; CHECK-LABEL: define float @freeze_fmul(45; CHECK-SAME: float [[ARG0:%.*]], float noundef [[ARG1:%.*]]) {46; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]47; CHECK-NEXT: [[OP:%.*]] = fmul float [[ARG0_FR]], [[ARG1]]48; CHECK-NEXT: ret float [[OP]]49;50 %op = fmul float %arg0, %arg151 %freeze = freeze float %op52 ret float %freeze53}54 55define float @freeze_fdiv(float %arg0, float noundef %arg1) {56; CHECK-LABEL: define float @freeze_fdiv(57; CHECK-SAME: float [[ARG0:%.*]], float noundef [[ARG1:%.*]]) {58; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]59; CHECK-NEXT: [[OP:%.*]] = fdiv float [[ARG0_FR]], [[ARG1]]60; CHECK-NEXT: ret float [[OP]]61;62 %op = fdiv float %arg0, %arg163 %freeze = freeze float %op64 ret float %freeze65}66 67define float @freeze_frem(float %arg0, float noundef %arg1) {68; CHECK-LABEL: define float @freeze_frem(69; CHECK-SAME: float [[ARG0:%.*]], float noundef [[ARG1:%.*]]) {70; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]71; CHECK-NEXT: [[OP:%.*]] = fdiv float [[ARG0_FR]], [[ARG1]]72; CHECK-NEXT: ret float [[OP]]73;74 %op = fdiv float %arg0, %arg175 %freeze = freeze float %op76 ret float %freeze77}78 79define double @fpext(float %arg) {80; CHECK-LABEL: define double @fpext(81; CHECK-SAME: float [[ARG:%.*]]) {82; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]83; CHECK-NEXT: [[OP:%.*]] = fpext float [[ARG_FR]] to double84; CHECK-NEXT: ret double [[OP]]85;86 %op = fpext float %arg to double87 %freeze = freeze double %op88 ret double %freeze89}90 91define float @fptrunc(double %arg) {92; CHECK-LABEL: define float @fptrunc(93; CHECK-SAME: double [[ARG:%.*]]) {94; CHECK-NEXT: [[ARG_FR:%.*]] = freeze double [[ARG]]95; CHECK-NEXT: [[OP:%.*]] = fptrunc double [[ARG_FR]] to float96; CHECK-NEXT: ret float [[OP]]97;98 %op = fptrunc double %arg to float99 %freeze = freeze float %op100 ret float %freeze101}102 103define float @sitofp(i32 %arg) {104; CHECK-LABEL: define float @sitofp(105; CHECK-SAME: i32 [[ARG:%.*]]) {106; CHECK-NEXT: [[ARG_FR:%.*]] = freeze i32 [[ARG]]107; CHECK-NEXT: [[OP:%.*]] = sitofp i32 [[ARG_FR]] to float108; CHECK-NEXT: ret float [[OP]]109;110 %op = sitofp i32 %arg to float111 %freeze = freeze float %op112 ret float %freeze113}114 115define float @uitofp(i32 %arg) {116; CHECK-LABEL: define float @uitofp(117; CHECK-SAME: i32 [[ARG:%.*]]) {118; CHECK-NEXT: [[ARG_FR:%.*]] = freeze i32 [[ARG]]119; CHECK-NEXT: [[OP:%.*]] = uitofp i32 [[ARG_FR]] to float120; CHECK-NEXT: ret float [[OP]]121;122 %op = uitofp i32 %arg to float123 %freeze = freeze float %op124 ret float %freeze125}126 127define float @freeze_fma(float %arg0, float noundef %arg1, float noundef %arg2) {128; CHECK-LABEL: define float @freeze_fma(129; CHECK-SAME: float [[ARG0:%.*]], float noundef [[ARG1:%.*]], float noundef [[ARG2:%.*]]) {130; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]131; CHECK-NEXT: [[OP:%.*]] = call float @llvm.fma.f32(float [[ARG0_FR]], float noundef [[ARG1]], float noundef [[ARG2]])132; CHECK-NEXT: ret float [[OP]]133;134 %op = call float @llvm.fma.f32(float %arg0, float noundef %arg1, float noundef %arg2)135 %freeze = freeze float %op136 ret float %freeze137}138 139define float @freeze_fmuladd(float %arg0, float noundef %arg1, float noundef %arg2) {140; CHECK-LABEL: define float @freeze_fmuladd(141; CHECK-SAME: float [[ARG0:%.*]], float noundef [[ARG1:%.*]], float noundef [[ARG2:%.*]]) {142; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]143; CHECK-NEXT: [[OP:%.*]] = call float @llvm.fmuladd.f32(float [[ARG0_FR]], float noundef [[ARG1]], float noundef [[ARG2]])144; CHECK-NEXT: ret float [[OP]]145;146 %op = call float @llvm.fmuladd.f32(float %arg0, float noundef %arg1, float noundef %arg2)147 %freeze = freeze float %op148 ret float %freeze149}150 151define float @freeze_sqrt(float %arg) {152; CHECK-LABEL: define float @freeze_sqrt(153; CHECK-SAME: float [[ARG:%.*]]) {154; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]155; CHECK-NEXT: [[OP:%.*]] = call float @llvm.sqrt.f32(float [[ARG_FR]])156; CHECK-NEXT: ret float [[OP]]157;158 %op = call float @llvm.sqrt.f32(float %arg)159 %freeze = freeze float %op160 ret float %freeze161}162 163define float @freeze_powi(float %arg0, i32 %arg1) {164; CHECK-LABEL: define float @freeze_powi(165; CHECK-SAME: float [[ARG0:%.*]], i32 [[ARG1:%.*]]) {166; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]167; CHECK-NEXT: [[ARG1_FR:%.*]] = freeze i32 [[ARG1]]168; CHECK-NEXT: [[OP:%.*]] = call float @llvm.powi.f32.i32(float [[ARG0_FR]], i32 [[ARG1_FR]])169; CHECK-NEXT: ret float [[OP]]170;171 %op = call float @llvm.powi.f32.i32(float %arg0, i32 %arg1)172 %freeze = freeze float %op173 ret float %freeze174}175 176define float @freeze_sin(float %arg) {177; CHECK-LABEL: define float @freeze_sin(178; CHECK-SAME: float [[ARG:%.*]]) {179; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]180; CHECK-NEXT: [[OP:%.*]] = call float @llvm.sin.f32(float [[ARG_FR]])181; CHECK-NEXT: ret float [[OP]]182;183 %op = call float @llvm.sin.f32(float %arg)184 %freeze = freeze float %op185 ret float %freeze186}187 188define float @freeze_cos(float %arg) {189; CHECK-LABEL: define float @freeze_cos(190; CHECK-SAME: float [[ARG:%.*]]) {191; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]192; CHECK-NEXT: [[OP:%.*]] = call float @llvm.cos.f32(float [[ARG_FR]])193; CHECK-NEXT: ret float [[OP]]194;195 %op = call float @llvm.cos.f32(float %arg)196 %freeze = freeze float %op197 ret float %freeze198}199 200define float @freeze_pow(float %arg0, float noundef %arg1) {201; CHECK-LABEL: define float @freeze_pow(202; CHECK-SAME: float [[ARG0:%.*]], float noundef [[ARG1:%.*]]) {203; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]204; CHECK-NEXT: [[OP:%.*]] = call float @llvm.pow.f32(float [[ARG0_FR]], float noundef [[ARG1]])205; CHECK-NEXT: ret float [[OP]]206;207 %op = call float @llvm.pow.f32(float %arg0, float noundef %arg1)208 %freeze = freeze float %op209 ret float %freeze210}211 212define float @freeze_log(float %arg) {213; CHECK-LABEL: define float @freeze_log(214; CHECK-SAME: float [[ARG:%.*]]) {215; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]216; CHECK-NEXT: [[OP:%.*]] = call float @llvm.log.f32(float [[ARG_FR]])217; CHECK-NEXT: ret float [[OP]]218;219 %op = call float @llvm.log.f32(float %arg)220 %freeze = freeze float %op221 ret float %freeze222}223 224define float @freeze_log10(float %arg) {225; CHECK-LABEL: define float @freeze_log10(226; CHECK-SAME: float [[ARG:%.*]]) {227; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]228; CHECK-NEXT: [[OP:%.*]] = call float @llvm.log10.f32(float [[ARG_FR]])229; CHECK-NEXT: ret float [[OP]]230;231 %op = call float @llvm.log10.f32(float %arg)232 %freeze = freeze float %op233 ret float %freeze234}235 236define float @freeze_log2(float %arg) {237; CHECK-LABEL: define float @freeze_log2(238; CHECK-SAME: float [[ARG:%.*]]) {239; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]240; CHECK-NEXT: [[OP:%.*]] = call float @llvm.log2.f32(float [[ARG_FR]])241; CHECK-NEXT: ret float [[OP]]242;243 %op = call float @llvm.log2.f32(float %arg)244 %freeze = freeze float %op245 ret float %freeze246}247 248define float @freeze_exp(float %arg) {249; CHECK-LABEL: define float @freeze_exp(250; CHECK-SAME: float [[ARG:%.*]]) {251; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]252; CHECK-NEXT: [[OP:%.*]] = call float @llvm.exp.f32(float [[ARG_FR]])253; CHECK-NEXT: ret float [[OP]]254;255 %op = call float @llvm.exp.f32(float %arg)256 %freeze = freeze float %op257 ret float %freeze258}259 260define float @freeze_exp2(float %arg) {261; CHECK-LABEL: define float @freeze_exp2(262; CHECK-SAME: float [[ARG:%.*]]) {263; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]264; CHECK-NEXT: [[OP:%.*]] = call float @llvm.exp2.f32(float [[ARG_FR]])265; CHECK-NEXT: ret float [[OP]]266;267 %op = call float @llvm.exp2.f32(float %arg)268 %freeze = freeze float %op269 ret float %freeze270}271 272define float @freeze_exp10(float %arg) {273; CHECK-LABEL: define float @freeze_exp10(274; CHECK-SAME: float [[ARG:%.*]]) {275; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]276; CHECK-NEXT: [[OP:%.*]] = call float @llvm.exp10.f32(float [[ARG_FR]])277; CHECK-NEXT: ret float [[OP]]278;279 %op = call float @llvm.exp10.f32(float %arg)280 %freeze = freeze float %op281 ret float %freeze282}283 284define float @freeze_fabs(float %arg) {285; CHECK-LABEL: define float @freeze_fabs(286; CHECK-SAME: float [[ARG:%.*]]) {287; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]288; CHECK-NEXT: [[OP:%.*]] = call float @llvm.fabs.f32(float [[ARG_FR]])289; CHECK-NEXT: ret float [[OP]]290;291 %op = call float @llvm.fabs.f32(float %arg)292 %freeze = freeze float %op293 ret float %freeze294}295 296define float @freeze_copysign(float %arg0, float noundef %arg1) {297; CHECK-LABEL: define float @freeze_copysign(298; CHECK-SAME: float [[ARG0:%.*]], float noundef [[ARG1:%.*]]) {299; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]300; CHECK-NEXT: [[OP:%.*]] = call float @llvm.copysign.f32(float [[ARG0_FR]], float noundef [[ARG1]])301; CHECK-NEXT: ret float [[OP]]302;303 %op = call float @llvm.copysign.f32(float %arg0, float noundef %arg1)304 %freeze = freeze float %op305 ret float %freeze306}307 308define float @freeze_floor(float %arg) {309; CHECK-LABEL: define float @freeze_floor(310; CHECK-SAME: float [[ARG:%.*]]) {311; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]312; CHECK-NEXT: [[OP:%.*]] = call float @llvm.floor.f32(float [[ARG_FR]])313; CHECK-NEXT: ret float [[OP]]314;315 %op = call float @llvm.floor.f32(float %arg)316 %freeze = freeze float %op317 ret float %freeze318}319 320define float @freeze_ceil(float %arg) {321; CHECK-LABEL: define float @freeze_ceil(322; CHECK-SAME: float [[ARG:%.*]]) {323; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]324; CHECK-NEXT: [[OP:%.*]] = call float @llvm.ceil.f32(float [[ARG_FR]])325; CHECK-NEXT: ret float [[OP]]326;327 %op = call float @llvm.ceil.f32(float %arg)328 %freeze = freeze float %op329 ret float %freeze330}331 332define float @freeze_trunc(float %arg) {333; CHECK-LABEL: define float @freeze_trunc(334; CHECK-SAME: float [[ARG:%.*]]) {335; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]336; CHECK-NEXT: [[OP:%.*]] = call float @llvm.trunc.f32(float [[ARG_FR]])337; CHECK-NEXT: ret float [[OP]]338;339 %op = call float @llvm.trunc.f32(float %arg)340 %freeze = freeze float %op341 ret float %freeze342}343 344define float @freeze_rint(float %arg) {345; CHECK-LABEL: define float @freeze_rint(346; CHECK-SAME: float [[ARG:%.*]]) {347; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]348; CHECK-NEXT: [[OP:%.*]] = call float @llvm.rint.f32(float [[ARG_FR]])349; CHECK-NEXT: ret float [[OP]]350;351 %op = call float @llvm.rint.f32(float %arg)352 %freeze = freeze float %op353 ret float %freeze354}355 356define float @freeze_nearbyint(float %arg) {357; CHECK-LABEL: define float @freeze_nearbyint(358; CHECK-SAME: float [[ARG:%.*]]) {359; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]360; CHECK-NEXT: [[OP:%.*]] = call float @llvm.nearbyint.f32(float [[ARG_FR]])361; CHECK-NEXT: ret float [[OP]]362;363 %op = call float @llvm.nearbyint.f32(float %arg)364 %freeze = freeze float %op365 ret float %freeze366}367 368define float @freeze_round(float %arg) {369; CHECK-LABEL: define float @freeze_round(370; CHECK-SAME: float [[ARG:%.*]]) {371; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]372; CHECK-NEXT: [[OP:%.*]] = call float @llvm.round.f32(float [[ARG_FR]])373; CHECK-NEXT: ret float [[OP]]374;375 %op = call float @llvm.round.f32(float %arg)376 %freeze = freeze float %op377 ret float %freeze378}379 380define float @freeze_roundeven(float %arg) {381; CHECK-LABEL: define float @freeze_roundeven(382; CHECK-SAME: float [[ARG:%.*]]) {383; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]384; CHECK-NEXT: [[OP:%.*]] = call float @llvm.roundeven.f32(float [[ARG_FR]])385; CHECK-NEXT: ret float [[OP]]386;387 %op = call float @llvm.roundeven.f32(float %arg)388 %freeze = freeze float %op389 ret float %freeze390}391 392define float @freeze_canonicalize(float %arg) {393; CHECK-LABEL: define float @freeze_canonicalize(394; CHECK-SAME: float [[ARG:%.*]]) {395; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]396; CHECK-NEXT: [[OP:%.*]] = call float @llvm.canonicalize.f32(float [[ARG_FR]])397; CHECK-NEXT: ret float [[OP]]398;399 %op = call float @llvm.canonicalize.f32(float %arg)400 %freeze = freeze float %op401 ret float %freeze402}403 404define float @freeze_arithmetic_fence(float %arg) {405; CHECK-LABEL: define float @freeze_arithmetic_fence(406; CHECK-SAME: float [[ARG:%.*]]) {407; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]408; CHECK-NEXT: [[OP:%.*]] = call float @llvm.arithmetic.fence.f32(float [[ARG_FR]])409; CHECK-NEXT: ret float [[OP]]410;411 %op = call float @llvm.arithmetic.fence.f32(float %arg)412 %freeze = freeze float %op413 ret float %freeze414}415 416define i32 @freeze_lround(float %arg) {417; CHECK-LABEL: define i32 @freeze_lround(418; CHECK-SAME: float [[ARG:%.*]]) {419; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]420; CHECK-NEXT: [[OP:%.*]] = call i32 @llvm.lround.i32.f32(float [[ARG_FR]])421; CHECK-NEXT: ret i32 [[OP]]422;423 %op = call i32 @llvm.lround.i32.f32(float %arg)424 %freeze = freeze i32 %op425 ret i32 %freeze426}427 428define i32 @freeze_llround(float %arg) {429; CHECK-LABEL: define i32 @freeze_llround(430; CHECK-SAME: float [[ARG:%.*]]) {431; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]432; CHECK-NEXT: [[OP:%.*]] = call i32 @llvm.llround.i32.f32(float [[ARG_FR]])433; CHECK-NEXT: ret i32 [[OP]]434;435 %op = call i32 @llvm.llround.i32.f32(float %arg)436 %freeze = freeze i32 %op437 ret i32 %freeze438}439 440define i32 @freeze_lrint(float %arg) {441; CHECK-LABEL: define i32 @freeze_lrint(442; CHECK-SAME: float [[ARG:%.*]]) {443; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]444; CHECK-NEXT: [[OP:%.*]] = call i32 @llvm.lrint.i32.f32(float [[ARG_FR]])445; CHECK-NEXT: ret i32 [[OP]]446;447 %op = call i32 @llvm.lrint.i32.f32(float %arg)448 %freeze = freeze i32 %op449 ret i32 %freeze450}451 452define i32 @freeze_llrint(float %arg) {453; CHECK-LABEL: define i32 @freeze_llrint(454; CHECK-SAME: float [[ARG:%.*]]) {455; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG]]456; CHECK-NEXT: [[OP:%.*]] = call i32 @llvm.llrint.i32.f32(float [[ARG_FR]])457; CHECK-NEXT: ret i32 [[OP]]458;459 %op = call i32 @llvm.llrint.i32.f32(float %arg)460 %freeze = freeze i32 %op461 ret i32 %freeze462}463 464define i32 @freeze_noundef_lround(float %arg) {465; CHECK-LABEL: define i32 @freeze_noundef_lround(466; CHECK-SAME: float [[ARG:%.*]]) {467; CHECK-NEXT: [[OP:%.*]] = call noundef i32 @llvm.lround.i32.f32(float [[ARG]])468; CHECK-NEXT: ret i32 [[OP]]469;470 %op = call noundef i32 @llvm.lround.i32.f32(float %arg)471 %freeze = freeze i32 %op472 ret i32 %freeze473}474 475define i32 @freeze_noundef_llround(float %arg) {476; CHECK-LABEL: define i32 @freeze_noundef_llround(477; CHECK-SAME: float [[ARG:%.*]]) {478; CHECK-NEXT: [[OP:%.*]] = call noundef i32 @llvm.llround.i32.f32(float [[ARG]])479; CHECK-NEXT: ret i32 [[OP]]480;481 %op = call noundef i32 @llvm.llround.i32.f32(float %arg)482 %freeze = freeze i32 %op483 ret i32 %freeze484}485 486define i32 @freeze_noundef_lrint(float %arg) {487; CHECK-LABEL: define i32 @freeze_noundef_lrint(488; CHECK-SAME: float [[ARG:%.*]]) {489; CHECK-NEXT: [[OP:%.*]] = call noundef i32 @llvm.lrint.i32.f32(float [[ARG]])490; CHECK-NEXT: ret i32 [[OP]]491;492 %op = call noundef i32 @llvm.lrint.i32.f32(float %arg)493 %freeze = freeze i32 %op494 ret i32 %freeze495}496 497define i32 @freeze_noundef_llrint(float %arg) {498; CHECK-LABEL: define i32 @freeze_noundef_llrint(499; CHECK-SAME: float [[ARG:%.*]]) {500; CHECK-NEXT: [[OP:%.*]] = call noundef i32 @llvm.llrint.i32.f32(float [[ARG]])501; CHECK-NEXT: ret i32 [[OP]]502;503 %op = call noundef i32 @llvm.llrint.i32.f32(float %arg)504 %freeze = freeze i32 %op505 ret i32 %freeze506}507 508define float @freeze_minnum(float %arg0, float noundef %arg1) {509; CHECK-LABEL: define float @freeze_minnum(510; CHECK-SAME: float [[ARG0:%.*]], float noundef [[ARG1:%.*]]) {511; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]512; CHECK-NEXT: [[OP:%.*]] = call float @llvm.minnum.f32(float [[ARG0_FR]], float noundef [[ARG1]])513; CHECK-NEXT: ret float [[OP]]514;515 %op = call float @llvm.minnum.f32(float %arg0, float noundef %arg1)516 %freeze = freeze float %op517 ret float %freeze518}519 520define float @freeze_maxnum(float %arg0, float noundef %arg1) {521; CHECK-LABEL: define float @freeze_maxnum(522; CHECK-SAME: float [[ARG0:%.*]], float noundef [[ARG1:%.*]]) {523; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]524; CHECK-NEXT: [[OP:%.*]] = call float @llvm.maxnum.f32(float [[ARG0_FR]], float noundef [[ARG1]])525; CHECK-NEXT: ret float [[OP]]526;527 %op = call float @llvm.maxnum.f32(float %arg0, float noundef %arg1)528 %freeze = freeze float %op529 ret float %freeze530}531 532define float @freeze_minimum(float %arg0, float noundef %arg1) {533; CHECK-LABEL: define float @freeze_minimum(534; CHECK-SAME: float [[ARG0:%.*]], float noundef [[ARG1:%.*]]) {535; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]536; CHECK-NEXT: [[OP:%.*]] = call float @llvm.minimum.f32(float [[ARG0_FR]], float noundef [[ARG1]])537; CHECK-NEXT: ret float [[OP]]538;539 %op = call float @llvm.minimum.f32(float %arg0, float noundef %arg1)540 %freeze = freeze float %op541 ret float %freeze542}543 544define float @freeze_maximum(float %arg0, float noundef %arg1) {545; CHECK-LABEL: define float @freeze_maximum(546; CHECK-SAME: float [[ARG0:%.*]], float noundef [[ARG1:%.*]]) {547; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]548; CHECK-NEXT: [[OP:%.*]] = call float @llvm.maximum.f32(float [[ARG0_FR]], float noundef [[ARG1]])549; CHECK-NEXT: ret float [[OP]]550;551 %op = call float @llvm.maximum.f32(float %arg0, float noundef %arg1)552 %freeze = freeze float %op553 ret float %freeze554}555 556define float @freeze_minimumnum(float %arg0, float noundef %arg1) {557; CHECK-LABEL: define float @freeze_minimumnum(558; CHECK-SAME: float [[ARG0:%.*]], float noundef [[ARG1:%.*]]) {559; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]560; CHECK-NEXT: [[OP:%.*]] = call float @llvm.minimumnum.f32(float [[ARG0_FR]], float noundef [[ARG1]])561; CHECK-NEXT: ret float [[OP]]562;563 %op = call float @llvm.minimumnum.f32(float %arg0, float noundef %arg1)564 %freeze = freeze float %op565 ret float %freeze566}567 568define float @freeze_maximumnum(float %arg0, float noundef %arg1) {569; CHECK-LABEL: define float @freeze_maximumnum(570; CHECK-SAME: float [[ARG0:%.*]], float noundef [[ARG1:%.*]]) {571; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]572; CHECK-NEXT: [[OP:%.*]] = call float @llvm.maximumnum.f32(float [[ARG0_FR]], float noundef [[ARG1]])573; CHECK-NEXT: ret float [[OP]]574;575 %op = call float @llvm.maximumnum.f32(float %arg0, float noundef %arg1)576 %freeze = freeze float %op577 ret float %freeze578}579 580define i1 @freeze_isfpclass(float %arg0) {581; CHECK-LABEL: define i1 @freeze_isfpclass(582; CHECK-SAME: float [[ARG0:%.*]]) {583; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]584; CHECK-NEXT: [[OP:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG0_FR]], i32 27)585; CHECK-NEXT: ret i1 [[OP]]586;587 %op = call i1 @llvm.is.fpclass.f32(float %arg0, i32 27)588 %freeze = freeze i1 %op589 ret i1 %freeze590}591 592define float @freeze_fptrunc_round(double %arg0) {593; CHECK-LABEL: define float @freeze_fptrunc_round(594; CHECK-SAME: double [[ARG0:%.*]]) {595; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze double [[ARG0]]596; CHECK-NEXT: [[OP:%.*]] = call float @llvm.fptrunc.round.f32.f64(double [[ARG0_FR]], metadata !"round.downward")597; CHECK-NEXT: ret float [[OP]]598;599 %op = call float @llvm.fptrunc.round.f32.f64(double %arg0, metadata !"round.downward")600 %freeze = freeze float %op601 ret float %freeze602}603 604define float @freeze_ldexp(float %arg0, i32 noundef %arg1) {605; CHECK-LABEL: define float @freeze_ldexp(606; CHECK-SAME: float [[ARG0:%.*]], i32 noundef [[ARG1:%.*]]) {607; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]608; CHECK-NEXT: [[OP:%.*]] = call float @llvm.ldexp.f32.i32(float [[ARG0_FR]], i32 [[ARG1]])609; CHECK-NEXT: ret float [[OP]]610;611 %op = call float @llvm.ldexp.f32.i32(float %arg0, i32 %arg1)612 %freeze = freeze float %op613 ret float %freeze614}615 616define { float, i32 } @freeze_frexp(float %arg0) {617; CHECK-LABEL: define { float, i32 } @freeze_frexp(618; CHECK-SAME: float [[ARG0:%.*]]) {619; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]620; CHECK-NEXT: [[OP:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ARG0_FR]])621; CHECK-NEXT: ret { float, i32 } [[OP]]622;623 %op = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)624 %freeze = freeze { float, i32 } %op625 ret { float, i32 } %freeze626}627 628define float @freeze_frexp_0(float %arg0) {629; CHECK-LABEL: define float @freeze_frexp_0(630; CHECK-SAME: float [[ARG0:%.*]]) {631; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]632; CHECK-NEXT: [[OP:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ARG0_FR]])633; CHECK-NEXT: [[EXTRACT_0:%.*]] = extractvalue { float, i32 } [[OP]], 0634; CHECK-NEXT: ret float [[EXTRACT_0]]635;636 %op = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)637 %extract.0 = extractvalue { float, i32 } %op, 0638 %freeze = freeze float %extract.0639 ret float %freeze640}641 642define i32 @freeze_frexp_1(float %arg0) {643; CHECK-LABEL: define i32 @freeze_frexp_1(644; CHECK-SAME: float [[ARG0:%.*]]) {645; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]646; CHECK-NEXT: [[OP:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ARG0_FR]])647; CHECK-NEXT: [[EXTRACT_1:%.*]] = extractvalue { float, i32 } [[OP]], 1648; CHECK-NEXT: ret i32 [[EXTRACT_1]]649;650 %op = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)651 %extract.1 = extractvalue { float, i32 } %op, 1652 %freeze = freeze i32 %extract.1653 ret i32 %freeze654}655 656declare float @llvm.fma.f32(float, float, float)657declare float @llvm.fmuladd.f32(float, float, float)658declare float @llvm.sqrt.f32(float)659declare float @llvm.powi.f32.i32(float, i32)660declare float @llvm.sin.f32(float)661declare float @llvm.cos.f32(float)662declare float @llvm.pow.f32(float, float)663declare float @llvm.log.f32(float)664declare float @llvm.log10.f32(float)665declare float @llvm.log2.f32(float)666declare float @llvm.exp.f32(float)667declare float @llvm.exp2.f32(float)668declare float @llvm.exp10.f32(float)669declare float @llvm.fabs.f32(float)670declare float @llvm.copysign.f32(float, float)671declare float @llvm.floor.f32(float)672declare float @llvm.ceil.f32(float)673declare float @llvm.trunc.f32(float)674declare float @llvm.rint.f32(float)675declare float @llvm.nearbyint.f32(float)676declare float @llvm.round.f32(float)677declare float @llvm.roundeven.f32(float)678declare float @llvm.canonicalize.f32(float)679declare float @llvm.arithmetic.fence.f32(float)680declare i32 @llvm.lround.i32.f32(float)681declare i32 @llvm.llround.i32.f32(float)682declare i32 @llvm.lrint.i32.f32(float)683declare i32 @llvm.llrint.i32.f32(float)684declare float @llvm.minnum.f32(float, float)685declare float @llvm.maxnum.f32(float, float)686declare float @llvm.minimum.f32(float, float)687declare float @llvm.maximum.f32(float, float)688declare i1 @llvm.is.fpclass.f32(float, i32 immarg)689declare float @llvm.fptrunc.round.f32.f64(double, metadata)690declare float @llvm.ldexp.f32.i32(float, i32)691declare { float, i32 } @llvm.frexp.f32.i32(float)692