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