1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown \ 3; RUN: -ppc-asm-full-reg-names -verify-machineinstrs -O2 < %s | FileCheck %s \ 4; RUN: --check-prefix=CHECK-P9 5 6define i32 @t(i32 %n, i32 %delta, i32 %a) { 7; CHECK-P9-LABEL: t: 8; CHECK-P9: # %bb.0: # %entry 9; CHECK-P9-NEXT: lis r7, 0 10; CHECK-P9-NEXT: li r6, 0 11; CHECK-P9-NEXT: li r8, 0 12; CHECK-P9-NEXT: li r9, 0 13; CHECK-P9-NEXT: ori r7, r7, 65535 14; CHECK-P9-NEXT: .p2align 5 15; CHECK-P9-NEXT: .LBB0_1: # %header 16; CHECK-P9-NEXT: # 17; CHECK-P9-NEXT: addi r9, r9, 1 18; CHECK-P9-NEXT: cmpw r9, r3 19; CHECK-P9-NEXT: blt cr0, .LBB0_4 20; CHECK-P9-NEXT: # %bb.2: # %cont 21; CHECK-P9-NEXT: # 22; CHECK-P9-NEXT: add r8, r8, r4 23; CHECK-P9-NEXT: cmpw r8, r7 24; CHECK-P9-NEXT: bgt cr0, .LBB0_1 25; CHECK-P9-NEXT: # %bb.3: # %cont.1 26; CHECK-P9-NEXT: addi r6, r5, 1024 27; CHECK-P9-NEXT: .LBB0_4: # %return 28; CHECK-P9-NEXT: addi r3, r5, 1024 29; CHECK-P9-NEXT: mullw r3, r6, r3 30; CHECK-P9-NEXT: blr 31entry: 32 br label %header 33 34header: 35 %sum = phi i32 [ 0, %entry ], [ %sum.1, %cont ] 36 %i = phi i32 [ 0, %entry ], [ %i.1, %cont ] 37 %i.1 = add nsw i32 %i, 1 38 %lt = icmp slt i32 %i.1, %n 39 br i1 %lt, label %return, label %cont 40 41cont: 42 %sum.1 = add nsw i32 %sum, %delta 43 %lt.1 = icmp slt i32 %sum.1, 65536 44 br i1 %lt.1, label %cont.1, label %header 45 46cont.1: 47 %delta.1 = add nsw i32 %a, 1024 48 br label %return 49 50return: 51 %delta.2 = phi i32 [ %delta.1, %cont.1 ], [ 0, %header ] 52 %delta.3 = add nsw i32 %a, 1024 53 %ret = mul i32 %delta.2, %delta.3 54 ret i32 %ret 55} 56 57define dso_local signext i32 @foo(i32 signext %x, i32 signext %y) local_unnamed_addr #0 { 58; CHECK-P9-LABEL: foo: 59; CHECK-P9: # %bb.0: # %entry 60; CHECK-P9-NEXT: mflr r0 61; CHECK-P9-NEXT: .cfi_def_cfa_offset 80 62; CHECK-P9-NEXT: .cfi_offset lr, 16 63; CHECK-P9-NEXT: .cfi_offset r27, -40 64; CHECK-P9-NEXT: .cfi_offset r28, -32 65; CHECK-P9-NEXT: .cfi_offset r29, -24 66; CHECK-P9-NEXT: .cfi_offset r30, -16 67; CHECK-P9-NEXT: std r27, -40(r1) # 8-byte Folded Spill 68; CHECK-P9-NEXT: std r28, -32(r1) # 8-byte Folded Spill 69; CHECK-P9-NEXT: std r29, -24(r1) # 8-byte Folded Spill 70; CHECK-P9-NEXT: std r30, -16(r1) # 8-byte Folded Spill 71; CHECK-P9-NEXT: std r0, 16(r1) 72; CHECK-P9-NEXT: stdu r1, -80(r1) 73; CHECK-P9-NEXT: mr r30, r4 74; CHECK-P9-NEXT: mr r29, r3 75; CHECK-P9-NEXT: lis r3, 21845 76; CHECK-P9-NEXT: add r28, r30, r29 77; CHECK-P9-NEXT: ori r27, r3, 21846 78; CHECK-P9-NEXT: b .LBB1_4 79; CHECK-P9-NEXT: .p2align 4 80; CHECK-P9-NEXT: .LBB1_1: # %sw.bb3 81; CHECK-P9-NEXT: # 82; CHECK-P9-NEXT: mulli r3, r30, 23 83; CHECK-P9-NEXT: .LBB1_2: # %sw.epilog 84; CHECK-P9-NEXT: # 85; CHECK-P9-NEXT: add r28, r3, r28 86; CHECK-P9-NEXT: .LBB1_3: # %sw.epilog 87; CHECK-P9-NEXT: # 88; CHECK-P9-NEXT: cmpwi r28, 1025 89; CHECK-P9-NEXT: bge cr0, .LBB1_7 90; CHECK-P9-NEXT: .LBB1_4: # %while.cond 91; CHECK-P9-NEXT: # 92; CHECK-P9-NEXT: extsw r3, r29 93; CHECK-P9-NEXT: bl bar 94; CHECK-P9-NEXT: nop 95; CHECK-P9-NEXT: mr r29, r3 96; CHECK-P9-NEXT: extsw r3, r30 97; CHECK-P9-NEXT: bl bar 98; CHECK-P9-NEXT: nop 99; CHECK-P9-NEXT: mr r30, r3 100; CHECK-P9-NEXT: extsw r3, r28 101; CHECK-P9-NEXT: mulld r4, r3, r27 102; CHECK-P9-NEXT: rldicl r5, r4, 1, 63 103; CHECK-P9-NEXT: rldicl r4, r4, 32, 32 104; CHECK-P9-NEXT: add r4, r4, r5 105; CHECK-P9-NEXT: slwi r5, r4, 1 106; CHECK-P9-NEXT: add r4, r4, r5 107; CHECK-P9-NEXT: subf r3, r4, r3 108; CHECK-P9-NEXT: cmplwi r3, 1 109; CHECK-P9-NEXT: beq cr0, .LBB1_1 110; CHECK-P9-NEXT: # %bb.5: # %while.cond 111; CHECK-P9-NEXT: # 112; CHECK-P9-NEXT: cmplwi r3, 0 113; CHECK-P9-NEXT: bne cr0, .LBB1_3 114; CHECK-P9-NEXT: # %bb.6: # %sw.bb 115; CHECK-P9-NEXT: # 116; CHECK-P9-NEXT: mulli r3, r29, 13 117; CHECK-P9-NEXT: b .LBB1_2 118; CHECK-P9-NEXT: .LBB1_7: # %while.end 119; CHECK-P9-NEXT: lis r3, -13108 120; CHECK-P9-NEXT: ori r3, r3, 52429 121; CHECK-P9-NEXT: mullw r3, r28, r3 122; CHECK-P9-NEXT: lis r4, 13107 123; CHECK-P9-NEXT: ori r4, r4, 13108 124; CHECK-P9-NEXT: cmplw r3, r4 125; CHECK-P9-NEXT: blt cr0, .LBB1_9 126; CHECK-P9-NEXT: # %bb.8: # %if.then8 127; CHECK-P9-NEXT: mulli r3, r29, 13 128; CHECK-P9-NEXT: mulli r5, r30, 23 129; CHECK-P9-NEXT: extsw r4, r28 130; CHECK-P9-NEXT: extsw r3, r3 131; CHECK-P9-NEXT: extsw r5, r5 132; CHECK-P9-NEXT: sub r3, r4, r3 133; CHECK-P9-NEXT: sub r4, r5, r4 134; CHECK-P9-NEXT: rldicl r3, r3, 1, 63 135; CHECK-P9-NEXT: rldicl r4, r4, 1, 63 136; CHECK-P9-NEXT: or r3, r3, r4 137; CHECK-P9-NEXT: b .LBB1_10 138; CHECK-P9-NEXT: .LBB1_9: # %cleanup20 139; CHECK-P9-NEXT: li r3, 0 140; CHECK-P9-NEXT: .LBB1_10: # %cleanup20 141; CHECK-P9-NEXT: addi r1, r1, 80 142; CHECK-P9-NEXT: ld r0, 16(r1) 143; CHECK-P9-NEXT: mtlr r0 144; CHECK-P9-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 145; CHECK-P9-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 146; CHECK-P9-NEXT: ld r28, -32(r1) # 8-byte Folded Reload 147; CHECK-P9-NEXT: ld r27, -40(r1) # 8-byte Folded Reload 148; CHECK-P9-NEXT: blr 149entry: 150 %add = add nsw i32 %y, %x 151 br label %while.cond 152 153while.cond: ; preds = %sw.epilog, %entry 154 %sum.0 = phi i32 [ %add, %entry ], [ %sum.1, %sw.epilog ] 155 %y.addr.0 = phi i32 [ %y, %entry ], [ %call1, %sw.epilog ] 156 %x.addr.0 = phi i32 [ %x, %entry ], [ %call, %sw.epilog ] 157 %call = tail call signext i32 @bar(i32 signext %x.addr.0) #2 158 %call1 = tail call signext i32 @bar(i32 signext %y.addr.0) #2 159 %rem = srem i32 %sum.0, 3 160 switch i32 %rem, label %sw.epilog [ 161 i32 0, label %sw.bb 162 i32 1, label %sw.bb3 163 ] 164 165sw.bb: ; preds = %while.cond 166 %mul = mul nsw i32 %call, 13 167 %add2 = add nsw i32 %mul, %sum.0 168 br label %sw.epilog 169 170sw.bb3: ; preds = %while.cond 171 %mul4 = mul nsw i32 %call1, 23 172 %add5 = add nsw i32 %mul4, %sum.0 173 br label %sw.epilog 174 175sw.epilog: ; preds = %while.cond, %sw.bb3, %sw.bb 176 %sum.1 = phi i32 [ %sum.0, %while.cond ], [ %add5, %sw.bb3 ], [ %add2, %sw.bb ] 177 %cmp = icmp slt i32 %sum.1, 1025 178 br i1 %cmp, label %while.cond, label %while.end 179 180while.end: ; preds = %sw.epilog 181 %rem739 = urem i32 %sum.1, 5 182 %tobool = icmp eq i32 %rem739, 0 183 br i1 %tobool, label %cleanup20, label %if.then8 184 185if.then8: ; preds = %while.end 186 %mul9 = mul nsw i32 %call, 13 187 %cmp11 = icmp slt i32 %sum.1, %mul9 188 %mul10 = mul nsw i32 %call1, 23 189 %cmp12 = icmp sgt i32 %sum.1, %mul10 190 %or.cond = or i1 %cmp11, %cmp12 191 %spec.select = zext i1 %or.cond to i32 192 ret i32 %spec.select 193 194cleanup20: ; preds = %while.end 195 ret i32 0 196} 197 198declare signext i32 @bar(i32 signext) local_unnamed_addr #1 199