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