blob: 0d659eb0a4b26b24fe77c850808f8a0f16eb3ab2 [file] [log] [blame]
Chad Rosiercdfd7e72016-03-18 19:21:02 +00001; REQUIRES: asserts
2; RUN: llc < %s -mtriple=arm64-linux-gnu -mcpu=cortex-a57 -verify-misched -debug-only=misched -o - 2>&1 > /dev/null | FileCheck %s
3
4; Test ldr clustering.
5; CHECK: ********** MI Scheduling **********
6; CHECK-LABEL: ldr_int:BB#0
7; CHECK: Cluster loads SU(1) - SU(2)
8; CHECK: SU(1): %vreg{{[0-9]+}}<def> = LDRWui
9; CHECK: SU(2): %vreg{{[0-9]+}}<def> = LDRWui
10define i32 @ldr_int(i32* %a) nounwind {
11 %p1 = getelementptr inbounds i32, i32* %a, i32 1
12 %tmp1 = load i32, i32* %p1, align 2
13 %p2 = getelementptr inbounds i32, i32* %a, i32 2
14 %tmp2 = load i32, i32* %p2, align 2
15 %tmp3 = add i32 %tmp1, %tmp2
16 ret i32 %tmp3
17}
18
19; Test ldpsw clustering
20; CHECK: ********** MI Scheduling **********
21; CHECK-LABEL: ldp_sext_int:BB#0
22; CHECK: Cluster loads SU(1) - SU(2)
23; CHECK: SU(1): %vreg{{[0-9]+}}<def> = LDRSWui
24; CHECK: SU(2): %vreg{{[0-9]+}}<def> = LDRSWui
25define i64 @ldp_sext_int(i32* %p) nounwind {
26 %tmp = load i32, i32* %p, align 4
27 %add.ptr = getelementptr inbounds i32, i32* %p, i64 1
28 %tmp1 = load i32, i32* %add.ptr, align 4
29 %sexttmp = sext i32 %tmp to i64
30 %sexttmp1 = sext i32 %tmp1 to i64
31 %add = add nsw i64 %sexttmp1, %sexttmp
32 ret i64 %add
33}
34
35; Test ldur clustering.
36; CHECK: ********** MI Scheduling **********
37; CHECK-LABEL: ldur_int:BB#0
38; CHECK: Cluster loads SU(2) - SU(1)
39; CHECK: SU(1): %vreg{{[0-9]+}}<def> = LDURWi
40; CHECK: SU(2): %vreg{{[0-9]+}}<def> = LDURWi
41define i32 @ldur_int(i32* %a) nounwind {
42 %p1 = getelementptr inbounds i32, i32* %a, i32 -1
43 %tmp1 = load i32, i32* %p1, align 2
44 %p2 = getelementptr inbounds i32, i32* %a, i32 -2
45 %tmp2 = load i32, i32* %p2, align 2
46 %tmp3 = add i32 %tmp1, %tmp2
47 ret i32 %tmp3
48}
49
50; Test sext + zext clustering.
51; CHECK: ********** MI Scheduling **********
52; CHECK-LABEL: ldp_half_sext_zext_int:BB#0
53; CHECK: Cluster loads SU(3) - SU(4)
54; CHECK: SU(3): %vreg{{[0-9]+}}<def> = LDRSWui
55; CHECK: SU(4): %vreg{{[0-9]+}}:sub_32<def,read-undef> = LDRWui
56define i64 @ldp_half_sext_zext_int(i64* %q, i32* %p) nounwind {
57 %tmp0 = load i64, i64* %q, align 4
58 %tmp = load i32, i32* %p, align 4
59 %add.ptr = getelementptr inbounds i32, i32* %p, i64 1
60 %tmp1 = load i32, i32* %add.ptr, align 4
61 %sexttmp = sext i32 %tmp to i64
62 %sexttmp1 = zext i32 %tmp1 to i64
63 %add = add nsw i64 %sexttmp1, %sexttmp
64 %add1 = add nsw i64 %add, %tmp0
65 ret i64 %add1
66}
67
68; Test zext + sext clustering.
69; CHECK: ********** MI Scheduling **********
70; CHECK-LABEL: ldp_half_zext_sext_int:BB#0
71; CHECK: Cluster loads SU(3) - SU(4)
72; CHECK: SU(3): %vreg{{[0-9]+}}:sub_32<def,read-undef> = LDRWui
73; CHECK: SU(4): %vreg{{[0-9]+}}<def> = LDRSWui
74define i64 @ldp_half_zext_sext_int(i64* %q, i32* %p) nounwind {
75 %tmp0 = load i64, i64* %q, align 4
76 %tmp = load i32, i32* %p, align 4
77 %add.ptr = getelementptr inbounds i32, i32* %p, i64 1
78 %tmp1 = load i32, i32* %add.ptr, align 4
79 %sexttmp = zext i32 %tmp to i64
80 %sexttmp1 = sext i32 %tmp1 to i64
81 %add = add nsw i64 %sexttmp1, %sexttmp
82 %add1 = add nsw i64 %add, %tmp0
83 ret i64 %add1
84}
85
86; Verify we don't cluster volatile loads.
87; CHECK: ********** MI Scheduling **********
88; CHECK-LABEL: ldr_int_volatile:BB#0
89; CHECK-NOT: Cluster loads
90; CHECK: SU(1): %vreg{{[0-9]+}}<def> = LDRWui
91; CHECK: SU(2): %vreg{{[0-9]+}}<def> = LDRWui
92define i32 @ldr_int_volatile(i32* %a) nounwind {
93 %p1 = getelementptr inbounds i32, i32* %a, i32 1
94 %tmp1 = load volatile i32, i32* %p1, align 2
95 %p2 = getelementptr inbounds i32, i32* %a, i32 2
96 %tmp2 = load volatile i32, i32* %p2, align 2
97 %tmp3 = add i32 %tmp1, %tmp2
98 ret i32 %tmp3
99}