1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=instcombine < %s | FileCheck %s 3 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 %call 12 ret i32 %freeze 13} 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 %call 23 ret i32 %freeze 24} 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 %call 33 ret i32 %freeze 34} 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 %call 44 ret i32 %freeze 45} 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 %call 54 ret i32 %freeze 55} 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 %arg 64 %call = call i32 @llvm.cttz.i32(i32 %freeze, i1 true) 65 ret i32 %call 66} 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 %call 76 ret i32 %freeze 77} 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 %arg 86 %call = call i32 @llvm.cttz.i32(i32 %freeze, i1 false) 87 ret i32 %call 88} 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 %call 98 ret i32 %freeze 99} 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 %call 109 ret i32 %freeze 110} 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 %call 119 ret i32 %freeze 120} 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 %call 130 ret i32 %freeze 131} 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 %call 141 ret i32 %freeze 142} 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 %call 152 ret i32 %freeze 153} 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 %call 163 ret i32 %freeze 164} 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 %call 174 ret i32 %freeze 175} 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 %call 185 ret i32 %freeze 186} 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 %call 196 ret i32 %freeze 197} 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 %call 207 ret i32 %freeze 208} 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 %call 218 ret ptr %freeze 219} 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 %call 229 ret i32 %freeze 230} 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 %call 240 ret i32 %freeze 241} 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 %call 251 ret i32 %freeze 252} 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 %call 262 ret i32 %freeze 263} 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 %call 273 ret i32 %freeze 274} 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 %call 284 ret i32 %freeze 285} 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 %call 295 ret i32 %freeze 296} 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 %call 306 ret i32 %freeze 307} 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 %call 317 ret i32 %freeze 318} 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 %call 328 ret i32 %freeze 329} 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 %call 339 ret i32 %freeze 340} 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 %call 350 ret i32 %freeze 351} 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> %call 361 ret <2 x i32> %freeze 362} 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> %call 372 ret <2 x i32> %freeze 373} 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> %call 383 ret <2 x i32> %freeze 384} 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> %call 394 ret <2 x i32> %freeze 395} 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> %call 405 ret <vscale x 2 x i32> %freeze 406} 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> %call 416 ret <vscale x 2 x i32> %freeze 417} 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 %wc 426 ret i1 %freeze 427} 428 429declare i32 @llvm.ctlz.i32(i32, i1 immarg) 430declare i32 @llvm.cttz.i32(i32, i1 immarg) 431declare i32 @llvm.abs.i32(i32, i1 immarg) 432declare i32 @llvm.bswap.i32(i32) 433declare i32 @llvm.bitreverse.i32(i32) 434declare i32 @llvm.fshl.i32(i32, i32, i32) 435declare i32 @llvm.fshr.i32(i32, i32, i32) 436declare i32 @llvm.smax.i32(i32, i32) 437declare i32 @llvm.smin.i32(i32, i32) 438declare i32 @llvm.umax.i32(i32, i32) 439declare i32 @llvm.umin.i32(i32, i32) 440declare ptr @llvm.ptrmask.p0.i64(ptr, i64) 441declare i32 @llvm.fptoui.sat.i32.f32(float) 442declare i32 @llvm.fptosi.sat.i32.f32(float) 443declare i32 @llvm.sadd.sat.i32(i32, i32) 444declare i32 @llvm.uadd.sat.i32(i32, i32) 445declare i32 @llvm.ssub.sat.i32(i32, i32) 446declare i32 @llvm.usub.sat.i32(i32, i32) 447declare i32 @llvm.sshl.sat.i32(i32, i32) 448declare i32 @llvm.ushl.sat.i32(i32, i32) 449declare <2 x i32> @llvm.sshl.sat.v2i32(<2 x i32>, <2 x i32>) 450declare <2 x i32> @llvm.ushl.sat.v2i32(<2 x i32>, <2 x i32>) 451declare <vscale x 2 x i32> @llvm.sshl.sat.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>) 452declare <vscale x 2 x i32> @llvm.ushl.sat.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>) 453declare i1 @llvm.experimental.widenable.condition() 454