| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -ppc-asm-full-reg-names -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 < %s | FileCheck %s |
| |
| ; test_no_prep: |
| ; unsigned long test_no_prep(char *p, int count) { |
| ; unsigned long i=0, res=0; |
| ; int DISP1 = 4001; |
| ; int DISP2 = 4002; |
| ; int DISP3 = 4003; |
| ; int DISP4 = 4004; |
| ; for (; i < count ; i++) { |
| ; unsigned long x1 = *(unsigned long *)(p + i + DISP1); |
| ; unsigned long x2 = *(unsigned long *)(p + i + DISP2); |
| ; unsigned long x3 = *(unsigned long *)(p + i + DISP3); |
| ; unsigned long x4 = *(unsigned long *)(p + i + DISP4); |
| ; res += x1*x2*x3*x4; |
| ; } |
| ; return res + count; |
| ; } |
| |
| define i64 @test_no_prep(ptr %arg, i32 signext %arg1) { |
| ; CHECK-LABEL: test_no_prep: |
| ; CHECK: # %bb.0: # %bb |
| ; CHECK-NEXT: cmplwi r4, 0 |
| ; CHECK-NEXT: beq cr0, .LBB0_4 |
| ; CHECK-NEXT: # %bb.1: # %bb3.preheader |
| ; CHECK-NEXT: mtctr r4 |
| ; CHECK-NEXT: addi r5, r3, 4004 |
| ; CHECK-NEXT: li r3, 0 |
| ; CHECK-NEXT: li r6, -3 |
| ; CHECK-NEXT: li r7, -2 |
| ; CHECK-NEXT: li r8, -1 |
| ; CHECK-NEXT: .p2align 4 |
| ; CHECK-NEXT: .LBB0_2: # %bb3 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: ldx r9, r5, r6 |
| ; CHECK-NEXT: ldx r10, r5, r7 |
| ; CHECK-NEXT: ldx r11, r5, r8 |
| ; CHECK-NEXT: ld r12, 0(r5) |
| ; CHECK-NEXT: addi r5, r5, 1 |
| ; CHECK-NEXT: mulld r9, r10, r9 |
| ; CHECK-NEXT: mulld r9, r9, r11 |
| ; CHECK-NEXT: maddld r3, r9, r12, r3 |
| ; CHECK-NEXT: bdnz .LBB0_2 |
| ; CHECK-NEXT: # %bb.3: # %bb25 |
| ; CHECK-NEXT: add r3, r3, r4 |
| ; CHECK-NEXT: blr |
| ; CHECK-NEXT: .LBB0_4: |
| ; CHECK-NEXT: addi r3, r4, 0 |
| ; CHECK-NEXT: blr |
| bb: |
| %i = sext i32 %arg1 to i64 |
| %i2 = icmp eq i32 %arg1, 0 |
| br i1 %i2, label %bb25, label %bb3 |
| |
| bb3: ; preds = %bb3, %bb |
| %i4 = phi i64 [ %i23, %bb3 ], [ 0, %bb ] |
| %i5 = phi i64 [ %i22, %bb3 ], [ 0, %bb ] |
| %i6 = getelementptr inbounds i8, ptr %arg, i64 %i4 |
| %i7 = getelementptr inbounds i8, ptr %i6, i64 4001 |
| %i9 = load i64, ptr %i7, align 8 |
| %i10 = getelementptr inbounds i8, ptr %i6, i64 4002 |
| %i12 = load i64, ptr %i10, align 8 |
| %i13 = getelementptr inbounds i8, ptr %i6, i64 4003 |
| %i15 = load i64, ptr %i13, align 8 |
| %i16 = getelementptr inbounds i8, ptr %i6, i64 4004 |
| %i18 = load i64, ptr %i16, align 8 |
| %i19 = mul i64 %i12, %i9 |
| %i20 = mul i64 %i19, %i15 |
| %i21 = mul i64 %i20, %i18 |
| %i22 = add i64 %i21, %i5 |
| %i23 = add nuw i64 %i4, 1 |
| %i24 = icmp ult i64 %i23, %i |
| br i1 %i24, label %bb3, label %bb25 |
| |
| bb25: ; preds = %bb3, %bb |
| %i26 = phi i64 [ 0, %bb ], [ %i22, %bb3 ] |
| %i27 = add i64 %i26, %i |
| ret i64 %i27 |
| } |
| |
| ; test_ds_prep: |
| ; unsigned long test_ds_prep(char *p, int count) { |
| ; unsigned long i=0, res=0; |
| ; int DISP1 = 4001; |
| ; int DISP2 = 4002; |
| ; int DISP3 = 4003; |
| ; int DISP4 = 4006; |
| ; for (; i < count ; i++) { |
| ; unsigned long x1 = *(unsigned long *)(p + i + DISP1); |
| ; unsigned long x2 = *(unsigned long *)(p + i + DISP2); |
| ; unsigned long x3 = *(unsigned long *)(p + i + DISP3); |
| ; unsigned long x4 = *(unsigned long *)(p + i + DISP4); |
| ; res += x1*x2*x3*x4; |
| ; } |
| ; return res + count; |
| ; } |
| |
| define i64 @test_ds_prep(ptr %arg, i32 signext %arg1) { |
| ; CHECK-LABEL: test_ds_prep: |
| ; CHECK: # %bb.0: # %bb |
| ; CHECK-NEXT: cmplwi r4, 0 |
| ; CHECK-NEXT: beq cr0, .LBB1_4 |
| ; CHECK-NEXT: # %bb.1: # %bb3.preheader |
| ; CHECK-NEXT: mtctr r4 |
| ; CHECK-NEXT: addi r7, r3, 4002 |
| ; CHECK-NEXT: li r3, 0 |
| ; CHECK-NEXT: li r5, -1 |
| ; CHECK-NEXT: li r6, 1 |
| ; CHECK-NEXT: .p2align 4 |
| ; CHECK-NEXT: .LBB1_2: # %bb3 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: ldx r8, r7, r5 |
| ; CHECK-NEXT: ld r9, 0(r7) |
| ; CHECK-NEXT: ldx r10, r7, r6 |
| ; CHECK-NEXT: ld r11, 4(r7) |
| ; CHECK-NEXT: addi r7, r7, 1 |
| ; CHECK-NEXT: mulld r8, r9, r8 |
| ; CHECK-NEXT: mulld r8, r8, r10 |
| ; CHECK-NEXT: maddld r3, r8, r11, r3 |
| ; CHECK-NEXT: bdnz .LBB1_2 |
| ; CHECK-NEXT: # %bb.3: # %bb25 |
| ; CHECK-NEXT: add r3, r3, r4 |
| ; CHECK-NEXT: blr |
| ; CHECK-NEXT: .LBB1_4: |
| ; CHECK-NEXT: addi r3, r4, 0 |
| ; CHECK-NEXT: blr |
| bb: |
| %i = sext i32 %arg1 to i64 |
| %i2 = icmp eq i32 %arg1, 0 |
| br i1 %i2, label %bb25, label %bb3 |
| |
| bb3: ; preds = %bb3, %bb |
| %i4 = phi i64 [ %i23, %bb3 ], [ 0, %bb ] |
| %i5 = phi i64 [ %i22, %bb3 ], [ 0, %bb ] |
| %i6 = getelementptr inbounds i8, ptr %arg, i64 %i4 |
| %i7 = getelementptr inbounds i8, ptr %i6, i64 4001 |
| %i9 = load i64, ptr %i7, align 8 |
| %i10 = getelementptr inbounds i8, ptr %i6, i64 4002 |
| %i12 = load i64, ptr %i10, align 8 |
| %i13 = getelementptr inbounds i8, ptr %i6, i64 4003 |
| %i15 = load i64, ptr %i13, align 8 |
| %i16 = getelementptr inbounds i8, ptr %i6, i64 4006 |
| %i18 = load i64, ptr %i16, align 8 |
| %i19 = mul i64 %i12, %i9 |
| %i20 = mul i64 %i19, %i15 |
| %i21 = mul i64 %i20, %i18 |
| %i22 = add i64 %i21, %i5 |
| %i23 = add nuw i64 %i4, 1 |
| %i24 = icmp ult i64 %i23, %i |
| br i1 %i24, label %bb3, label %bb25 |
| |
| bb25: ; preds = %bb3, %bb |
| %i26 = phi i64 [ 0, %bb ], [ %i22, %bb3 ] |
| %i27 = add i64 %i26, %i |
| ret i64 %i27 |
| } |
| |
| ; test_max_number_reminder: |
| ; unsigned long test_max_number_reminder(char *p, int count) { |
| ; unsigned long i=0, res=0; |
| ; int DISP1 = 4001; |
| ; int DISP2 = 4002; |
| ; int DISP3 = 4003; |
| ; int DISP4 = 4005; |
| ; int DISP5 = 4006; |
| ; int DISP6 = 4007; |
| ; int DISP7 = 4014; |
| ; int DISP8 = 4010; |
| ; int DISP9 = 4011; |
| ; for (; i < count ; i++) { |
| ; unsigned long x1 = *(unsigned long *)(p + i + DISP1); |
| ; unsigned long x2 = *(unsigned long *)(p + i + DISP2); |
| ; unsigned long x3 = *(unsigned long *)(p + i + DISP3); |
| ; unsigned long x4 = *(unsigned long *)(p + i + DISP4); |
| ; unsigned long x5 = *(unsigned long *)(p + i + DISP5); |
| ; unsigned long x6 = *(unsigned long *)(p + i + DISP6); |
| ; unsigned long x7 = *(unsigned long *)(p + i + DISP7); |
| ; unsigned long x8 = *(unsigned long *)(p + i + DISP8); |
| ; unsigned long x9 = *(unsigned long *)(p + i + DISP9); |
| ; res += x1*x2*x3*x4*x5*x6*x7*x8*x9; |
| ; } |
| ; return res + count; |
| ;} |
| |
| define i64 @test_max_number_reminder(ptr %arg, i32 signext %arg1) { |
| ; CHECK-LABEL: test_max_number_reminder: |
| ; CHECK: # %bb.0: # %bb |
| ; CHECK-NEXT: cmplwi r4, 0 |
| ; CHECK-NEXT: beq cr0, .LBB2_4 |
| ; CHECK-NEXT: # %bb.1: # %bb3.preheader |
| ; CHECK-NEXT: std r25, -56(r1) # 8-byte Folded Spill |
| ; CHECK-NEXT: std r26, -48(r1) # 8-byte Folded Spill |
| ; CHECK-NEXT: addi r10, r3, 4002 |
| ; CHECK-NEXT: li r3, 0 |
| ; CHECK-NEXT: li r5, -1 |
| ; CHECK-NEXT: li r6, 1 |
| ; CHECK-NEXT: li r7, 3 |
| ; CHECK-NEXT: li r8, 5 |
| ; CHECK-NEXT: li r9, 9 |
| ; CHECK-NEXT: std r27, -40(r1) # 8-byte Folded Spill |
| ; CHECK-NEXT: std r28, -32(r1) # 8-byte Folded Spill |
| ; CHECK-NEXT: std r29, -24(r1) # 8-byte Folded Spill |
| ; CHECK-NEXT: std r30, -16(r1) # 8-byte Folded Spill |
| ; CHECK-NEXT: mtctr r4 |
| ; CHECK-NEXT: .p2align 4 |
| ; CHECK-NEXT: .LBB2_2: # %bb3 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: ldx r11, r10, r5 |
| ; CHECK-NEXT: ld r12, 0(r10) |
| ; CHECK-NEXT: ldx r0, r10, r6 |
| ; CHECK-NEXT: ldx r30, r10, r7 |
| ; CHECK-NEXT: mulld r11, r12, r11 |
| ; CHECK-NEXT: ld r29, 4(r10) |
| ; CHECK-NEXT: ldx r28, r10, r8 |
| ; CHECK-NEXT: ld r27, 12(r10) |
| ; CHECK-NEXT: ld r26, 8(r10) |
| ; CHECK-NEXT: ldx r25, r10, r9 |
| ; CHECK-NEXT: addi r10, r10, 1 |
| ; CHECK-NEXT: mulld r11, r11, r0 |
| ; CHECK-NEXT: mulld r11, r11, r30 |
| ; CHECK-NEXT: mulld r11, r11, r29 |
| ; CHECK-NEXT: mulld r11, r11, r28 |
| ; CHECK-NEXT: mulld r11, r11, r27 |
| ; CHECK-NEXT: mulld r11, r11, r26 |
| ; CHECK-NEXT: maddld r3, r11, r25, r3 |
| ; CHECK-NEXT: bdnz .LBB2_2 |
| ; CHECK-NEXT: # %bb.3: |
| ; CHECK-NEXT: ld r30, -16(r1) # 8-byte Folded Reload |
| ; CHECK-NEXT: ld r29, -24(r1) # 8-byte Folded Reload |
| ; CHECK-NEXT: ld r28, -32(r1) # 8-byte Folded Reload |
| ; CHECK-NEXT: ld r27, -40(r1) # 8-byte Folded Reload |
| ; CHECK-NEXT: add r3, r3, r4 |
| ; CHECK-NEXT: ld r26, -48(r1) # 8-byte Folded Reload |
| ; CHECK-NEXT: ld r25, -56(r1) # 8-byte Folded Reload |
| ; CHECK-NEXT: blr |
| ; CHECK-NEXT: .LBB2_4: |
| ; CHECK-NEXT: addi r3, r4, 0 |
| ; CHECK-NEXT: blr |
| bb: |
| %i = sext i32 %arg1 to i64 |
| %i2 = icmp eq i32 %arg1, 0 |
| br i1 %i2, label %bb45, label %bb3 |
| |
| bb3: ; preds = %bb3, %bb |
| %i4 = phi i64 [ %i43, %bb3 ], [ 0, %bb ] |
| %i5 = phi i64 [ %i42, %bb3 ], [ 0, %bb ] |
| %i6 = getelementptr inbounds i8, ptr %arg, i64 %i4 |
| %i7 = getelementptr inbounds i8, ptr %i6, i64 4001 |
| %i9 = load i64, ptr %i7, align 8 |
| %i10 = getelementptr inbounds i8, ptr %i6, i64 4002 |
| %i12 = load i64, ptr %i10, align 8 |
| %i13 = getelementptr inbounds i8, ptr %i6, i64 4003 |
| %i15 = load i64, ptr %i13, align 8 |
| %i16 = getelementptr inbounds i8, ptr %i6, i64 4005 |
| %i18 = load i64, ptr %i16, align 8 |
| %i19 = getelementptr inbounds i8, ptr %i6, i64 4006 |
| %i21 = load i64, ptr %i19, align 8 |
| %i22 = getelementptr inbounds i8, ptr %i6, i64 4007 |
| %i24 = load i64, ptr %i22, align 8 |
| %i25 = getelementptr inbounds i8, ptr %i6, i64 4014 |
| %i27 = load i64, ptr %i25, align 8 |
| %i28 = getelementptr inbounds i8, ptr %i6, i64 4010 |
| %i30 = load i64, ptr %i28, align 8 |
| %i31 = getelementptr inbounds i8, ptr %i6, i64 4011 |
| %i33 = load i64, ptr %i31, align 8 |
| %i34 = mul i64 %i12, %i9 |
| %i35 = mul i64 %i34, %i15 |
| %i36 = mul i64 %i35, %i18 |
| %i37 = mul i64 %i36, %i21 |
| %i38 = mul i64 %i37, %i24 |
| %i39 = mul i64 %i38, %i27 |
| %i40 = mul i64 %i39, %i30 |
| %i41 = mul i64 %i40, %i33 |
| %i42 = add i64 %i41, %i5 |
| %i43 = add nuw i64 %i4, 1 |
| %i44 = icmp ult i64 %i43, %i |
| br i1 %i44, label %bb3, label %bb45 |
| |
| bb45: ; preds = %bb3, %bb |
| %i46 = phi i64 [ 0, %bb ], [ %i42, %bb3 ] |
| %i47 = add i64 %i46, %i |
| ret i64 %i47 |
| } |
| |
| ; test_update_ds_prep_interact: |
| ; unsigned long test_update_ds_prep_interact(char *p, int count) { |
| ; unsigned long i=0, res=0; |
| ; int DISP1 = 4001; |
| ; int DISP2 = 4002; |
| ; int DISP3 = 4003; |
| ; int DISP4 = 4006; |
| ; for (; i < count ; i++) { |
| ; unsigned long x1 = *(unsigned long *)(p + 4 * i + DISP1); |
| ; unsigned long x2 = *(unsigned long *)(p + 4 * i + DISP2); |
| ; unsigned long x3 = *(unsigned long *)(p + 4 * i + DISP3); |
| ; unsigned long x4 = *(unsigned long *)(p + 4 * i + DISP4); |
| ; res += x1*x2*x3*x4; |
| ; } |
| ; return res + count; |
| ; } |
| |
| define dso_local i64 @test_update_ds_prep_interact(ptr %arg, i32 signext %arg1) { |
| ; CHECK-LABEL: test_update_ds_prep_interact: |
| ; CHECK: # %bb.0: # %bb |
| ; CHECK-NEXT: cmplwi r4, 0 |
| ; CHECK-NEXT: beq cr0, .LBB3_4 |
| ; CHECK-NEXT: # %bb.1: # %bb3.preheader |
| ; CHECK-NEXT: mtctr r4 |
| ; CHECK-NEXT: addi r5, r3, 3998 |
| ; CHECK-NEXT: li r3, 0 |
| ; CHECK-NEXT: li r6, -1 |
| ; CHECK-NEXT: li r7, 1 |
| ; CHECK-NEXT: .p2align 5 |
| ; CHECK-NEXT: .LBB3_2: # %bb3 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: ldu r8, 4(r5) |
| ; CHECK-NEXT: ldx r9, r5, r6 |
| ; CHECK-NEXT: ldx r10, r5, r7 |
| ; CHECK-NEXT: ld r11, 4(r5) |
| ; CHECK-NEXT: mulld r8, r8, r9 |
| ; CHECK-NEXT: mulld r8, r8, r10 |
| ; CHECK-NEXT: maddld r3, r8, r11, r3 |
| ; CHECK-NEXT: bdnz .LBB3_2 |
| ; CHECK-NEXT: # %bb.3: # %bb26 |
| ; CHECK-NEXT: add r3, r3, r4 |
| ; CHECK-NEXT: blr |
| ; CHECK-NEXT: .LBB3_4: |
| ; CHECK-NEXT: addi r3, r4, 0 |
| ; CHECK-NEXT: blr |
| bb: |
| %i = sext i32 %arg1 to i64 |
| %i2 = icmp eq i32 %arg1, 0 |
| br i1 %i2, label %bb26, label %bb3 |
| |
| bb3: ; preds = %bb3, %bb |
| %i4 = phi i64 [ %i24, %bb3 ], [ 0, %bb ] |
| %i5 = phi i64 [ %i23, %bb3 ], [ 0, %bb ] |
| %i6 = shl i64 %i4, 2 |
| %i7 = getelementptr inbounds i8, ptr %arg, i64 %i6 |
| %i8 = getelementptr inbounds i8, ptr %i7, i64 4001 |
| %i10 = load i64, ptr %i8, align 8 |
| %i11 = getelementptr inbounds i8, ptr %i7, i64 4002 |
| %i13 = load i64, ptr %i11, align 8 |
| %i14 = getelementptr inbounds i8, ptr %i7, i64 4003 |
| %i16 = load i64, ptr %i14, align 8 |
| %i17 = getelementptr inbounds i8, ptr %i7, i64 4006 |
| %i19 = load i64, ptr %i17, align 8 |
| %i20 = mul i64 %i13, %i10 |
| %i21 = mul i64 %i20, %i16 |
| %i22 = mul i64 %i21, %i19 |
| %i23 = add i64 %i22, %i5 |
| %i24 = add nuw i64 %i4, 1 |
| %i25 = icmp ult i64 %i24, %i |
| br i1 %i25, label %bb3, label %bb26 |
| |
| bb26: ; preds = %bb3, %bb |
| %i27 = phi i64 [ 0, %bb ], [ %i23, %bb3 ] |
| %i28 = add i64 %i27, %i |
| ret i64 %i28 |
| } |
| |
| ; test_update_ds_prep_nointeract: |
| ; unsigned long test_update_ds_prep_nointeract(char *p, int count) { |
| ; unsigned long i=0, res=0; |
| ; int DISP1 = 4001; |
| ; int DISP2 = 4002; |
| ; int DISP3 = 4003; |
| ; int DISP4 = 4007; |
| ; for (; i < count ; i++) { |
| ; char x1 = *(p + i + DISP1); |
| ; unsigned long x2 = *(unsigned long *)(p + i + DISP2); |
| ; unsigned long x3 = *(unsigned long *)(p + i + DISP3); |
| ; unsigned long x4 = *(unsigned long *)(p + i + DISP4); |
| ; res += (unsigned long)x1*x2*x3*x4; |
| ; } |
| ; return res + count; |
| ; } |
| |
| define i64 @test_update_ds_prep_nointeract(ptr %arg, i32 signext %arg1) { |
| ; CHECK-LABEL: test_update_ds_prep_nointeract: |
| ; CHECK: # %bb.0: # %bb |
| ; CHECK-NEXT: cmplwi r4, 0 |
| ; CHECK-NEXT: beq cr0, .LBB4_4 |
| ; CHECK-NEXT: # %bb.1: # %bb3.preheader |
| ; CHECK-NEXT: mtctr r4 |
| ; CHECK-NEXT: addi r5, r3, 4000 |
| ; CHECK-NEXT: addi r6, r3, 4003 |
| ; CHECK-NEXT: li r3, 0 |
| ; CHECK-NEXT: li r7, -1 |
| ; CHECK-NEXT: .p2align 4 |
| ; CHECK-NEXT: .LBB4_2: # %bb3 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lbzu r8, 1(r5) |
| ; CHECK-NEXT: ldx r9, r6, r7 |
| ; CHECK-NEXT: ld r10, 0(r6) |
| ; CHECK-NEXT: ld r11, 4(r6) |
| ; CHECK-NEXT: addi r6, r6, 1 |
| ; CHECK-NEXT: mulld r8, r9, r8 |
| ; CHECK-NEXT: mulld r8, r8, r10 |
| ; CHECK-NEXT: maddld r3, r8, r11, r3 |
| ; CHECK-NEXT: bdnz .LBB4_2 |
| ; CHECK-NEXT: # %bb.3: # %bb25 |
| ; CHECK-NEXT: add r3, r3, r4 |
| ; CHECK-NEXT: blr |
| ; CHECK-NEXT: .LBB4_4: |
| ; CHECK-NEXT: addi r3, r4, 0 |
| ; CHECK-NEXT: blr |
| bb: |
| %i = sext i32 %arg1 to i64 |
| %i2 = icmp eq i32 %arg1, 0 |
| br i1 %i2, label %bb25, label %bb3 |
| |
| bb3: ; preds = %bb3, %bb |
| %i4 = phi i64 [ %i23, %bb3 ], [ 0, %bb ] |
| %i5 = phi i64 [ %i22, %bb3 ], [ 0, %bb ] |
| %i6 = getelementptr inbounds i8, ptr %arg, i64 %i4 |
| %i7 = getelementptr inbounds i8, ptr %i6, i64 4001 |
| %i8 = load i8, ptr %i7, align 1 |
| %i9 = getelementptr inbounds i8, ptr %i6, i64 4002 |
| %i11 = load i64, ptr %i9, align 8 |
| %i12 = getelementptr inbounds i8, ptr %i6, i64 4003 |
| %i14 = load i64, ptr %i12, align 8 |
| %i15 = getelementptr inbounds i8, ptr %i6, i64 4007 |
| %i17 = load i64, ptr %i15, align 8 |
| %i18 = zext i8 %i8 to i64 |
| %i19 = mul i64 %i11, %i18 |
| %i20 = mul i64 %i19, %i14 |
| %i21 = mul i64 %i20, %i17 |
| %i22 = add i64 %i21, %i5 |
| %i23 = add nuw i64 %i4, 1 |
| %i24 = icmp ult i64 %i23, %i |
| br i1 %i24, label %bb3, label %bb25 |
| |
| bb25: ; preds = %bb3, %bb |
| %i26 = phi i64 [ 0, %bb ], [ %i22, %bb3 ] |
| %i27 = add i64 %i26, %i |
| ret i64 %i27 |
| } |
| |
| ; test_ds_multiple_chains: |
| ; unsigned long test_ds_multiple_chains(char *p, char *q, int count) { |
| ; unsigned long i=0, res=0; |
| ; int DISP1 = 4001; |
| ; int DISP2 = 4010; |
| ; int DISP3 = 4005; |
| ; int DISP4 = 4009; |
| ; for (; i < count ; i++) { |
| ; unsigned long x1 = *(unsigned long *)(p + i + DISP1); |
| ; unsigned long x2 = *(unsigned long *)(p + i + DISP2); |
| ; unsigned long x3 = *(unsigned long *)(p + i + DISP3); |
| ; unsigned long x4 = *(unsigned long *)(p + i + DISP4); |
| ; unsigned long x5 = *(unsigned long *)(q + i + DISP1); |
| ; unsigned long x6 = *(unsigned long *)(q + i + DISP2); |
| ; unsigned long x7 = *(unsigned long *)(q + i + DISP3); |
| ; unsigned long x8 = *(unsigned long *)(q + i + DISP4); |
| ; res += x1*x2*x3*x4*x5*x6*x7*x8; |
| ; } |
| ; return res + count; |
| ; } |
| |
| define dso_local i64 @test_ds_multiple_chains(ptr %arg, ptr %arg1, i32 signext %arg2) { |
| ; CHECK-LABEL: test_ds_multiple_chains: |
| ; CHECK: # %bb.0: # %bb |
| ; CHECK-NEXT: cmplwi r5, 0 |
| ; CHECK-NEXT: beq cr0, .LBB5_4 |
| ; CHECK-NEXT: # %bb.1: # %bb4.preheader |
| ; CHECK-NEXT: std r30, -16(r1) # 8-byte Folded Spill |
| ; CHECK-NEXT: addi r6, r3, 4001 |
| ; CHECK-NEXT: addi r4, r4, 4001 |
| ; CHECK-NEXT: li r3, 0 |
| ; CHECK-NEXT: li r7, 9 |
| ; CHECK-NEXT: mtctr r5 |
| ; CHECK-NEXT: .p2align 4 |
| ; CHECK-NEXT: .LBB5_2: # %bb4 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: ld r8, 0(r6) |
| ; CHECK-NEXT: ldx r9, r6, r7 |
| ; CHECK-NEXT: ld r10, 4(r6) |
| ; CHECK-NEXT: ld r11, 8(r6) |
| ; CHECK-NEXT: addi r6, r6, 1 |
| ; CHECK-NEXT: mulld r8, r9, r8 |
| ; CHECK-NEXT: ld r12, 0(r4) |
| ; CHECK-NEXT: ldx r0, r4, r7 |
| ; CHECK-NEXT: ld r30, 4(r4) |
| ; CHECK-NEXT: ld r9, 8(r4) |
| ; CHECK-NEXT: addi r4, r4, 1 |
| ; CHECK-NEXT: mulld r8, r8, r10 |
| ; CHECK-NEXT: mulld r8, r8, r11 |
| ; CHECK-NEXT: mulld r8, r8, r12 |
| ; CHECK-NEXT: mulld r8, r8, r0 |
| ; CHECK-NEXT: mulld r8, r8, r30 |
| ; CHECK-NEXT: maddld r3, r8, r9, r3 |
| ; CHECK-NEXT: bdnz .LBB5_2 |
| ; CHECK-NEXT: # %bb.3: |
| ; CHECK-NEXT: ld r30, -16(r1) # 8-byte Folded Reload |
| ; CHECK-NEXT: add r3, r3, r5 |
| ; CHECK-NEXT: blr |
| ; CHECK-NEXT: .LBB5_4: |
| ; CHECK-NEXT: addi r3, r5, 0 |
| ; CHECK-NEXT: blr |
| bb: |
| %i = sext i32 %arg2 to i64 |
| %i3 = icmp eq i32 %arg2, 0 |
| br i1 %i3, label %bb43, label %bb4 |
| |
| bb4: ; preds = %bb4, %bb |
| %i5 = phi i64 [ %i41, %bb4 ], [ 0, %bb ] |
| %i6 = phi i64 [ %i40, %bb4 ], [ 0, %bb ] |
| %i7 = getelementptr inbounds i8, ptr %arg, i64 %i5 |
| %i8 = getelementptr inbounds i8, ptr %i7, i64 4001 |
| %i10 = load i64, ptr %i8, align 8 |
| %i11 = getelementptr inbounds i8, ptr %i7, i64 4010 |
| %i13 = load i64, ptr %i11, align 8 |
| %i14 = getelementptr inbounds i8, ptr %i7, i64 4005 |
| %i16 = load i64, ptr %i14, align 8 |
| %i17 = getelementptr inbounds i8, ptr %i7, i64 4009 |
| %i19 = load i64, ptr %i17, align 8 |
| %i20 = getelementptr inbounds i8, ptr %arg1, i64 %i5 |
| %i21 = getelementptr inbounds i8, ptr %i20, i64 4001 |
| %i23 = load i64, ptr %i21, align 8 |
| %i24 = getelementptr inbounds i8, ptr %i20, i64 4010 |
| %i26 = load i64, ptr %i24, align 8 |
| %i27 = getelementptr inbounds i8, ptr %i20, i64 4005 |
| %i29 = load i64, ptr %i27, align 8 |
| %i30 = getelementptr inbounds i8, ptr %i20, i64 4009 |
| %i32 = load i64, ptr %i30, align 8 |
| %i33 = mul i64 %i13, %i10 |
| %i34 = mul i64 %i33, %i16 |
| %i35 = mul i64 %i34, %i19 |
| %i36 = mul i64 %i35, %i23 |
| %i37 = mul i64 %i36, %i26 |
| %i38 = mul i64 %i37, %i29 |
| %i39 = mul i64 %i38, %i32 |
| %i40 = add i64 %i39, %i6 |
| %i41 = add nuw i64 %i5, 1 |
| %i42 = icmp ult i64 %i41, %i |
| br i1 %i42, label %bb4, label %bb43 |
| |
| bb43: ; preds = %bb4, %bb |
| %i44 = phi i64 [ 0, %bb ], [ %i40, %bb4 ] |
| %i45 = add i64 %i44, %i |
| ret i64 %i45 |
| } |
| |
| ; test_ds_cross_basic_blocks: |
| ;extern char *arr; |
| ;unsigned long foo(char *p, int count) |
| ;{ |
| ; unsigned long i=0, res=0; |
| ; int DISP1 = 4000; |
| ; int DISP2 = 4001; |
| ; int DISP3 = 4002; |
| ; int DISP4 = 4003; |
| ; int DISP5 = 4005; |
| ; int DISP6 = 4009; |
| ; unsigned long x1, x2, x3, x4, x5, x6; |
| ; x1=x2=x3=x4=x5=x6=1; |
| ; for (; i < count ; i++) { |
| ; if (arr[i] % 3 == 1) { |
| ; x1 += *(unsigned long *)(p + i + DISP1); |
| ; x2 += *(unsigned long *)(p + i + DISP2); |
| ; } |
| ; else if (arr[i] % 3 == 2) { |
| ; x3 += *(unsigned long *)(p + i + DISP3); |
| ; x4 += *(unsigned long *)(p + i + DISP5); |
| ; } |
| ; else { |
| ; x5 += *(unsigned long *)(p + i + DISP4); |
| ; x6 += *(unsigned long *)(p + i + DISP6); |
| ; } |
| ; res += x1*x2*x3*x4*x5*x6; |
| ; } |
| ; return res; |
| ;} |
| |
| @arr = external local_unnamed_addr global ptr, align 8 |
| |
| define i64 @test_ds_cross_basic_blocks(ptr %arg, i32 signext %arg1) { |
| ; CHECK-LABEL: test_ds_cross_basic_blocks: |
| ; CHECK: # %bb.0: # %bb |
| ; CHECK-NEXT: cmplwi r4, 0 |
| ; CHECK-NEXT: beq cr0, .LBB6_9 |
| ; CHECK-NEXT: # %bb.1: # %bb3 |
| ; CHECK-NEXT: addis r5, r2, .LC0@toc@ha |
| ; CHECK-NEXT: std r28, -32(r1) # 8-byte Folded Spill |
| ; CHECK-NEXT: std r29, -24(r1) # 8-byte Folded Spill |
| ; CHECK-NEXT: ld r5, .LC0@toc@l(r5) |
| ; CHECK-NEXT: std r30, -16(r1) # 8-byte Folded Spill |
| ; CHECK-NEXT: addi r6, r3, 4009 |
| ; CHECK-NEXT: li r3, 0 |
| ; CHECK-NEXT: li r7, -7 |
| ; CHECK-NEXT: li r8, -6 |
| ; CHECK-NEXT: li r9, 1 |
| ; CHECK-NEXT: li r10, 1 |
| ; CHECK-NEXT: li r11, 1 |
| ; CHECK-NEXT: li r12, 1 |
| ; CHECK-NEXT: li r0, 1 |
| ; CHECK-NEXT: ld r5, 0(r5) |
| ; CHECK-NEXT: mtctr r4 |
| ; CHECK-NEXT: li r4, 1 |
| ; CHECK-NEXT: addi r5, r5, -1 |
| ; CHECK-NEXT: b .LBB6_4 |
| ; CHECK-NEXT: .p2align 4 |
| ; CHECK-NEXT: .LBB6_2: # %bb18 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: addi r30, r6, -9 |
| ; CHECK-NEXT: ld r30, 0(r30) |
| ; CHECK-NEXT: add r0, r30, r0 |
| ; CHECK-NEXT: ld r30, -8(r6) |
| ; CHECK-NEXT: add r12, r30, r12 |
| ; CHECK-NEXT: .LBB6_3: # %bb49 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: mulld r30, r12, r0 |
| ; CHECK-NEXT: addi r6, r6, 1 |
| ; CHECK-NEXT: mulld r30, r30, r11 |
| ; CHECK-NEXT: mulld r30, r30, r10 |
| ; CHECK-NEXT: mulld r30, r30, r9 |
| ; CHECK-NEXT: maddld r3, r30, r4, r3 |
| ; CHECK-NEXT: bdz .LBB6_8 |
| ; CHECK-NEXT: .LBB6_4: # %bb5 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lbzu r30, 1(r5) |
| ; CHECK-NEXT: mulli r29, r30, 171 |
| ; CHECK-NEXT: rlwinm r28, r29, 24, 8, 30 |
| ; CHECK-NEXT: srwi r29, r29, 9 |
| ; CHECK-NEXT: add r29, r29, r28 |
| ; CHECK-NEXT: sub r30, r30, r29 |
| ; CHECK-NEXT: clrlwi r30, r30, 24 |
| ; CHECK-NEXT: cmplwi r30, 1 |
| ; CHECK-NEXT: beq cr0, .LBB6_2 |
| ; CHECK-NEXT: # %bb.5: # %bb28 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: cmplwi r30, 2 |
| ; CHECK-NEXT: bne cr0, .LBB6_7 |
| ; CHECK-NEXT: # %bb.6: # %bb31 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: ldx r30, r6, r7 |
| ; CHECK-NEXT: add r11, r30, r11 |
| ; CHECK-NEXT: ld r30, -4(r6) |
| ; CHECK-NEXT: add r10, r30, r10 |
| ; CHECK-NEXT: b .LBB6_3 |
| ; CHECK-NEXT: .p2align 4 |
| ; CHECK-NEXT: .LBB6_7: # %bb40 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: ldx r30, r6, r8 |
| ; CHECK-NEXT: add r9, r30, r9 |
| ; CHECK-NEXT: ld r30, 0(r6) |
| ; CHECK-NEXT: add r4, r30, r4 |
| ; CHECK-NEXT: b .LBB6_3 |
| ; CHECK-NEXT: .LBB6_8: |
| ; CHECK-NEXT: ld r30, -16(r1) # 8-byte Folded Reload |
| ; CHECK-NEXT: ld r29, -24(r1) # 8-byte Folded Reload |
| ; CHECK-NEXT: ld r28, -32(r1) # 8-byte Folded Reload |
| ; CHECK-NEXT: blr |
| ; CHECK-NEXT: .LBB6_9: |
| ; CHECK-NEXT: li r3, 0 |
| ; CHECK-NEXT: blr |
| bb: |
| %i = sext i32 %arg1 to i64 |
| %i2 = icmp eq i32 %arg1, 0 |
| br i1 %i2, label %bb64, label %bb3 |
| |
| bb3: ; preds = %bb |
| %i4 = load ptr, ptr @arr, align 8 |
| br label %bb5 |
| |
| bb5: ; preds = %bb49, %bb3 |
| %i6 = phi i64 [ 1, %bb3 ], [ %i55, %bb49 ] |
| %i7 = phi i64 [ 1, %bb3 ], [ %i54, %bb49 ] |
| %i8 = phi i64 [ 1, %bb3 ], [ %i53, %bb49 ] |
| %i9 = phi i64 [ 1, %bb3 ], [ %i52, %bb49 ] |
| %i10 = phi i64 [ 1, %bb3 ], [ %i51, %bb49 ] |
| %i11 = phi i64 [ 1, %bb3 ], [ %i50, %bb49 ] |
| %i12 = phi i64 [ 0, %bb3 ], [ %i62, %bb49 ] |
| %i13 = phi i64 [ 0, %bb3 ], [ %i61, %bb49 ] |
| %i14 = getelementptr inbounds i8, ptr %i4, i64 %i12 |
| %i15 = load i8, ptr %i14, align 1 |
| %i16 = urem i8 %i15, 3 |
| %i17 = icmp eq i8 %i16, 1 |
| br i1 %i17, label %bb18, label %bb28 |
| |
| bb18: ; preds = %bb5 |
| %i19 = getelementptr inbounds i8, ptr %arg, i64 %i12 |
| %i20 = getelementptr inbounds i8, ptr %i19, i64 4000 |
| %i22 = load i64, ptr %i20, align 8 |
| %i23 = add i64 %i22, %i11 |
| %i24 = getelementptr inbounds i8, ptr %i19, i64 4001 |
| %i26 = load i64, ptr %i24, align 8 |
| %i27 = add i64 %i26, %i10 |
| br label %bb49 |
| |
| bb28: ; preds = %bb5 |
| %i29 = icmp eq i8 %i16, 2 |
| %i30 = getelementptr inbounds i8, ptr %arg, i64 %i12 |
| br i1 %i29, label %bb31, label %bb40 |
| |
| bb31: ; preds = %bb28 |
| %i32 = getelementptr inbounds i8, ptr %i30, i64 4002 |
| %i34 = load i64, ptr %i32, align 8 |
| %i35 = add i64 %i34, %i9 |
| %i36 = getelementptr inbounds i8, ptr %i30, i64 4005 |
| %i38 = load i64, ptr %i36, align 8 |
| %i39 = add i64 %i38, %i8 |
| br label %bb49 |
| |
| bb40: ; preds = %bb28 |
| %i41 = getelementptr inbounds i8, ptr %i30, i64 4003 |
| %i43 = load i64, ptr %i41, align 8 |
| %i44 = add i64 %i43, %i7 |
| %i45 = getelementptr inbounds i8, ptr %i30, i64 4009 |
| %i47 = load i64, ptr %i45, align 8 |
| %i48 = add i64 %i47, %i6 |
| br label %bb49 |
| |
| bb49: ; preds = %bb40, %bb31, %bb18 |
| %i50 = phi i64 [ %i23, %bb18 ], [ %i11, %bb31 ], [ %i11, %bb40 ] |
| %i51 = phi i64 [ %i27, %bb18 ], [ %i10, %bb31 ], [ %i10, %bb40 ] |
| %i52 = phi i64 [ %i9, %bb18 ], [ %i35, %bb31 ], [ %i9, %bb40 ] |
| %i53 = phi i64 [ %i8, %bb18 ], [ %i39, %bb31 ], [ %i8, %bb40 ] |
| %i54 = phi i64 [ %i7, %bb18 ], [ %i7, %bb31 ], [ %i44, %bb40 ] |
| %i55 = phi i64 [ %i6, %bb18 ], [ %i6, %bb31 ], [ %i48, %bb40 ] |
| %i56 = mul i64 %i51, %i50 |
| %i57 = mul i64 %i56, %i52 |
| %i58 = mul i64 %i57, %i53 |
| %i59 = mul i64 %i58, %i54 |
| %i60 = mul i64 %i59, %i55 |
| %i61 = add i64 %i60, %i13 |
| %i62 = add nuw i64 %i12, 1 |
| %i63 = icmp ult i64 %i62, %i |
| br i1 %i63, label %bb5, label %bb64 |
| |
| bb64: ; preds = %bb49, %bb |
| %i65 = phi i64 [ 0, %bb ], [ %i61, %bb49 ] |
| ret i64 %i65 |
| } |
| |
| ; test_ds_float: |
| ;float test_ds_float(char *p, int count) { |
| ; int i=0 ; |
| ; float res=0; |
| ; int DISP1 = 4001; |
| ; int DISP2 = 4002; |
| ; int DISP3 = 4022; |
| ; int DISP4 = 4062; |
| ; for (; i < count ; i++) { |
| ; float x1 = *(float *)(p + i + DISP1); |
| ; float x2 = *(float *)(p + i + DISP2); |
| ; float x3 = *(float *)(p + i + DISP3); |
| ; float x4 = *(float *)(p + i + DISP4); |
| ; res += x1*x2*x3*x4; |
| ; } |
| ; return res; |
| ;} |
| |
| define float @test_ds_float(ptr %arg, i32 signext %arg1) { |
| ; CHECK-LABEL: test_ds_float: |
| ; CHECK: # %bb.0: # %bb |
| ; CHECK-NEXT: cmpwi r4, 0 |
| ; CHECK-NEXT: ble cr0, .LBB7_4 |
| ; CHECK-NEXT: # %bb.1: # %bb2 |
| ; CHECK-NEXT: clrldi r4, r4, 32 |
| ; CHECK-NEXT: addi r3, r3, 4002 |
| ; CHECK-NEXT: xxlxor f1, f1, f1 |
| ; CHECK-NEXT: mtctr r4 |
| ; CHECK-NEXT: li r4, -1 |
| ; CHECK-NEXT: .p2align 4 |
| ; CHECK-NEXT: .LBB7_2: # %bb4 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lfsx f0, r3, r4 |
| ; CHECK-NEXT: lfs f2, 0(r3) |
| ; CHECK-NEXT: xsmulsp f0, f0, f2 |
| ; CHECK-NEXT: lfs f3, 20(r3) |
| ; CHECK-NEXT: xsmulsp f0, f0, f3 |
| ; CHECK-NEXT: lfs f4, 60(r3) |
| ; CHECK-NEXT: addi r3, r3, 1 |
| ; CHECK-NEXT: xsmulsp f0, f0, f4 |
| ; CHECK-NEXT: xsaddsp f1, f1, f0 |
| ; CHECK-NEXT: bdnz .LBB7_2 |
| ; CHECK-NEXT: # %bb.3: # %bb26 |
| ; CHECK-NEXT: blr |
| ; CHECK-NEXT: .LBB7_4: |
| ; CHECK-NEXT: xxlxor f1, f1, f1 |
| ; CHECK-NEXT: blr |
| bb: |
| %i = icmp sgt i32 %arg1, 0 |
| br i1 %i, label %bb2, label %bb26 |
| |
| bb2: ; preds = %bb |
| %i3 = zext i32 %arg1 to i64 |
| br label %bb4 |
| |
| bb4: ; preds = %bb4, %bb2 |
| %i5 = phi i64 [ 0, %bb2 ], [ %i24, %bb4 ] |
| %i6 = phi float [ 0.000000e+00, %bb2 ], [ %i23, %bb4 ] |
| %i7 = getelementptr inbounds i8, ptr %arg, i64 %i5 |
| %i8 = getelementptr inbounds i8, ptr %i7, i64 4001 |
| %i10 = load float, ptr %i8, align 4 |
| %i11 = getelementptr inbounds i8, ptr %i7, i64 4002 |
| %i13 = load float, ptr %i11, align 4 |
| %i14 = getelementptr inbounds i8, ptr %i7, i64 4022 |
| %i16 = load float, ptr %i14, align 4 |
| %i17 = getelementptr inbounds i8, ptr %i7, i64 4062 |
| %i19 = load float, ptr %i17, align 4 |
| %i20 = fmul float %i10, %i13 |
| %i21 = fmul float %i20, %i16 |
| %i22 = fmul float %i21, %i19 |
| %i23 = fadd float %i6, %i22 |
| %i24 = add nuw nsw i64 %i5, 1 |
| %i25 = icmp eq i64 %i24, %i3 |
| br i1 %i25, label %bb26, label %bb4 |
| |
| bb26: ; preds = %bb4, %bb |
| %i27 = phi float [ 0.000000e+00, %bb ], [ %i23, %bb4 ] |
| ret float %i27 |
| } |
| |
| ; test_ds_combine_float_int: |
| ;float test_ds_combine_float_int(char *p, int count) { |
| ; int i=0 ; |
| ; float res=0; |
| ; int DISP1 = 4001; |
| ; int DISP2 = 4002; |
| ; int DISP3 = 4022; |
| ; int DISP4 = 4062; |
| ; for (; i < count ; i++) { |
| ; float x1 = *(float *)(p + i + DISP1); |
| ; unsigned long x2 = *(unsigned long*)(p + i + DISP2); |
| ; float x3 = *(float *)(p + i + DISP3); |
| ; float x4 = *(float *)(p + i + DISP4); |
| ; res += x1*x2*x3*x4; |
| ; } |
| ; return res; |
| ;} |
| |
| define float @test_ds_combine_float_int(ptr %arg, i32 signext %arg1) { |
| ; CHECK-LABEL: test_ds_combine_float_int: |
| ; CHECK: # %bb.0: # %bb |
| ; CHECK-NEXT: cmpwi r4, 0 |
| ; CHECK-NEXT: ble cr0, .LBB8_4 |
| ; CHECK-NEXT: # %bb.1: # %bb2 |
| ; CHECK-NEXT: clrldi r4, r4, 32 |
| ; CHECK-NEXT: addi r3, r3, 4002 |
| ; CHECK-NEXT: xxlxor f1, f1, f1 |
| ; CHECK-NEXT: mtctr r4 |
| ; CHECK-NEXT: li r4, -1 |
| ; CHECK-NEXT: .p2align 4 |
| ; CHECK-NEXT: .LBB8_2: # %bb4 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lfd f4, 0(r3) |
| ; CHECK-NEXT: lfsx f0, r3, r4 |
| ; CHECK-NEXT: xscvuxdsp f4, f4 |
| ; CHECK-NEXT: lfs f2, 20(r3) |
| ; CHECK-NEXT: lfs f3, 60(r3) |
| ; CHECK-NEXT: addi r3, r3, 1 |
| ; CHECK-NEXT: xsmulsp f0, f0, f4 |
| ; CHECK-NEXT: xsmulsp f0, f2, f0 |
| ; CHECK-NEXT: xsmulsp f0, f3, f0 |
| ; CHECK-NEXT: xsaddsp f1, f1, f0 |
| ; CHECK-NEXT: bdnz .LBB8_2 |
| ; CHECK-NEXT: # %bb.3: # %bb27 |
| ; CHECK-NEXT: blr |
| ; CHECK-NEXT: .LBB8_4: |
| ; CHECK-NEXT: xxlxor f1, f1, f1 |
| ; CHECK-NEXT: blr |
| bb: |
| %i = icmp sgt i32 %arg1, 0 |
| br i1 %i, label %bb2, label %bb27 |
| |
| bb2: ; preds = %bb |
| %i3 = zext i32 %arg1 to i64 |
| br label %bb4 |
| |
| bb4: ; preds = %bb4, %bb2 |
| %i5 = phi i64 [ 0, %bb2 ], [ %i25, %bb4 ] |
| %i6 = phi float [ 0.000000e+00, %bb2 ], [ %i24, %bb4 ] |
| %i7 = getelementptr inbounds i8, ptr %arg, i64 %i5 |
| %i8 = getelementptr inbounds i8, ptr %i7, i64 4001 |
| %i10 = load float, ptr %i8, align 4 |
| %i11 = getelementptr inbounds i8, ptr %i7, i64 4002 |
| %i13 = load i64, ptr %i11, align 8 |
| %i14 = getelementptr inbounds i8, ptr %i7, i64 4022 |
| %i16 = load float, ptr %i14, align 4 |
| %i17 = getelementptr inbounds i8, ptr %i7, i64 4062 |
| %i19 = load float, ptr %i17, align 4 |
| %i20 = uitofp i64 %i13 to float |
| %i21 = fmul float %i10, %i20 |
| %i22 = fmul float %i16, %i21 |
| %i23 = fmul float %i19, %i22 |
| %i24 = fadd float %i6, %i23 |
| %i25 = add nuw nsw i64 %i5, 1 |
| %i26 = icmp eq i64 %i25, %i3 |
| br i1 %i26, label %bb27, label %bb4 |
| |
| bb27: ; preds = %bb4, %bb |
| %i28 = phi float [ 0.000000e+00, %bb ], [ %i24, %bb4 ] |
| ret float %i28 |
| } |
| |
| ; test_ds_lwa_prep: |
| ; long long test_ds_lwa_prep(char *p, int count) { |
| ; long long i=0, res=0; |
| ; int DISP1 = 4001; |
| ; int DISP2 = 4002; |
| ; int DISP3 = 4006; |
| ; int DISP4 = 4010; |
| ; for (; i < count ; i++) { |
| ; long long x1 = *(int *)(p + i + DISP1); |
| ; long long x2 = *(int *)(p + i + DISP2); |
| ; long long x3 = *(int *)(p + i + DISP3); |
| ; long long x4 = *(int *)(p + i + DISP4); |
| ; res += x1*x2*x3*x4; |
| ; } |
| ; return res + count; |
| ; } |
| |
| define i64 @test_ds_lwa_prep(ptr %arg, i32 signext %arg1) { |
| ; CHECK-LABEL: test_ds_lwa_prep: |
| ; CHECK: # %bb.0: # %bb |
| ; CHECK-NEXT: cmpwi r4, 0 |
| ; CHECK-NEXT: ble cr0, .LBB9_4 |
| ; CHECK-NEXT: # %bb.1: # %bb3.preheader |
| ; CHECK-NEXT: mtctr r4 |
| ; CHECK-NEXT: addi r5, r3, 2 |
| ; CHECK-NEXT: li r3, 0 |
| ; CHECK-NEXT: li r6, -1 |
| ; CHECK-NEXT: .p2align 4 |
| ; CHECK-NEXT: .LBB9_2: # %bb3 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwax r7, r5, r6 |
| ; CHECK-NEXT: lwa r8, 0(r5) |
| ; CHECK-NEXT: lwa r9, 4(r5) |
| ; CHECK-NEXT: lwa r10, 8(r5) |
| ; CHECK-NEXT: addi r5, r5, 1 |
| ; CHECK-NEXT: mulld r7, r8, r7 |
| ; CHECK-NEXT: mulld r7, r7, r9 |
| ; CHECK-NEXT: maddld r3, r7, r10, r3 |
| ; CHECK-NEXT: bdnz .LBB9_2 |
| ; CHECK-NEXT: # %bb.3: # %bb29 |
| ; CHECK-NEXT: add r3, r3, r4 |
| ; CHECK-NEXT: blr |
| ; CHECK-NEXT: .LBB9_4: |
| ; CHECK-NEXT: addi r3, r4, 0 |
| ; CHECK-NEXT: blr |
| bb: |
| %i = sext i32 %arg1 to i64 |
| %i2 = icmp sgt i32 %arg1, 0 |
| br i1 %i2, label %bb3, label %bb29 |
| |
| bb3: ; preds = %bb3, %bb |
| %i4 = phi i64 [ %i27, %bb3 ], [ 0, %bb ] |
| %i5 = phi i64 [ %i26, %bb3 ], [ 0, %bb ] |
| %i6 = getelementptr inbounds i8, ptr %arg, i64 %i4 |
| %i7 = getelementptr inbounds i8, ptr %i6, i64 1 |
| %i9 = load i32, ptr %i7, align 4 |
| %i10 = sext i32 %i9 to i64 |
| %i11 = getelementptr inbounds i8, ptr %i6, i64 2 |
| %i13 = load i32, ptr %i11, align 4 |
| %i14 = sext i32 %i13 to i64 |
| %i15 = getelementptr inbounds i8, ptr %i6, i64 6 |
| %i17 = load i32, ptr %i15, align 4 |
| %i18 = sext i32 %i17 to i64 |
| %i19 = getelementptr inbounds i8, ptr %i6, i64 10 |
| %i21 = load i32, ptr %i19, align 4 |
| %i22 = sext i32 %i21 to i64 |
| %i23 = mul nsw i64 %i14, %i10 |
| %i24 = mul nsw i64 %i23, %i18 |
| %i25 = mul nsw i64 %i24, %i22 |
| %i26 = add nsw i64 %i25, %i5 |
| %i27 = add nuw nsw i64 %i4, 1 |
| %i28 = icmp eq i64 %i27, %i |
| br i1 %i28, label %bb29, label %bb3 |
| |
| bb29: ; preds = %bb3, %bb |
| %i30 = phi i64 [ 0, %bb ], [ %i26, %bb3 ] |
| %i31 = add nsw i64 %i30, %i |
| ret i64 %i31 |
| } |
| |