1*9880d681SAndroid Build Coastguard Worker; REQUIRES: asserts 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm64-linux-gnu -mcpu=cortex-a57 -verify-misched -debug-only=misched -o - 2>&1 > /dev/null | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm64-linux-gnu -mcpu=exynos-m1 -verify-misched -debug-only=misched -o - 2>&1 > /dev/null | FileCheck --check-prefix=EXYNOS %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Test ldr clustering. 6*9880d681SAndroid Build Coastguard Worker; CHECK: ********** MI Scheduling ********** 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldr_int:BB#0 8*9880d681SAndroid Build Coastguard Worker; CHECK: Cluster ld/st SU(1) - SU(2) 9*9880d681SAndroid Build Coastguard Worker; CHECK: SU(1): %vreg{{[0-9]+}}<def> = LDRWui 10*9880d681SAndroid Build Coastguard Worker; CHECK: SU(2): %vreg{{[0-9]+}}<def> = LDRWui 11*9880d681SAndroid Build Coastguard Worker; EXYNOS: ********** MI Scheduling ********** 12*9880d681SAndroid Build Coastguard Worker; EXYNOS-LABEL: ldr_int:BB#0 13*9880d681SAndroid Build Coastguard Worker; EXYNOS: Cluster ld/st SU(1) - SU(2) 14*9880d681SAndroid Build Coastguard Worker; EXYNOS: SU(1): %vreg{{[0-9]+}}<def> = LDRWui 15*9880d681SAndroid Build Coastguard Worker; EXYNOS: SU(2): %vreg{{[0-9]+}}<def> = LDRWui 16*9880d681SAndroid Build Coastguard Workerdefine i32 @ldr_int(i32* %a) nounwind { 17*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i32, i32* %a, i32 1 18*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %p1, align 2 19*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds i32, i32* %a, i32 2 20*9880d681SAndroid Build Coastguard Worker %tmp2 = load i32, i32* %p2, align 2 21*9880d681SAndroid Build Coastguard Worker %tmp3 = add i32 %tmp1, %tmp2 22*9880d681SAndroid Build Coastguard Worker ret i32 %tmp3 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; Test ldpsw clustering 26*9880d681SAndroid Build Coastguard Worker; CHECK: ********** MI Scheduling ********** 27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_sext_int:BB#0 28*9880d681SAndroid Build Coastguard Worker; CHECK: Cluster ld/st SU(1) - SU(2) 29*9880d681SAndroid Build Coastguard Worker; CHECK: SU(1): %vreg{{[0-9]+}}<def> = LDRSWui 30*9880d681SAndroid Build Coastguard Worker; CHECK: SU(2): %vreg{{[0-9]+}}<def> = LDRSWui 31*9880d681SAndroid Build Coastguard Worker; EXYNOS: ********** MI Scheduling ********** 32*9880d681SAndroid Build Coastguard Worker; EXYNOS-LABEL: ldp_sext_int:BB#0 33*9880d681SAndroid Build Coastguard Worker; EXYNOS: Cluster ld/st SU(1) - SU(2) 34*9880d681SAndroid Build Coastguard Worker; EXYNOS: SU(1): %vreg{{[0-9]+}}<def> = LDRSWui 35*9880d681SAndroid Build Coastguard Worker; EXYNOS: SU(2): %vreg{{[0-9]+}}<def> = LDRSWui 36*9880d681SAndroid Build Coastguard Workerdefine i64 @ldp_sext_int(i32* %p) nounwind { 37*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %p, align 4 38*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds i32, i32* %p, i64 1 39*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %add.ptr, align 4 40*9880d681SAndroid Build Coastguard Worker %sexttmp = sext i32 %tmp to i64 41*9880d681SAndroid Build Coastguard Worker %sexttmp1 = sext i32 %tmp1 to i64 42*9880d681SAndroid Build Coastguard Worker %add = add nsw i64 %sexttmp1, %sexttmp 43*9880d681SAndroid Build Coastguard Worker ret i64 %add 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker; Test ldur clustering. 47*9880d681SAndroid Build Coastguard Worker; CHECK: ********** MI Scheduling ********** 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldur_int:BB#0 49*9880d681SAndroid Build Coastguard Worker; CHECK: Cluster ld/st SU(2) - SU(1) 50*9880d681SAndroid Build Coastguard Worker; CHECK: SU(1): %vreg{{[0-9]+}}<def> = LDURWi 51*9880d681SAndroid Build Coastguard Worker; CHECK: SU(2): %vreg{{[0-9]+}}<def> = LDURWi 52*9880d681SAndroid Build Coastguard Worker; EXYNOS: ********** MI Scheduling ********** 53*9880d681SAndroid Build Coastguard Worker; EXYNOS-LABEL: ldur_int:BB#0 54*9880d681SAndroid Build Coastguard Worker; EXYNOS: Cluster ld/st SU(2) - SU(1) 55*9880d681SAndroid Build Coastguard Worker; EXYNOS: SU(1): %vreg{{[0-9]+}}<def> = LDURWi 56*9880d681SAndroid Build Coastguard Worker; EXYNOS: SU(2): %vreg{{[0-9]+}}<def> = LDURWi 57*9880d681SAndroid Build Coastguard Workerdefine i32 @ldur_int(i32* %a) nounwind { 58*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i32, i32* %a, i32 -1 59*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %p1, align 2 60*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds i32, i32* %a, i32 -2 61*9880d681SAndroid Build Coastguard Worker %tmp2 = load i32, i32* %p2, align 2 62*9880d681SAndroid Build Coastguard Worker %tmp3 = add i32 %tmp1, %tmp2 63*9880d681SAndroid Build Coastguard Worker ret i32 %tmp3 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker; Test sext + zext clustering. 67*9880d681SAndroid Build Coastguard Worker; CHECK: ********** MI Scheduling ********** 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_half_sext_zext_int:BB#0 69*9880d681SAndroid Build Coastguard Worker; CHECK: Cluster ld/st SU(3) - SU(4) 70*9880d681SAndroid Build Coastguard Worker; CHECK: SU(3): %vreg{{[0-9]+}}<def> = LDRSWui 71*9880d681SAndroid Build Coastguard Worker; CHECK: SU(4): %vreg{{[0-9]+}}:sub_32<def,read-undef> = LDRWui 72*9880d681SAndroid Build Coastguard Worker; EXYNOS: ********** MI Scheduling ********** 73*9880d681SAndroid Build Coastguard Worker; EXYNOS-LABEL: ldp_half_sext_zext_int:BB#0 74*9880d681SAndroid Build Coastguard Worker; EXYNOS: Cluster ld/st SU(3) - SU(4) 75*9880d681SAndroid Build Coastguard Worker; EXYNOS: SU(3): %vreg{{[0-9]+}}<def> = LDRSWui 76*9880d681SAndroid Build Coastguard Worker; EXYNOS: SU(4): %vreg{{[0-9]+}}:sub_32<def,read-undef> = LDRWui 77*9880d681SAndroid Build Coastguard Workerdefine i64 @ldp_half_sext_zext_int(i64* %q, i32* %p) nounwind { 78*9880d681SAndroid Build Coastguard Worker %tmp0 = load i64, i64* %q, align 4 79*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %p, align 4 80*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds i32, i32* %p, i64 1 81*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %add.ptr, align 4 82*9880d681SAndroid Build Coastguard Worker %sexttmp = sext i32 %tmp to i64 83*9880d681SAndroid Build Coastguard Worker %sexttmp1 = zext i32 %tmp1 to i64 84*9880d681SAndroid Build Coastguard Worker %add = add nsw i64 %sexttmp1, %sexttmp 85*9880d681SAndroid Build Coastguard Worker %add1 = add nsw i64 %add, %tmp0 86*9880d681SAndroid Build Coastguard Worker ret i64 %add1 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker; Test zext + sext clustering. 90*9880d681SAndroid Build Coastguard Worker; CHECK: ********** MI Scheduling ********** 91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_half_zext_sext_int:BB#0 92*9880d681SAndroid Build Coastguard Worker; CHECK: Cluster ld/st SU(3) - SU(4) 93*9880d681SAndroid Build Coastguard Worker; CHECK: SU(3): %vreg{{[0-9]+}}:sub_32<def,read-undef> = LDRWui 94*9880d681SAndroid Build Coastguard Worker; CHECK: SU(4): %vreg{{[0-9]+}}<def> = LDRSWui 95*9880d681SAndroid Build Coastguard Worker; EXYNOS: ********** MI Scheduling ********** 96*9880d681SAndroid Build Coastguard Worker; EXYNOS-LABEL: ldp_half_zext_sext_int:BB#0 97*9880d681SAndroid Build Coastguard Worker; EXYNOS: Cluster ld/st SU(3) - SU(4) 98*9880d681SAndroid Build Coastguard Worker; EXYNOS: SU(3): %vreg{{[0-9]+}}:sub_32<def,read-undef> = LDRWui 99*9880d681SAndroid Build Coastguard Worker; EXYNOS: SU(4): %vreg{{[0-9]+}}<def> = LDRSWui 100*9880d681SAndroid Build Coastguard Workerdefine i64 @ldp_half_zext_sext_int(i64* %q, i32* %p) nounwind { 101*9880d681SAndroid Build Coastguard Worker %tmp0 = load i64, i64* %q, align 4 102*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %p, align 4 103*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds i32, i32* %p, i64 1 104*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %add.ptr, align 4 105*9880d681SAndroid Build Coastguard Worker %sexttmp = zext i32 %tmp to i64 106*9880d681SAndroid Build Coastguard Worker %sexttmp1 = sext i32 %tmp1 to i64 107*9880d681SAndroid Build Coastguard Worker %add = add nsw i64 %sexttmp1, %sexttmp 108*9880d681SAndroid Build Coastguard Worker %add1 = add nsw i64 %add, %tmp0 109*9880d681SAndroid Build Coastguard Worker ret i64 %add1 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker; Verify we don't cluster volatile loads. 113*9880d681SAndroid Build Coastguard Worker; CHECK: ********** MI Scheduling ********** 114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldr_int_volatile:BB#0 115*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: Cluster ld/st 116*9880d681SAndroid Build Coastguard Worker; CHECK: SU(1): %vreg{{[0-9]+}}<def> = LDRWui 117*9880d681SAndroid Build Coastguard Worker; CHECK: SU(2): %vreg{{[0-9]+}}<def> = LDRWui 118*9880d681SAndroid Build Coastguard Worker; EXYNOS: ********** MI Scheduling ********** 119*9880d681SAndroid Build Coastguard Worker; EXYNOS-LABEL: ldr_int_volatile:BB#0 120*9880d681SAndroid Build Coastguard Worker; EXYNOS-NOT: Cluster ld/st 121*9880d681SAndroid Build Coastguard Worker; EXYNOS: SU(1): %vreg{{[0-9]+}}<def> = LDRWui 122*9880d681SAndroid Build Coastguard Worker; EXYNOS: SU(2): %vreg{{[0-9]+}}<def> = LDRWui 123*9880d681SAndroid Build Coastguard Workerdefine i32 @ldr_int_volatile(i32* %a) nounwind { 124*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i32, i32* %a, i32 1 125*9880d681SAndroid Build Coastguard Worker %tmp1 = load volatile i32, i32* %p1, align 2 126*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds i32, i32* %a, i32 2 127*9880d681SAndroid Build Coastguard Worker %tmp2 = load volatile i32, i32* %p2, align 2 128*9880d681SAndroid Build Coastguard Worker %tmp3 = add i32 %tmp1, %tmp2 129*9880d681SAndroid Build Coastguard Worker ret i32 %tmp3 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker; Test ldq clustering (no clustering for Exynos). 133*9880d681SAndroid Build Coastguard Worker; CHECK: ********** MI Scheduling ********** 134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldq_cluster:BB#0 135*9880d681SAndroid Build Coastguard Worker; CHECK: Cluster ld/st SU(1) - SU(3) 136*9880d681SAndroid Build Coastguard Worker; CHECK: SU(1): %vreg{{[0-9]+}}<def> = LDRQui 137*9880d681SAndroid Build Coastguard Worker; CHECK: SU(3): %vreg{{[0-9]+}}<def> = LDRQui 138*9880d681SAndroid Build Coastguard Worker; EXYNOS: ********** MI Scheduling ********** 139*9880d681SAndroid Build Coastguard Worker; EXYNOS-LABEL: ldq_cluster:BB#0 140*9880d681SAndroid Build Coastguard Worker; EXYNOS-NOT: Cluster ld/st 141*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @ldq_cluster(i64* %p) { 142*9880d681SAndroid Build Coastguard Worker %a1 = bitcast i64* %p to <2 x i64>* 143*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i64>, < 2 x i64>* %a1, align 8 144*9880d681SAndroid Build Coastguard Worker %add.ptr2 = getelementptr inbounds i64, i64* %p, i64 2 145*9880d681SAndroid Build Coastguard Worker %a2 = bitcast i64* %add.ptr2 to <2 x i64>* 146*9880d681SAndroid Build Coastguard Worker %tmp2 = add nsw <2 x i64> %tmp1, %tmp1 147*9880d681SAndroid Build Coastguard Worker %tmp3 = load <2 x i64>, <2 x i64>* %a2, align 8 148*9880d681SAndroid Build Coastguard Worker %res = mul nsw <2 x i64> %tmp2, %tmp3 149*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %res 150*9880d681SAndroid Build Coastguard Worker} 151