| ; 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 | |
| } | |