593 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-linux-gnu -O3 -ppc-asm-full-reg-names -verify-machineinstrs < %s | FileCheck %s3 4; Test cases are generated from:5; long long NAME(PARAM a, PARAM b) {6; if (LHS > RHS)7; return b;8; if (LHS < RHS)9; return a;\10; return a * b;11; }12; Please note funtion name is defined as <PARAM>_<LHS>_<RHS>. Take ll_a_op_b__113; for example. ll is PARAM, a_op_b (i.e., a << b) is LHS, _1 (i.e., -1) is RHS.14 15target datalayout = "e-m:e-i64:64-n32:64"16 17define i64 @ll_a_op_b__2(i64 %a, i64 %b) {18; CHECK-LABEL: ll_a_op_b__2:19; CHECK: # %bb.0: # %entry20; CHECK-NEXT: sld r5, r3, r421; CHECK-NEXT: cmpdi r5, -222; CHECK-NEXT: ble cr0, .LBB0_223; CHECK-NEXT: # %bb.1: # %return24; CHECK-NEXT: mr r3, r425; CHECK-NEXT: blr26; CHECK-NEXT: .LBB0_2: # %if.end27; CHECK-NEXT: li r5, 128; CHECK-NEXT: isellt r4, r5, r429; CHECK-NEXT: mulld r3, r4, r330; CHECK-NEXT: blr31entry:32 %shl = shl i64 %a, %b33 %cmp = icmp sgt i64 %shl, -234 br i1 %cmp, label %return, label %if.end35 36if.end: ; preds = %entry37 %cmp2 = icmp eq i64 %shl, -238 %mul = select i1 %cmp2, i64 %b, i64 139 %spec.select = mul nsw i64 %mul, %a40 ret i64 %spec.select41 42return: ; preds = %entry43 ret i64 %b44}45 46define i64 @ll_a_op_b__1(i64 %a, i64 %b) {47; CHECK-LABEL: ll_a_op_b__1:48; CHECK: # %bb.0: # %entry49; CHECK-NEXT: sld r5, r3, r450; CHECK-NEXT: cmpdi r5, -151; CHECK-NEXT: ble cr0, .LBB1_252; CHECK-NEXT: # %bb.1: # %return53; CHECK-NEXT: mr r3, r454; CHECK-NEXT: blr55; CHECK-NEXT: .LBB1_2: # %if.end56; CHECK-NEXT: li r5, 157; CHECK-NEXT: isellt r4, r5, r458; CHECK-NEXT: mulld r3, r4, r359; CHECK-NEXT: blr60entry:61 %shl = shl i64 %a, %b62 %cmp = icmp sgt i64 %shl, -163 br i1 %cmp, label %return, label %if.end64 65if.end: ; preds = %entry66 %cmp2 = icmp eq i64 %shl, -167 %mul = select i1 %cmp2, i64 %b, i64 168 %spec.select = mul nsw i64 %mul, %a69 ret i64 %spec.select70 71return: ; preds = %entry72 ret i64 %b73}74 75define i64 @ll_a_op_b_0(i64 %a, i64 %b) {76; CHECK-LABEL: ll_a_op_b_0:77; CHECK: # %bb.0: # %entry78; CHECK-NEXT: sld. r5, r3, r479; CHECK-NEXT: ble cr0, .LBB2_280; CHECK-NEXT: # %bb.1: # %return81; CHECK-NEXT: mr r3, r482; CHECK-NEXT: blr83; CHECK-NEXT: .LBB2_2: # %if.end84; CHECK-NEXT: li r5, 185; CHECK-NEXT: isellt r4, r5, r486; CHECK-NEXT: mulld r3, r4, r387; CHECK-NEXT: blr88entry:89 %shl = shl i64 %a, %b90 %cmp = icmp sgt i64 %shl, 091 br i1 %cmp, label %return, label %if.end92 93if.end: ; preds = %entry94 %cmp2 = icmp eq i64 %shl, 095 %mul = select i1 %cmp2, i64 %b, i64 196 %spec.select = mul nsw i64 %mul, %a97 ret i64 %spec.select98 99return: ; preds = %entry100 ret i64 %b101}102 103define i64 @ll_a_op_b_1(i64 %a, i64 %b) {104; CHECK-LABEL: ll_a_op_b_1:105; CHECK: # %bb.0: # %entry106; CHECK-NEXT: sld r5, r3, r4107; CHECK-NEXT: cmpdi r5, 1108; CHECK-NEXT: ble cr0, .LBB3_2109; CHECK-NEXT: # %bb.1: # %return110; CHECK-NEXT: mr r3, r4111; CHECK-NEXT: blr112; CHECK-NEXT: .LBB3_2: # %if.end113; CHECK-NEXT: li r5, 1114; CHECK-NEXT: isellt r4, r5, r4115; CHECK-NEXT: mulld r3, r4, r3116; CHECK-NEXT: blr117entry:118 %shl = shl i64 %a, %b119 %cmp = icmp sgt i64 %shl, 1120 br i1 %cmp, label %return, label %if.end121 122if.end: ; preds = %entry123 %cmp2 = icmp eq i64 %shl, 1124 %mul = select i1 %cmp2, i64 %b, i64 1125 %spec.select = mul nsw i64 %mul, %a126 ret i64 %spec.select127 128return: ; preds = %entry129 ret i64 %b130}131 132define i64 @ll_a_op_b_2(i64 %a, i64 %b) {133; CHECK-LABEL: ll_a_op_b_2:134; CHECK: # %bb.0: # %entry135; CHECK-NEXT: sld r5, r3, r4136; CHECK-NEXT: cmpdi r5, 2137; CHECK-NEXT: ble cr0, .LBB4_2138; CHECK-NEXT: # %bb.1: # %return139; CHECK-NEXT: mr r3, r4140; CHECK-NEXT: blr141; CHECK-NEXT: .LBB4_2: # %if.end142; CHECK-NEXT: li r5, 1143; CHECK-NEXT: isellt r4, r5, r4144; CHECK-NEXT: mulld r3, r4, r3145; CHECK-NEXT: blr146entry:147 %shl = shl i64 %a, %b148 %cmp = icmp sgt i64 %shl, 2149 br i1 %cmp, label %return, label %if.end150 151if.end: ; preds = %entry152 %cmp2 = icmp eq i64 %shl, 2153 %mul = select i1 %cmp2, i64 %b, i64 1154 %spec.select = mul nsw i64 %mul, %a155 ret i64 %spec.select156 157return: ; preds = %entry158 ret i64 %b159}160 161define i64 @ll_a__2(i64 %a, i64 %b) {162; CHECK-LABEL: ll_a__2:163; CHECK: # %bb.0: # %entry164; CHECK-NEXT: cmpdi r3, -2165; CHECK-NEXT: ble cr0, .LBB5_2166; CHECK-NEXT: # %bb.1: # %return167; CHECK-NEXT: mr r3, r4168; CHECK-NEXT: blr169; CHECK-NEXT: .LBB5_2: # %if.end170; CHECK-NEXT: li r5, 1171; CHECK-NEXT: isellt r4, r5, r4172; CHECK-NEXT: mulld r3, r4, r3173; CHECK-NEXT: blr174entry:175 %cmp = icmp sgt i64 %a, -2176 br i1 %cmp, label %return, label %if.end177 178if.end: ; preds = %entry179 %cmp1 = icmp eq i64 %a, -2180 %mul = select i1 %cmp1, i64 %b, i64 1181 %spec.select = mul nsw i64 %mul, %a182 ret i64 %spec.select183 184return: ; preds = %entry185 ret i64 %b186}187 188define i64 @ll_a__1(i64 %a, i64 %b) {189; CHECK-LABEL: ll_a__1:190; CHECK: # %bb.0: # %entry191; CHECK-NEXT: cmpdi r3, -1192; CHECK-NEXT: ble cr0, .LBB6_2193; CHECK-NEXT: # %bb.1: # %return194; CHECK-NEXT: mr r3, r4195; CHECK-NEXT: blr196; CHECK-NEXT: .LBB6_2: # %if.end197; CHECK-NEXT: li r5, 1198; CHECK-NEXT: isellt r4, r5, r4199; CHECK-NEXT: mulld r3, r4, r3200; CHECK-NEXT: blr201entry:202 %cmp = icmp sgt i64 %a, -1203 br i1 %cmp, label %return, label %if.end204 205if.end: ; preds = %entry206 %cmp1 = icmp eq i64 %a, -1207 %mul = select i1 %cmp1, i64 %b, i64 1208 %spec.select = mul nsw i64 %mul, %a209 ret i64 %spec.select210 211return: ; preds = %entry212 ret i64 %b213}214 215define i64 @ll_a_0(i64 %a, i64 %b) {216; CHECK-LABEL: ll_a_0:217; CHECK: # %bb.0: # %entry218; CHECK-NEXT: cmpdi r3, 0219; CHECK-NEXT: ble cr0, .LBB7_2220; CHECK-NEXT: # %bb.1: # %return221; CHECK-NEXT: mr r3, r4222; CHECK-NEXT: blr223; CHECK-NEXT: .LBB7_2: # %if.end224; CHECK-NEXT: li r5, 1225; CHECK-NEXT: isellt r4, r5, r4226; CHECK-NEXT: mulld r3, r4, r3227; CHECK-NEXT: blr228entry:229 %cmp = icmp sgt i64 %a, 0230 br i1 %cmp, label %return, label %if.end231 232if.end: ; preds = %entry233 %cmp1 = icmp eq i64 %a, 0234 %mul = select i1 %cmp1, i64 %b, i64 1235 %spec.select = mul nsw i64 %mul, %a236 ret i64 %spec.select237 238return: ; preds = %entry239 ret i64 %b240}241 242define i64 @ll_a_1(i64 %a, i64 %b) {243; CHECK-LABEL: ll_a_1:244; CHECK: # %bb.0: # %entry245; CHECK-NEXT: cmpdi r3, 1246; CHECK-NEXT: ble cr0, .LBB8_2247; CHECK-NEXT: # %bb.1: # %return248; CHECK-NEXT: mr r3, r4249; CHECK-NEXT: blr250; CHECK-NEXT: .LBB8_2: # %if.end251; CHECK-NEXT: li r5, 1252; CHECK-NEXT: isellt r4, r5, r4253; CHECK-NEXT: mulld r3, r4, r3254; CHECK-NEXT: blr255entry:256 %cmp = icmp sgt i64 %a, 1257 br i1 %cmp, label %return, label %if.end258 259if.end: ; preds = %entry260 %cmp1 = icmp eq i64 %a, 1261 %mul = select i1 %cmp1, i64 %b, i64 1262 %spec.select = mul nsw i64 %mul, %a263 ret i64 %spec.select264 265return: ; preds = %entry266 ret i64 %b267}268 269define i64 @ll_a_2(i64 %a, i64 %b) {270; CHECK-LABEL: ll_a_2:271; CHECK: # %bb.0: # %entry272; CHECK-NEXT: cmpdi r3, 2273; CHECK-NEXT: ble cr0, .LBB9_2274; CHECK-NEXT: # %bb.1: # %return275; CHECK-NEXT: mr r3, r4276; CHECK-NEXT: blr277; CHECK-NEXT: .LBB9_2: # %if.end278; CHECK-NEXT: li r5, 1279; CHECK-NEXT: isellt r4, r5, r4280; CHECK-NEXT: mulld r3, r4, r3281; CHECK-NEXT: blr282entry:283 %cmp = icmp sgt i64 %a, 2284 br i1 %cmp, label %return, label %if.end285 286if.end: ; preds = %entry287 %cmp1 = icmp eq i64 %a, 2288 %mul = select i1 %cmp1, i64 %b, i64 1289 %spec.select = mul nsw i64 %mul, %a290 ret i64 %spec.select291 292return: ; preds = %entry293 ret i64 %b294}295 296define i64 @i_a_op_b__2(i32 signext %a, i32 signext %b) {297; CHECK-LABEL: i_a_op_b__2:298; CHECK: # %bb.0: # %entry299; CHECK-NEXT: slw r5, r3, r4300; CHECK-NEXT: cmpwi r5, -2301; CHECK-NEXT: bgt cr0, .LBB10_2302; CHECK-NEXT: # %bb.1: # %if.end303; CHECK-NEXT: li r5, 1304; CHECK-NEXT: isellt r4, r5, r4305; CHECK-NEXT: mullw r4, r4, r3306; CHECK-NEXT: .LBB10_2: # %return307; CHECK-NEXT: extsw r3, r4308; CHECK-NEXT: blr309entry:310 %shl = shl i32 %a, %b311 %cmp = icmp sgt i32 %shl, -2312 br i1 %cmp, label %return, label %if.end313 314if.end: ; preds = %entry315 %cmp2 = icmp eq i32 %shl, -2316 %mul = select i1 %cmp2, i32 %b, i32 1317 %spec.select = mul nsw i32 %mul, %a318 br label %return319 320return: ; preds = %if.end, %entry321 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ]322 %retval.0 = sext i32 %retval.0.in to i64323 ret i64 %retval.0324}325 326define i64 @i_a_op_b__1(i32 signext %a, i32 signext %b) {327; CHECK-LABEL: i_a_op_b__1:328; CHECK: # %bb.0: # %entry329; CHECK-NEXT: slw r5, r3, r4330; CHECK-NEXT: cmpwi r5, -1331; CHECK-NEXT: ble cr0, .LBB11_2332; CHECK-NEXT: # %bb.1: # %return333; CHECK-NEXT: extsw r3, r4334; CHECK-NEXT: blr335; CHECK-NEXT: .LBB11_2: # %if.end336; CHECK-NEXT: li r5, 1337; CHECK-NEXT: isellt r4, r5, r4338; CHECK-NEXT: mullw r4, r4, r3339; CHECK-NEXT: extsw r3, r4340; CHECK-NEXT: blr341entry:342 %shl = shl i32 %a, %b343 %cmp = icmp sgt i32 %shl, -1344 br i1 %cmp, label %return, label %if.end345 346if.end: ; preds = %entry347 %cmp2 = icmp eq i32 %shl, -1348 %mul = select i1 %cmp2, i32 %b, i32 1349 %spec.select = mul nsw i32 %mul, %a350 br label %return351 352return: ; preds = %if.end, %entry353 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ]354 %retval.0 = sext i32 %retval.0.in to i64355 ret i64 %retval.0356}357 358define i64 @i_a_op_b_0(i32 signext %a, i32 signext %b) {359; CHECK-LABEL: i_a_op_b_0:360; CHECK: # %bb.0: # %entry361; CHECK-NEXT: slw r5, r3, r4362; CHECK-NEXT: cmpwi r5, 0363; CHECK-NEXT: ble cr0, .LBB12_2364; CHECK-NEXT: # %bb.1: # %return365; CHECK-NEXT: extsw r3, r4366; CHECK-NEXT: blr367; CHECK-NEXT: .LBB12_2: # %if.end368; CHECK-NEXT: li r5, 1369; CHECK-NEXT: isellt r4, r5, r4370; CHECK-NEXT: mullw r4, r4, r3371; CHECK-NEXT: extsw r3, r4372; CHECK-NEXT: blr373entry:374 %shl = shl i32 %a, %b375 %cmp = icmp sgt i32 %shl, 0376 br i1 %cmp, label %return, label %if.end377 378if.end: ; preds = %entry379 %cmp2 = icmp eq i32 %shl, 0380 %mul = select i1 %cmp2, i32 %b, i32 1381 %spec.select = mul nsw i32 %mul, %a382 br label %return383 384return: ; preds = %if.end, %entry385 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ]386 %retval.0 = sext i32 %retval.0.in to i64387 ret i64 %retval.0388}389 390define i64 @i_a_op_b_1(i32 signext %a, i32 signext %b) {391; CHECK-LABEL: i_a_op_b_1:392; CHECK: # %bb.0: # %entry393; CHECK-NEXT: slw r5, r3, r4394; CHECK-NEXT: cmpwi r5, 1395; CHECK-NEXT: bgt cr0, .LBB13_2396; CHECK-NEXT: # %bb.1: # %if.end397; CHECK-NEXT: li r5, 1398; CHECK-NEXT: isellt r4, r5, r4399; CHECK-NEXT: mullw r4, r4, r3400; CHECK-NEXT: .LBB13_2: # %return401; CHECK-NEXT: extsw r3, r4402; CHECK-NEXT: blr403entry:404 %shl = shl i32 %a, %b405 %cmp = icmp sgt i32 %shl, 1406 br i1 %cmp, label %return, label %if.end407 408if.end: ; preds = %entry409 %cmp2 = icmp eq i32 %shl, 1410 %mul = select i1 %cmp2, i32 %b, i32 1411 %spec.select = mul nsw i32 %mul, %a412 br label %return413 414return: ; preds = %if.end, %entry415 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ]416 %retval.0 = sext i32 %retval.0.in to i64417 ret i64 %retval.0418}419 420define i64 @i_a_op_b_2(i32 signext %a, i32 signext %b) {421; CHECK-LABEL: i_a_op_b_2:422; CHECK: # %bb.0: # %entry423; CHECK-NEXT: slw r5, r3, r4424; CHECK-NEXT: cmpwi r5, 2425; CHECK-NEXT: bgt cr0, .LBB14_2426; CHECK-NEXT: # %bb.1: # %if.end427; CHECK-NEXT: li r5, 1428; CHECK-NEXT: isellt r4, r5, r4429; CHECK-NEXT: mullw r4, r4, r3430; CHECK-NEXT: .LBB14_2: # %return431; CHECK-NEXT: extsw r3, r4432; CHECK-NEXT: blr433entry:434 %shl = shl i32 %a, %b435 %cmp = icmp sgt i32 %shl, 2436 br i1 %cmp, label %return, label %if.end437 438if.end: ; preds = %entry439 %cmp2 = icmp eq i32 %shl, 2440 %mul = select i1 %cmp2, i32 %b, i32 1441 %spec.select = mul nsw i32 %mul, %a442 br label %return443 444return: ; preds = %if.end, %entry445 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ]446 %retval.0 = sext i32 %retval.0.in to i64447 ret i64 %retval.0448}449 450define i64 @i_a__2(i32 signext %a, i32 signext %b) {451; CHECK-LABEL: i_a__2:452; CHECK: # %bb.0: # %entry453; CHECK-NEXT: cmpwi r3, -2454; CHECK-NEXT: bgt cr0, .LBB15_2455; CHECK-NEXT: # %bb.1: # %if.end456; CHECK-NEXT: li r5, 1457; CHECK-NEXT: isellt r4, r5, r4458; CHECK-NEXT: mullw r4, r4, r3459; CHECK-NEXT: .LBB15_2: # %return460; CHECK-NEXT: extsw r3, r4461; CHECK-NEXT: blr462entry:463 %cmp = icmp sgt i32 %a, -2464 br i1 %cmp, label %return, label %if.end465 466if.end: ; preds = %entry467 %cmp1 = icmp eq i32 %a, -2468 %mul = select i1 %cmp1, i32 %b, i32 1469 %spec.select = mul nsw i32 %mul, %a470 br label %return471 472return: ; preds = %if.end, %entry473 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ]474 %retval.0 = sext i32 %retval.0.in to i64475 ret i64 %retval.0476}477 478define i64 @i_a__1(i32 signext %a, i32 signext %b) {479; CHECK-LABEL: i_a__1:480; CHECK: # %bb.0: # %entry481; CHECK-NEXT: cmpwi r3, -1482; CHECK-NEXT: ble cr0, .LBB16_2483; CHECK-NEXT: # %bb.1: # %return484; CHECK-NEXT: extsw r3, r4485; CHECK-NEXT: blr486; CHECK-NEXT: .LBB16_2: # %if.end487; CHECK-NEXT: li r5, 1488; CHECK-NEXT: isellt r4, r5, r4489; CHECK-NEXT: mullw r4, r4, r3490; CHECK-NEXT: extsw r3, r4491; CHECK-NEXT: blr492entry:493 %cmp = icmp sgt i32 %a, -1494 br i1 %cmp, label %return, label %if.end495 496if.end: ; preds = %entry497 %cmp1 = icmp eq i32 %a, -1498 %mul = select i1 %cmp1, i32 %b, i32 1499 %spec.select = mul nsw i32 %mul, %a500 br label %return501 502return: ; preds = %if.end, %entry503 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ]504 %retval.0 = sext i32 %retval.0.in to i64505 ret i64 %retval.0506}507 508define i64 @i_a_0(i32 signext %a, i32 signext %b) {509; CHECK-LABEL: i_a_0:510; CHECK: # %bb.0: # %entry511; CHECK-NEXT: cmpwi r3, 0512; CHECK-NEXT: ble cr0, .LBB17_2513; CHECK-NEXT: # %bb.1: # %return514; CHECK-NEXT: extsw r3, r4515; CHECK-NEXT: blr516; CHECK-NEXT: .LBB17_2: # %if.end517; CHECK-NEXT: li r5, 1518; CHECK-NEXT: isellt r4, r5, r4519; CHECK-NEXT: mullw r4, r4, r3520; CHECK-NEXT: extsw r3, r4521; CHECK-NEXT: blr522entry:523 %cmp = icmp sgt i32 %a, 0524 br i1 %cmp, label %return, label %if.end525 526if.end: ; preds = %entry527 %cmp1 = icmp eq i32 %a, 0528 %mul = select i1 %cmp1, i32 %b, i32 1529 %spec.select = mul nsw i32 %mul, %a530 br label %return531 532return: ; preds = %if.end, %entry533 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ]534 %retval.0 = sext i32 %retval.0.in to i64535 ret i64 %retval.0536}537 538define i64 @i_a_1(i32 signext %a, i32 signext %b) {539; CHECK-LABEL: i_a_1:540; CHECK: # %bb.0: # %entry541; CHECK-NEXT: cmpwi r3, 1542; CHECK-NEXT: bgt cr0, .LBB18_2543; CHECK-NEXT: # %bb.1: # %if.end544; CHECK-NEXT: li r5, 1545; CHECK-NEXT: isellt r4, r5, r4546; CHECK-NEXT: mullw r4, r4, r3547; CHECK-NEXT: .LBB18_2: # %return548; CHECK-NEXT: extsw r3, r4549; CHECK-NEXT: blr550entry:551 %cmp = icmp sgt i32 %a, 1552 br i1 %cmp, label %return, label %if.end553 554if.end: ; preds = %entry555 %cmp1 = icmp eq i32 %a, 1556 %mul = select i1 %cmp1, i32 %b, i32 1557 %spec.select = mul nsw i32 %mul, %a558 br label %return559 560return: ; preds = %if.end, %entry561 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ]562 %retval.0 = sext i32 %retval.0.in to i64563 ret i64 %retval.0564}565 566define i64 @i_a_2(i32 signext %a, i32 signext %b) {567; CHECK-LABEL: i_a_2:568; CHECK: # %bb.0: # %entry569; CHECK-NEXT: cmpwi r3, 2570; CHECK-NEXT: bgt cr0, .LBB19_2571; CHECK-NEXT: # %bb.1: # %if.end572; CHECK-NEXT: li r5, 1573; CHECK-NEXT: isellt r4, r5, r4574; CHECK-NEXT: mullw r4, r4, r3575; CHECK-NEXT: .LBB19_2: # %return576; CHECK-NEXT: extsw r3, r4577; CHECK-NEXT: blr578entry:579 %cmp = icmp sgt i32 %a, 2580 br i1 %cmp, label %return, label %if.end581 582if.end: ; preds = %entry583 %cmp1 = icmp eq i32 %a, 2584 %mul = select i1 %cmp1, i32 %b, i32 1585 %spec.select = mul nsw i32 %mul, %a586 br label %return587 588return: ; preds = %if.end, %entry589 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ]590 %retval.0 = sext i32 %retval.0.in to i64591 ret i64 %retval.0592}593