xref: /llvm-project/llvm/test/Transforms/ConstantHoisting/ARM/const-addr-no-neg-offset.ll (revision 055fb7795aa219a3d274d280ec9129784f169f56)
1; RUN: opt -mtriple=arm-arm-none-eabi -passes=consthoist -S < %s | FileCheck %s
2; RUN: opt -mtriple=arm-arm-none-eabi -passes='require<profile-summary>,consthoist' -pgso -S < %s | FileCheck %s -check-prefix=PGSO
3; RUN: opt -mtriple=arm-arm-none-eabi -passes=consthoist -pgso=false -S < %s | FileCheck %s -check-prefix=NPGSO
4
5; There are different candidates here for the base constant: 1073876992 and
6; 1073876996. But we don't want to see the latter because it results in
7; negative offsets.
8
9define void @foo() #0 {
10entry:
11; CHECK-LABEL: @foo
12; CHECK-NOT: [[CONST1:%const_mat[0-9]*]] = add i32 %const, -4
13; CHECK-LABEL: @foo_pgso
14  %0 = load volatile i32, ptr inttoptr (i32 1073876992 to ptr), align 4096
15  %or = or i32 %0, 1
16  store volatile i32 %or, ptr inttoptr (i32 1073876992 to ptr), align 4096
17  %1 = load volatile i32, ptr inttoptr (i32 1073876996 to ptr), align 4
18  %and = and i32 %1, -117506048
19  store volatile i32 %and, ptr inttoptr (i32 1073876996 to ptr), align 4
20  %2 = load volatile i32, ptr inttoptr (i32 1073876992 to ptr), align 4096
21  %and1 = and i32 %2, -17367041
22  store volatile i32 %and1, ptr inttoptr (i32 1073876996 to ptr), align 4096
23  %3 = load volatile i32, ptr inttoptr (i32 1073876992 to ptr), align 4096
24  %and2 = and i32 %3, -262145
25  store volatile i32 %and2, ptr inttoptr (i32 1073876992 to ptr), align 4096
26  %4 = load volatile i32, ptr inttoptr (i32 1073876996 to ptr), align 4
27  %and3 = and i32 %4, -8323073
28  store volatile i32 %and3, ptr inttoptr (i32 1073876996 to ptr), align 4
29  store volatile i32 10420224, ptr inttoptr (i32 1073877000 to ptr), align 8
30  %5 = load volatile i32, ptr inttoptr (i32 1073876996 to ptr), align 4096
31  %or4 = or i32 %5, 65536
32  store volatile i32 %or4, ptr inttoptr (i32 1073876996 to ptr), align 4096
33  %6 = load volatile i32, ptr inttoptr (i32 1073881088 to ptr), align 8192
34  %or6.i.i = or i32 %6, 16
35  store volatile i32 %or6.i.i, ptr inttoptr (i32 1073881088 to ptr), align 8192
36  %7 = load volatile i32, ptr inttoptr (i32 1073881088 to ptr), align 8192
37  %and7.i.i = and i32 %7, -4
38  store volatile i32 %and7.i.i, ptr inttoptr (i32 1073881088 to ptr), align 8192
39  %8 = load volatile i32, ptr inttoptr (i32 1073881088 to ptr), align 8192
40  %or8.i.i = or i32 %8, 2
41  store volatile i32 %or8.i.i, ptr inttoptr (i32 1073881088 to ptr), align 8192
42  ret void
43}
44
45attributes #0 = { minsize norecurse nounwind optsize readnone uwtable }
46
47define void @foo_pgso() #1 !prof !14 {
48entry:
49; PGSO-LABEL: @foo_pgso
50; PGSO-NOT: [[CONST2:%const_mat[0-9]*]] = add i32 %const, -4
51; NPGSO-LABEL: @foo_pgso
52; NPGSO: [[CONST2:%const_mat[0-9]*]] = add i32 %const, -4
53  %0 = load volatile i32, ptr inttoptr (i32 1073876992 to ptr), align 4096
54  %or = or i32 %0, 1
55  store volatile i32 %or, ptr inttoptr (i32 1073876992 to ptr), align 4096
56  %1 = load volatile i32, ptr inttoptr (i32 1073876996 to ptr), align 4
57  %and = and i32 %1, -117506048
58  store volatile i32 %and, ptr inttoptr (i32 1073876996 to ptr), align 4
59  %2 = load volatile i32, ptr inttoptr (i32 1073876992 to ptr), align 4096
60  %and1 = and i32 %2, -17367041
61  store volatile i32 %and1, ptr inttoptr (i32 1073876996 to ptr), align 4096
62  %3 = load volatile i32, ptr inttoptr (i32 1073876992 to ptr), align 4096
63  %and2 = and i32 %3, -262145
64  store volatile i32 %and2, ptr inttoptr (i32 1073876992 to ptr), align 4096
65  %4 = load volatile i32, ptr inttoptr (i32 1073876996 to ptr), align 4
66  %and3 = and i32 %4, -8323073
67  store volatile i32 %and3, ptr inttoptr (i32 1073876996 to ptr), align 4
68  store volatile i32 10420224, ptr inttoptr (i32 1073877000 to ptr), align 8
69  %5 = load volatile i32, ptr inttoptr (i32 1073876996 to ptr), align 4096
70  %or4 = or i32 %5, 65536
71  store volatile i32 %or4, ptr inttoptr (i32 1073876996 to ptr), align 4096
72  %6 = load volatile i32, ptr inttoptr (i32 1073881088 to ptr), align 8192
73  %or6.i.i = or i32 %6, 16
74  store volatile i32 %or6.i.i, ptr inttoptr (i32 1073881088 to ptr), align 8192
75  %7 = load volatile i32, ptr inttoptr (i32 1073881088 to ptr), align 8192
76  %and7.i.i = and i32 %7, -4
77  store volatile i32 %and7.i.i, ptr inttoptr (i32 1073881088 to ptr), align 8192
78  %8 = load volatile i32, ptr inttoptr (i32 1073881088 to ptr), align 8192
79  %or8.i.i = or i32 %8, 2
80  store volatile i32 %or8.i.i, ptr inttoptr (i32 1073881088 to ptr), align 8192
81  ret void
82}
83
84attributes #1 = { norecurse nounwind readnone uwtable }  ; no optsize or minsize
85
86!llvm.module.flags = !{!0}
87!0 = !{i32 1, !"ProfileSummary", !1}
88!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}
89!2 = !{!"ProfileFormat", !"InstrProf"}
90!3 = !{!"TotalCount", i64 10000}
91!4 = !{!"MaxCount", i64 10}
92!5 = !{!"MaxInternalCount", i64 1}
93!6 = !{!"MaxFunctionCount", i64 1000}
94!7 = !{!"NumCounts", i64 3}
95!8 = !{!"NumFunctions", i64 3}
96!9 = !{!"DetailedSummary", !10}
97!10 = !{!11, !12, !13}
98!11 = !{i32 10000, i64 100, i32 1}
99!12 = !{i32 999000, i64 100, i32 1}
100!13 = !{i32 999999, i64 1, i32 2}
101!14 = !{!"function_entry_count", i64 0}
102