480 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=instcombine < %s | FileCheck %s3 4define i32 @ctlz_true_freeze(i32 %arg) {5; CHECK-LABEL: @ctlz_true_freeze(6; CHECK-NEXT: [[CALL:%.*]] = call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[ARG:%.*]], i1 true)7; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]]8; CHECK-NEXT: ret i32 [[FREEZE]]9;10 %call = call i32 @llvm.ctlz.i32(i32 %arg, i1 true)11 %freeze = freeze i32 %call12 ret i32 %freeze13}14 15define i32 @ctlz_false_freeze(i32 %arg) {16; CHECK-LABEL: @ctlz_false_freeze(17; CHECK-NEXT: [[ARG_FR:%.*]] = freeze i32 [[ARG:%.*]]18; CHECK-NEXT: [[CALL:%.*]] = call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[ARG_FR]], i1 false)19; CHECK-NEXT: ret i32 [[CALL]]20;21 %call = call i32 @llvm.ctlz.i32(i32 %arg, i1 false)22 %freeze = freeze i32 %call23 ret i32 %freeze24}25 26define i32 @ctlz_true_noundef_freeze(i32 %arg) {27; CHECK-LABEL: @ctlz_true_noundef_freeze(28; CHECK-NEXT: [[CALL:%.*]] = call noundef range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[ARG:%.*]], i1 true)29; CHECK-NEXT: ret i32 [[CALL]]30;31 %call = call noundef i32 @llvm.ctlz.i32(i32 %arg, i1 true)32 %freeze = freeze i32 %call33 ret i32 %freeze34}35 36define i32 @cttz_true_freeze(i32 %arg) {37; CHECK-LABEL: @cttz_true_freeze(38; CHECK-NEXT: [[CALL:%.*]] = call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[ARG:%.*]], i1 true)39; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]]40; CHECK-NEXT: ret i32 [[FREEZE]]41;42 %call = call i32 @llvm.cttz.i32(i32 %arg, i1 true)43 %freeze = freeze i32 %call44 ret i32 %freeze45}46 47define i32 @cttz_true_noundef_freeze(i32 %arg) {48; CHECK-LABEL: @cttz_true_noundef_freeze(49; CHECK-NEXT: [[CALL:%.*]] = call noundef range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[ARG:%.*]], i1 true)50; CHECK-NEXT: ret i32 [[CALL]]51;52 %call = call noundef i32 @llvm.cttz.i32(i32 %arg, i1 true)53 %freeze = freeze i32 %call54 ret i32 %freeze55}56 57define i32 @freeze_cttz_true(i32 %arg) {58; CHECK-LABEL: @freeze_cttz_true(59; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[ARG:%.*]]60; CHECK-NEXT: [[CALL:%.*]] = call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[FREEZE]], i1 true)61; CHECK-NEXT: ret i32 [[CALL]]62;63 %freeze = freeze i32 %arg64 %call = call i32 @llvm.cttz.i32(i32 %freeze, i1 true)65 ret i32 %call66}67 68define i32 @cttz_false_freeze(i32 %arg) {69; CHECK-LABEL: @cttz_false_freeze(70; CHECK-NEXT: [[ARG_FR:%.*]] = freeze i32 [[ARG:%.*]]71; CHECK-NEXT: [[CALL:%.*]] = call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[ARG_FR]], i1 false)72; CHECK-NEXT: ret i32 [[CALL]]73;74 %call = call i32 @llvm.cttz.i32(i32 %arg, i1 false)75 %freeze = freeze i32 %call76 ret i32 %freeze77}78 79define i32 @freeze_cttz_false(i32 %arg) {80; CHECK-LABEL: @freeze_cttz_false(81; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[ARG:%.*]]82; CHECK-NEXT: [[CALL:%.*]] = call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[FREEZE]], i1 false)83; CHECK-NEXT: ret i32 [[CALL]]84;85 %freeze = freeze i32 %arg86 %call = call i32 @llvm.cttz.i32(i32 %freeze, i1 false)87 ret i32 %call88}89 90define i32 @abs_true_i32(i32 %arg) {91; CHECK-LABEL: @abs_true_i32(92; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.abs.i32(i32 [[ARG:%.*]], i1 true)93; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]]94; CHECK-NEXT: ret i32 [[FREEZE]]95;96 %call = call i32 @llvm.abs.i32(i32 %arg, i1 true)97 %freeze = freeze i32 %call98 ret i32 %freeze99}100 101define i32 @abs_false_i32(i32 %arg) {102; CHECK-LABEL: @abs_false_i32(103; CHECK-NEXT: [[ARG_FR:%.*]] = freeze i32 [[ARG:%.*]]104; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.abs.i32(i32 [[ARG_FR]], i1 false)105; CHECK-NEXT: ret i32 [[CALL]]106;107 %call = call i32 @llvm.abs.i32(i32 %arg, i1 false)108 %freeze = freeze i32 %call109 ret i32 %freeze110}111 112define i32 @noundef_abs_true_i32(i32 %arg) {113; CHECK-LABEL: @noundef_abs_true_i32(114; CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @llvm.abs.i32(i32 [[ARG:%.*]], i1 true)115; CHECK-NEXT: ret i32 [[CALL]]116;117 %call = call noundef i32 @llvm.abs.i32(i32 %arg, i1 true)118 %freeze = freeze i32 %call119 ret i32 %freeze120}121 122define i32 @bswap_i32(i32 %arg) {123; CHECK-LABEL: @bswap_i32(124; CHECK-NEXT: [[ARG_FR:%.*]] = freeze i32 [[ARG:%.*]]125; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.bswap.i32(i32 [[ARG_FR]])126; CHECK-NEXT: ret i32 [[CALL]]127;128 %call = call i32 @llvm.bswap.i32(i32 %arg)129 %freeze = freeze i32 %call130 ret i32 %freeze131}132 133define i32 @bitreverse_i32(i32 %arg) {134; CHECK-LABEL: @bitreverse_i32(135; CHECK-NEXT: [[ARG_FR:%.*]] = freeze i32 [[ARG:%.*]]136; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[ARG_FR]])137; CHECK-NEXT: ret i32 [[CALL]]138;139 %call = call i32 @llvm.bitreverse.i32(i32 %arg)140 %freeze = freeze i32 %call141 ret i32 %freeze142}143 144define i32 @fshl_i32(i32 %arg0, i32 noundef %arg1, i32 noundef %arg2) {145; CHECK-LABEL: @fshl_i32(146; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]147; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.fshl.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]], i32 [[ARG2:%.*]])148; CHECK-NEXT: ret i32 [[CALL]]149;150 %call = call i32 @llvm.fshl.i32(i32 %arg0, i32 %arg1, i32 %arg2)151 %freeze = freeze i32 %call152 ret i32 %freeze153}154 155define i32 @fshr_i32(i32 %arg0, i32 noundef %arg1, i32 noundef %arg2) {156; CHECK-LABEL: @fshr_i32(157; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]158; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.fshr.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]], i32 [[ARG2:%.*]])159; CHECK-NEXT: ret i32 [[CALL]]160;161 %call = call i32 @llvm.fshr.i32(i32 %arg0, i32 %arg1, i32 %arg2)162 %freeze = freeze i32 %call163 ret i32 %freeze164}165 166define i32 @smax_i32(i32 %arg0, i32 noundef %arg1) {167; CHECK-LABEL: @smax_i32(168; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]169; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.smax.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])170; CHECK-NEXT: ret i32 [[CALL]]171;172 %call = call i32 @llvm.smax.i32(i32 %arg0, i32 %arg1)173 %freeze = freeze i32 %call174 ret i32 %freeze175}176 177define i32 @smin_i32(i32 %arg0, i32 noundef %arg1) {178; CHECK-LABEL: @smin_i32(179; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]180; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.smin.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])181; CHECK-NEXT: ret i32 [[CALL]]182;183 %call = call i32 @llvm.smin.i32(i32 %arg0, i32 %arg1)184 %freeze = freeze i32 %call185 ret i32 %freeze186}187 188define i32 @umax_i32(i32 %arg0, i32 noundef %arg1) {189; CHECK-LABEL: @umax_i32(190; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]191; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.umax.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])192; CHECK-NEXT: ret i32 [[CALL]]193;194 %call = call i32 @llvm.umax.i32(i32 %arg0, i32 %arg1)195 %freeze = freeze i32 %call196 ret i32 %freeze197}198 199define i32 @umin_i32(i32 %arg0, i32 noundef %arg1) {200; CHECK-LABEL: @umin_i32(201; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]202; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.umin.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])203; CHECK-NEXT: ret i32 [[CALL]]204;205 %call = call i32 @llvm.umin.i32(i32 %arg0, i32 %arg1)206 %freeze = freeze i32 %call207 ret i32 %freeze208}209 210define ptr @ptrmask_p0(ptr %arg0, i64 noundef %arg1) {211; CHECK-LABEL: @ptrmask_p0(212; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze ptr [[ARG0:%.*]]213; CHECK-NEXT: [[CALL:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[ARG0_FR]], i64 [[ARG1:%.*]])214; CHECK-NEXT: ret ptr [[CALL]]215;216 %call = call ptr @llvm.ptrmask.p0.i64(ptr %arg0, i64 %arg1)217 %freeze = freeze ptr %call218 ret ptr %freeze219}220 221define i32 @fptoui_sat(float %arg) {222; CHECK-LABEL: @fptoui_sat(223; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]224; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.fptoui.sat.i32.f32(float [[ARG_FR]])225; CHECK-NEXT: ret i32 [[CALL]]226;227 %call = call i32 @llvm.fptoui.sat.i32.f32(float %arg)228 %freeze = freeze i32 %call229 ret i32 %freeze230}231 232define i32 @fptosi_sat(float %arg) {233; CHECK-LABEL: @fptosi_sat(234; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]]235; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.fptosi.sat.i32.f32(float [[ARG_FR]])236; CHECK-NEXT: ret i32 [[CALL]]237;238 %call = call i32 @llvm.fptosi.sat.i32.f32(float %arg)239 %freeze = freeze i32 %call240 ret i32 %freeze241}242 243define i32 @sadd_sat_i32(i32 %arg0, i32 noundef %arg1) {244; CHECK-LABEL: @sadd_sat_i32(245; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]246; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.sadd.sat.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])247; CHECK-NEXT: ret i32 [[CALL]]248;249 %call = call i32 @llvm.sadd.sat.i32(i32 %arg0, i32 %arg1)250 %freeze = freeze i32 %call251 ret i32 %freeze252}253 254define i32 @uadd_sat_i32(i32 %arg0, i32 noundef %arg1) {255; CHECK-LABEL: @uadd_sat_i32(256; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]257; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.uadd.sat.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])258; CHECK-NEXT: ret i32 [[CALL]]259;260 %call = call i32 @llvm.uadd.sat.i32(i32 %arg0, i32 %arg1)261 %freeze = freeze i32 %call262 ret i32 %freeze263}264 265define i32 @ssub_sat_i32(i32 %arg0, i32 noundef %arg1) {266; CHECK-LABEL: @ssub_sat_i32(267; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]268; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.ssub.sat.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])269; CHECK-NEXT: ret i32 [[CALL]]270;271 %call = call i32 @llvm.ssub.sat.i32(i32 %arg0, i32 %arg1)272 %freeze = freeze i32 %call273 ret i32 %freeze274}275 276define i32 @usub_sat_i32(i32 %arg0, i32 noundef %arg1) {277; CHECK-LABEL: @usub_sat_i32(278; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]279; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])280; CHECK-NEXT: ret i32 [[CALL]]281;282 %call = call i32 @llvm.usub.sat.i32(i32 %arg0, i32 %arg1)283 %freeze = freeze i32 %call284 ret i32 %freeze285}286 287define i32 @sshl_sat_i32(i32 %arg0, i32 noundef %arg1) {288; CHECK-LABEL: @sshl_sat_i32(289; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.sshl.sat.i32(i32 [[ARG0:%.*]], i32 [[ARG1:%.*]])290; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]]291; CHECK-NEXT: ret i32 [[FREEZE]]292;293 %call = call i32 @llvm.sshl.sat.i32(i32 %arg0, i32 %arg1)294 %freeze = freeze i32 %call295 ret i32 %freeze296}297 298define i32 @ushl_sat_i32(i32 %arg0, i32 noundef %arg1) {299; CHECK-LABEL: @ushl_sat_i32(300; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.ushl.sat.i32(i32 [[ARG0:%.*]], i32 [[ARG1:%.*]])301; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]]302; CHECK-NEXT: ret i32 [[FREEZE]]303;304 %call = call i32 @llvm.ushl.sat.i32(i32 %arg0, i32 %arg1)305 %freeze = freeze i32 %call306 ret i32 %freeze307}308 309define i32 @sshl_sat_i32_safe_constant(i32 %arg0) {310; CHECK-LABEL: @sshl_sat_i32_safe_constant(311; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]312; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.sshl.sat.i32(i32 [[ARG0_FR]], i32 8)313; CHECK-NEXT: ret i32 [[CALL]]314;315 %call = call i32 @llvm.sshl.sat.i32(i32 %arg0, i32 8)316 %freeze = freeze i32 %call317 ret i32 %freeze318}319 320define i32 @ushl_sat_i32_safe_constant(i32 %arg0) {321; CHECK-LABEL: @ushl_sat_i32_safe_constant(322; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]323; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.ushl.sat.i32(i32 [[ARG0_FR]], i32 8)324; CHECK-NEXT: ret i32 [[CALL]]325;326 %call = call i32 @llvm.ushl.sat.i32(i32 %arg0, i32 8)327 %freeze = freeze i32 %call328 ret i32 %freeze329}330 331define i32 @sshl_sat_i32_unsafe_constant(i32 %arg0) {332; CHECK-LABEL: @sshl_sat_i32_unsafe_constant(333; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.sshl.sat.i32(i32 [[ARG0:%.*]], i32 32)334; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]]335; CHECK-NEXT: ret i32 [[FREEZE]]336;337 %call = call i32 @llvm.sshl.sat.i32(i32 %arg0, i32 32)338 %freeze = freeze i32 %call339 ret i32 %freeze340}341 342define i32 @ushl_sat_i32_unsafe_constant(i32 %arg0) {343; CHECK-LABEL: @ushl_sat_i32_unsafe_constant(344; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.ushl.sat.i32(i32 [[ARG0:%.*]], i32 32)345; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]]346; CHECK-NEXT: ret i32 [[FREEZE]]347;348 %call = call i32 @llvm.ushl.sat.i32(i32 %arg0, i32 32)349 %freeze = freeze i32 %call350 ret i32 %freeze351}352 353define <2 x i32> @sshl_sat_v2i32_safe_constant(<2 x i32> %arg0) {354; CHECK-LABEL: @sshl_sat_v2i32_safe_constant(355; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze <2 x i32> [[ARG0:%.*]]356; CHECK-NEXT: [[CALL:%.*]] = call <2 x i32> @llvm.sshl.sat.v2i32(<2 x i32> [[ARG0_FR]], <2 x i32> <i32 8, i32 9>)357; CHECK-NEXT: ret <2 x i32> [[CALL]]358;359 %call = call <2 x i32> @llvm.sshl.sat.v2i32(<2 x i32> %arg0, <2 x i32> <i32 8, i32 9>)360 %freeze = freeze <2 x i32> %call361 ret <2 x i32> %freeze362}363 364define <2 x i32> @ushl_sat_v2i32_safe_constant_vector(<2 x i32> %arg0) {365; CHECK-LABEL: @ushl_sat_v2i32_safe_constant_vector(366; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze <2 x i32> [[ARG0:%.*]]367; CHECK-NEXT: [[CALL:%.*]] = call <2 x i32> @llvm.ushl.sat.v2i32(<2 x i32> [[ARG0_FR]], <2 x i32> <i32 8, i32 9>)368; CHECK-NEXT: ret <2 x i32> [[CALL]]369;370 %call = call <2 x i32> @llvm.ushl.sat.v2i32(<2 x i32> %arg0, <2 x i32> <i32 8, i32 9>)371 %freeze = freeze <2 x i32> %call372 ret <2 x i32> %freeze373}374 375define <2 x i32> @ushl_sat_v2i32_unsafe_constant_vector(<2 x i32> %arg0) {376; CHECK-LABEL: @ushl_sat_v2i32_unsafe_constant_vector(377; CHECK-NEXT: [[CALL:%.*]] = call <2 x i32> @llvm.ushl.sat.v2i32(<2 x i32> [[ARG0:%.*]], <2 x i32> <i32 undef, i32 9>)378; CHECK-NEXT: [[FREEZE:%.*]] = freeze <2 x i32> [[CALL]]379; CHECK-NEXT: ret <2 x i32> [[FREEZE]]380;381 %call = call <2 x i32> @llvm.ushl.sat.v2i32(<2 x i32> %arg0, <2 x i32> <i32 undef, i32 9>)382 %freeze = freeze <2 x i32> %call383 ret <2 x i32> %freeze384}385 386define <2 x i32> @sshl_sat_v2i32_unsafe_constant_vector(<2 x i32> %arg0) {387; CHECK-LABEL: @sshl_sat_v2i32_unsafe_constant_vector(388; CHECK-NEXT: [[CALL:%.*]] = call <2 x i32> @llvm.sshl.sat.v2i32(<2 x i32> [[ARG0:%.*]], <2 x i32> <i32 undef, i32 9>)389; CHECK-NEXT: [[FREEZE:%.*]] = freeze <2 x i32> [[CALL]]390; CHECK-NEXT: ret <2 x i32> [[FREEZE]]391;392 %call = call <2 x i32> @llvm.sshl.sat.v2i32(<2 x i32> %arg0, <2 x i32> <i32 undef, i32 9>)393 %freeze = freeze <2 x i32> %call394 ret <2 x i32> %freeze395}396 397define <vscale x 2 x i32> @ushl_sat_v2i32_scalable_zeroinitializer(<vscale x 2 x i32> %arg0) {398; CHECK-LABEL: @ushl_sat_v2i32_scalable_zeroinitializer(399; CHECK-NEXT: [[CALL:%.*]] = call <vscale x 2 x i32> @llvm.ushl.sat.nxv2i32(<vscale x 2 x i32> [[ARG0:%.*]], <vscale x 2 x i32> zeroinitializer)400; CHECK-NEXT: [[FREEZE:%.*]] = freeze <vscale x 2 x i32> [[CALL]]401; CHECK-NEXT: ret <vscale x 2 x i32> [[FREEZE]]402;403 %call = call <vscale x 2 x i32> @llvm.ushl.sat.nxv2i32(<vscale x 2 x i32> %arg0, <vscale x 2 x i32> zeroinitializer)404 %freeze = freeze <vscale x 2 x i32> %call405 ret <vscale x 2 x i32> %freeze406}407 408define <vscale x 2 x i32> @sshl_sat_v2i32_scalable_zeroinitializer(<vscale x 2 x i32> %arg0) {409; CHECK-LABEL: @sshl_sat_v2i32_scalable_zeroinitializer(410; CHECK-NEXT: [[CALL:%.*]] = call <vscale x 2 x i32> @llvm.sshl.sat.nxv2i32(<vscale x 2 x i32> [[ARG0:%.*]], <vscale x 2 x i32> zeroinitializer)411; CHECK-NEXT: [[FREEZE:%.*]] = freeze <vscale x 2 x i32> [[CALL]]412; CHECK-NEXT: ret <vscale x 2 x i32> [[FREEZE]]413;414 %call = call <vscale x 2 x i32> @llvm.sshl.sat.nxv2i32(<vscale x 2 x i32> %arg0, <vscale x 2 x i32> zeroinitializer)415 %freeze = freeze <vscale x 2 x i32> %call416 ret <vscale x 2 x i32> %freeze417}418 419define i1 @widenable_condition() {420; CHECK-LABEL: @widenable_condition(421; CHECK-NEXT: [[WC:%.*]] = call i1 @llvm.experimental.widenable.condition()422; CHECK-NEXT: ret i1 [[WC]]423;424 %wc = call i1 @llvm.experimental.widenable.condition()425 %freeze = freeze i1 %wc426 ret i1 %freeze427}428 429define i32 @freeze_scmp(i32 %a0) {430; CHECK-LABEL: @freeze_scmp(431; CHECK-NEXT: [[A0_FR:%.*]] = freeze i32 [[A0:%.*]]432; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.scmp.i32.i32(i32 2, i32 [[A0_FR]])433; CHECK-NEXT: [[Z:%.*]] = call i32 @llvm.scmp.i32.i32(i32 0, i32 [[X]])434; CHECK-NEXT: ret i32 [[Z]]435;436 %x = call i32 @llvm.scmp.i32(i32 2, i32 %a0)437 %y = freeze i32 %x438 %z = call i32 @llvm.scmp.i32(i32 0, i32 %y)439 ret i32 %z440}441 442define i32 @freeze_ucmp(i32 %a0) {443; CHECK-LABEL: @freeze_ucmp(444; CHECK-NEXT: [[A0_FR:%.*]] = freeze i32 [[A0:%.*]]445; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.ucmp.i32.i32(i32 2, i32 [[A0_FR]])446; CHECK-NEXT: [[Z:%.*]] = call i32 @llvm.ucmp.i32.i32(i32 [[X]], i32 1)447; CHECK-NEXT: ret i32 [[Z]]448;449 %x = call i32 @llvm.ucmp.i32(i32 2, i32 %a0)450 %y = freeze i32 %x451 %z = call i32 @llvm.ucmp.i32(i32 %y, i32 1)452 ret i32 %z453}454 455declare i32 @llvm.ctlz.i32(i32, i1 immarg)456declare i32 @llvm.cttz.i32(i32, i1 immarg)457declare i32 @llvm.abs.i32(i32, i1 immarg)458declare i32 @llvm.bswap.i32(i32)459declare i32 @llvm.bitreverse.i32(i32)460declare i32 @llvm.fshl.i32(i32, i32, i32)461declare i32 @llvm.fshr.i32(i32, i32, i32)462declare i32 @llvm.smax.i32(i32, i32)463declare i32 @llvm.smin.i32(i32, i32)464declare i32 @llvm.umax.i32(i32, i32)465declare i32 @llvm.umin.i32(i32, i32)466declare ptr @llvm.ptrmask.p0.i64(ptr, i64)467declare i32 @llvm.fptoui.sat.i32.f32(float)468declare i32 @llvm.fptosi.sat.i32.f32(float)469declare i32 @llvm.sadd.sat.i32(i32, i32)470declare i32 @llvm.uadd.sat.i32(i32, i32)471declare i32 @llvm.ssub.sat.i32(i32, i32)472declare i32 @llvm.usub.sat.i32(i32, i32)473declare i32 @llvm.sshl.sat.i32(i32, i32)474declare i32 @llvm.ushl.sat.i32(i32, i32)475declare <2 x i32> @llvm.sshl.sat.v2i32(<2 x i32>, <2 x i32>)476declare <2 x i32> @llvm.ushl.sat.v2i32(<2 x i32>, <2 x i32>)477declare <vscale x 2 x i32> @llvm.sshl.sat.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>)478declare <vscale x 2 x i32> @llvm.ushl.sat.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>)479declare i1 @llvm.experimental.widenable.condition()480