1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -disable-lsr -ppc-asm-full-reg-names -verify-machineinstrs \ 3; RUN: -ppc-formprep-update-nonconst-inc -mtriple=powerpc64le-unknown-linux-gnu \ 4; RUN: -mcpu=pwr9 < %s | FileCheck %s 5 6; long long foo(char *p, int n, int count) { 7; int j = 0; 8; long long sum = 0; 9; for (int i = 0; i < n; i++) { 10; sum += *(unsigned long long *)(p + j + 5); 11; sum += *(unsigned long long *)(p + j + 9); 12; j += count; 13; } 14; return sum; 15; } 16 17define i64 @foo(i8* %p, i32 signext %n, i32 signext %count) { 18; CHECK-LABEL: foo: 19; CHECK: # %bb.0: # %entry 20; CHECK-NEXT: cmpwi r4, 1 21; CHECK-NEXT: blt cr0, .LBB0_4 22; CHECK-NEXT: # %bb.1: # %for.body.preheader 23; CHECK-NEXT: addi r6, r3, 5 24; CHECK-NEXT: addi r3, r4, -1 25; CHECK-NEXT: extsw r5, r5 26; CHECK-NEXT: clrldi r3, r3, 32 27; CHECK-NEXT: addi r3, r3, 1 28; CHECK-NEXT: mtctr r3 29; CHECK-NEXT: li r3, 0 30; CHECK-NEXT: .p2align 5 31; CHECK-NEXT: .LBB0_2: # %for.body 32; CHECK-NEXT: # 33; CHECK-NEXT: ld r4, 0(r6) 34; CHECK-NEXT: add r3, r4, r3 35; CHECK-NEXT: ld r4, 4(r6) 36; CHECK-NEXT: add r6, r6, r5 37; CHECK-NEXT: add r3, r3, r4 38; CHECK-NEXT: bdnz .LBB0_2 39; CHECK-NEXT: # %bb.3: # %for.cond.cleanup 40; CHECK-NEXT: blr 41; CHECK-NEXT: .LBB0_4: 42; CHECK-NEXT: li r3, 0 43; CHECK-NEXT: blr 44entry: 45 %cmp16 = icmp sgt i32 %n, 0 46 br i1 %cmp16, label %for.body.preheader, label %for.cond.cleanup 47 48for.body.preheader: ; preds = %entry 49 %0 = sext i32 %count to i64 50 br label %for.body 51 52for.cond.cleanup: ; preds = %for.body, %entry 53 %sum.0.lcssa = phi i64 [ 0, %entry ], [ %add5, %for.body ] 54 ret i64 %sum.0.lcssa 55 56for.body: ; preds = %for.body.preheader, %for.body 57 %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 58 %i.019 = phi i32 [ 0, %for.body.preheader ], [ %inc, %for.body ] 59 %sum.018 = phi i64 [ 0, %for.body.preheader ], [ %add5, %for.body ] 60 %add.ptr = getelementptr inbounds i8, i8* %p, i64 %indvars.iv 61 %add.ptr1 = getelementptr inbounds i8, i8* %add.ptr, i64 5 62 %1 = bitcast i8* %add.ptr1 to i64* 63 %2 = load i64, i64* %1, align 8 64 %add = add i64 %2, %sum.018 65 %add.ptr4 = getelementptr inbounds i8, i8* %add.ptr, i64 9 66 %3 = bitcast i8* %add.ptr4 to i64* 67 %4 = load i64, i64* %3, align 8 68 %add5 = add i64 %add, %4 69 %indvars.iv.next = add nsw i64 %indvars.iv, %0 70 %inc = add nuw nsw i32 %i.019, 1 71 %exitcond.not = icmp eq i32 %inc, %n 72 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body 73} 74 75; char foo1(char *p, int n, int count) { 76; int j = 0; 77; char sum = 0; 78; for (int i = 0; i < n; i++) { 79; sum += *(p + j + 1000); 80; j += count; 81; } 82; return sum; 83; } 84 85define zeroext i8 @foo1(i8* %p, i32 signext %n, i32 signext %count) { 86; CHECK-LABEL: foo1: 87; CHECK: # %bb.0: # %entry 88; CHECK-NEXT: cmpwi r4, 1 89; CHECK-NEXT: blt cr0, .LBB1_4 90; CHECK-NEXT: # %bb.1: # %for.body.preheader 91; CHECK-NEXT: extsw r5, r5 92; CHECK-NEXT: sub r3, r3, r5 93; CHECK-NEXT: addi r6, r3, 1000 94; CHECK-NEXT: addi r3, r4, -1 95; CHECK-NEXT: clrldi r3, r3, 32 96; CHECK-NEXT: addi r3, r3, 1 97; CHECK-NEXT: mtctr r3 98; CHECK-NEXT: li r3, 0 99; CHECK-NEXT: .p2align 4 100; CHECK-NEXT: .LBB1_2: # %for.body 101; CHECK-NEXT: # 102; CHECK-NEXT: lbzux r4, r6, r5 103; CHECK-NEXT: add r3, r4, r3 104; CHECK-NEXT: bdnz .LBB1_2 105; CHECK-NEXT: # %bb.3: # %for.cond.cleanup 106; CHECK-NEXT: clrldi r3, r3, 56 107; CHECK-NEXT: blr 108; CHECK-NEXT: .LBB1_4: 109; CHECK-NEXT: li r3, 0 110; CHECK-NEXT: blr 111entry: 112 %cmp10 = icmp sgt i32 %n, 0 113 br i1 %cmp10, label %for.body.preheader, label %for.cond.cleanup 114 115for.body.preheader: ; preds = %entry 116 %0 = sext i32 %count to i64 117 %add.ptr = getelementptr inbounds i8, i8* %p, i64 1000 118 br label %for.body 119 120for.cond.cleanup: ; preds = %for.body, %entry 121 %sum.0.lcssa = phi i8 [ 0, %entry ], [ %add, %for.body ] 122 ret i8 %sum.0.lcssa 123 124for.body: ; preds = %for.body.preheader, %for.body 125 %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 126 %i.013 = phi i32 [ 0, %for.body.preheader ], [ %inc, %for.body ] 127 %sum.012 = phi i8 [ 0, %for.body.preheader ], [ %add, %for.body ] 128 %add.ptr1 = getelementptr inbounds i8, i8* %add.ptr, i64 %indvars.iv 129 %1 = load i8, i8* %add.ptr1, align 1 130 %add = add i8 %1, %sum.012 131 %indvars.iv.next = add nsw i64 %indvars.iv, %0 132 %inc = add nuw nsw i32 %i.013, 1 133 %exitcond.not = icmp eq i32 %inc, %n 134 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body 135} 136