xref: /llvm-project/llvm/test/Transforms/IRNormalizer/reordering.ll (revision 2e9f8696e9533fdd464e025bd504302fa1a22f14)
1*2e9f8696SJustin Fargnoli; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2*2e9f8696SJustin Fargnoli; RUN: opt -S -passes=normalize -verify-each -norm-rename-all=false < %s | FileCheck %s
3*2e9f8696SJustin Fargnoli
4*2e9f8696SJustin Fargnolidefine void @foo() {
5*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @foo() {
6*2e9f8696SJustin Fargnoli; CHECK-NEXT:  bb17254:
7*2e9f8696SJustin Fargnoli; CHECK-NEXT:    ret void
8*2e9f8696SJustin Fargnoli;
9*2e9f8696SJustin Fargnoli  ret void
10*2e9f8696SJustin Fargnoli}
11*2e9f8696SJustin Fargnoli
12*2e9f8696SJustin Fargnolidefine void @empty_basic_block() {
13*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @empty_basic_block() {
14*2e9f8696SJustin Fargnoli; CHECK-NEXT:  exit:
15*2e9f8696SJustin Fargnoli; CHECK-NEXT:    ret void
16*2e9f8696SJustin Fargnoli;
17*2e9f8696SJustin Fargnoliexit:
18*2e9f8696SJustin Fargnoli  ret void
19*2e9f8696SJustin Fargnoli}
20*2e9f8696SJustin Fargnoli
21*2e9f8696SJustin Fargnolideclare void @effecting()
22*2e9f8696SJustin Fargnoli
23*2e9f8696SJustin Fargnoli; Place dead instruction(s) before the terminator
24*2e9f8696SJustin Fargnolidefine void @call_effecting() {
25*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @call_effecting() {
26*2e9f8696SJustin Fargnoli; CHECK-NEXT:  bb15160:
27*2e9f8696SJustin Fargnoli; CHECK-NEXT:    call void @effecting()
28*2e9f8696SJustin Fargnoli; CHECK-NEXT:    [[TMP0:%.*]] = add i32 0, 1
29*2e9f8696SJustin Fargnoli; CHECK-NEXT:    ret void
30*2e9f8696SJustin Fargnoli;
31*2e9f8696SJustin Fargnoli  %1 = add i32 0, 1
32*2e9f8696SJustin Fargnoli  call void @effecting()
33*2e9f8696SJustin Fargnoli  ret void
34*2e9f8696SJustin Fargnoli}
35*2e9f8696SJustin Fargnoli
36*2e9f8696SJustin Fargnolidefine void @dont_move_above_phi() {
37*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @dont_move_above_phi() {
38*2e9f8696SJustin Fargnoli; CHECK-NEXT:  bb76951:
39*2e9f8696SJustin Fargnoli; CHECK-NEXT:    br label [[EXIT:%.*]]
40*2e9f8696SJustin Fargnoli; CHECK:       exit:
41*2e9f8696SJustin Fargnoli; CHECK-NEXT:    [[TMP0:%.*]] = phi i32 [ 0, [[BB76951:%.*]] ]
42*2e9f8696SJustin Fargnoli; CHECK-NEXT:    call void @effecting()
43*2e9f8696SJustin Fargnoli; CHECK-NEXT:    ret void
44*2e9f8696SJustin Fargnoli;
45*2e9f8696SJustin Fargnoli  br label %exit
46*2e9f8696SJustin Fargnoliexit:
47*2e9f8696SJustin Fargnoli  %1 = phi i32 [0, %0]
48*2e9f8696SJustin Fargnoli  call void @effecting()
49*2e9f8696SJustin Fargnoli  ret void
50*2e9f8696SJustin Fargnoli}
51*2e9f8696SJustin Fargnoli
52*2e9f8696SJustin Fargnolidefine void @dont_move_above_alloca() {
53*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @dont_move_above_alloca() {
54*2e9f8696SJustin Fargnoli; CHECK-NEXT:  bb15160:
55*2e9f8696SJustin Fargnoli; CHECK-NEXT:    [[TMP0:%.*]] = alloca i32, align 4
56*2e9f8696SJustin Fargnoli; CHECK-NEXT:    call void @effecting()
57*2e9f8696SJustin Fargnoli; CHECK-NEXT:    ret void
58*2e9f8696SJustin Fargnoli;
59*2e9f8696SJustin Fargnoli  %1 = alloca i32
60*2e9f8696SJustin Fargnoli  call void @effecting()
61*2e9f8696SJustin Fargnoli  ret void
62*2e9f8696SJustin Fargnoli}
63*2e9f8696SJustin Fargnoli
64*2e9f8696SJustin Fargnolideclare void @effecting1()
65*2e9f8696SJustin Fargnoli
66*2e9f8696SJustin Fargnolidefine void @dont_reorder_effecting() {
67*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @dont_reorder_effecting() {
68*2e9f8696SJustin Fargnoli; CHECK-NEXT:  bb10075:
69*2e9f8696SJustin Fargnoli; CHECK-NEXT:    call void @effecting()
70*2e9f8696SJustin Fargnoli; CHECK-NEXT:    call void @effecting1()
71*2e9f8696SJustin Fargnoli; CHECK-NEXT:    ret void
72*2e9f8696SJustin Fargnoli;
73*2e9f8696SJustin Fargnoli  call void @effecting()
74*2e9f8696SJustin Fargnoli  call void @effecting1()
75*2e9f8696SJustin Fargnoli  ret void
76*2e9f8696SJustin Fargnoli}
77*2e9f8696SJustin Fargnoli
78*2e9f8696SJustin Fargnolideclare void @effecting2(i32)
79*2e9f8696SJustin Fargnoli
80*2e9f8696SJustin Fargnolidefine void @dont_reorder_effecting1() {
81*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @dont_reorder_effecting1() {
82*2e9f8696SJustin Fargnoli; CHECK-NEXT:  bb10075:
83*2e9f8696SJustin Fargnoli; CHECK-NEXT:    [[ONE:%.*]] = add i32 1, 1
84*2e9f8696SJustin Fargnoli; CHECK-NEXT:    call void @effecting2(i32 [[ONE]])
85*2e9f8696SJustin Fargnoli; CHECK-NEXT:    [[TWO:%.*]] = add i32 2, 2
86*2e9f8696SJustin Fargnoli; CHECK-NEXT:    call void @effecting2(i32 [[TWO]])
87*2e9f8696SJustin Fargnoli; CHECK-NEXT:    ret void
88*2e9f8696SJustin Fargnoli;
89*2e9f8696SJustin Fargnoli  %one = add i32 1, 1
90*2e9f8696SJustin Fargnoli  %two = add i32 2, 2
91*2e9f8696SJustin Fargnoli  call void @effecting2(i32 %one)
92*2e9f8696SJustin Fargnoli  call void @effecting2(i32 %two)
93*2e9f8696SJustin Fargnoli  ret void
94*2e9f8696SJustin Fargnoli}
95*2e9f8696SJustin Fargnoli
96*2e9f8696SJustin Fargnolidefine void @dont_reorder_across_blocks() {
97*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @dont_reorder_across_blocks() {
98*2e9f8696SJustin Fargnoli; CHECK-NEXT:  bb76951:
99*2e9f8696SJustin Fargnoli; CHECK-NEXT:    [[ONE:%.*]] = add i32 1, 1
100*2e9f8696SJustin Fargnoli; CHECK-NEXT:    br label [[EXIT:%.*]]
101*2e9f8696SJustin Fargnoli; CHECK:       exit:
102*2e9f8696SJustin Fargnoli; CHECK-NEXT:    call void @effecting2(i32 [[ONE]])
103*2e9f8696SJustin Fargnoli; CHECK-NEXT:    ret void
104*2e9f8696SJustin Fargnoli;
105*2e9f8696SJustin Fargnoli  %one = add i32 1, 1
106*2e9f8696SJustin Fargnoli  br label %exit
107*2e9f8696SJustin Fargnoliexit:
108*2e9f8696SJustin Fargnoli  call void @effecting2(i32 %one)
109*2e9f8696SJustin Fargnoli  ret void
110*2e9f8696SJustin Fargnoli}
111*2e9f8696SJustin Fargnoli
112*2e9f8696SJustin Fargnolidefine void @independentldst(ptr %a, ptr %b) {
113*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @independentldst(
114*2e9f8696SJustin Fargnoli; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]]) {
115*2e9f8696SJustin Fargnoli; CHECK-NEXT:  bb10495:
116*2e9f8696SJustin Fargnoli; CHECK-NEXT:    %"vl12961([[B]])" = load i32, ptr [[B]], align 4
117*2e9f8696SJustin Fargnoli; CHECK-NEXT:    store i32 %"vl12961([[B]])", ptr [[A]], align 4
118*2e9f8696SJustin Fargnoli; CHECK-NEXT:    %"vl89528([[A]])" = load i32, ptr [[A]], align 4
119*2e9f8696SJustin Fargnoli; CHECK-NEXT:    store i32 %"vl89528([[A]])", ptr [[B]], align 4
120*2e9f8696SJustin Fargnoli; CHECK-NEXT:    ret void
121*2e9f8696SJustin Fargnoli;
122*2e9f8696SJustin Fargnoli  %2 = load i32, ptr %a
123*2e9f8696SJustin Fargnoli  %3 = load i32, ptr %b
124*2e9f8696SJustin Fargnoli  store i32 %3, ptr %a
125*2e9f8696SJustin Fargnoli  store i32 %2, ptr %b
126*2e9f8696SJustin Fargnoli  ret void
127*2e9f8696SJustin Fargnoli}
128*2e9f8696SJustin Fargnoli
129*2e9f8696SJustin Fargnolidefine void @multiple_use_ld(ptr %a, ptr %b) {
130*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @multiple_use_ld(
131*2e9f8696SJustin Fargnoli; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]]) {
132*2e9f8696SJustin Fargnoli; CHECK-NEXT:  bb14927:
133*2e9f8696SJustin Fargnoli; CHECK-NEXT:    %"vl16793([[A]])" = load i32, ptr [[A]], align 4
134*2e9f8696SJustin Fargnoli; CHECK-NEXT:    store i32 %"vl16793([[A]])", ptr [[A]], align 4
135*2e9f8696SJustin Fargnoli; CHECK-NEXT:    %"vl89528([[B]])" = load i32, ptr [[B]], align 4
136*2e9f8696SJustin Fargnoli; CHECK-NEXT:    store i32 %"vl89528([[B]])", ptr [[B]], align 4
137*2e9f8696SJustin Fargnoli; CHECK-NEXT:    store i32 %"vl16793([[A]])", ptr [[A]], align 4
138*2e9f8696SJustin Fargnoli; CHECK-NEXT:    ret void
139*2e9f8696SJustin Fargnoli;
140*2e9f8696SJustin Fargnoli  %2 = load i32, ptr %a
141*2e9f8696SJustin Fargnoli  store i32 %2, ptr %a
142*2e9f8696SJustin Fargnoli  %3 = load i32, ptr %b
143*2e9f8696SJustin Fargnoli  store i32 %3, ptr %b
144*2e9f8696SJustin Fargnoli  store i32 %2, ptr %a
145*2e9f8696SJustin Fargnoli  ret void
146*2e9f8696SJustin Fargnoli}
147*2e9f8696SJustin Fargnoli
148*2e9f8696SJustin Fargnoli; This is an incorrect transformation. Moving the store above the load could
149*2e9f8696SJustin Fargnoli; change the loaded value. To do this, the pointers would need to be `noalias`.
150*2e9f8696SJustin Fargnolidefine void @undef_st(ptr %a, ptr %b) {
151*2e9f8696SJustin Fargnoli; CHECK-LABEL: define void @undef_st(
152*2e9f8696SJustin Fargnoli; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]]) {
153*2e9f8696SJustin Fargnoli; CHECK-NEXT:  bb10495:
154*2e9f8696SJustin Fargnoli; CHECK-NEXT:    store i32 undef, ptr [[B]], align 4
155*2e9f8696SJustin Fargnoli; CHECK-NEXT:    %"vl16028([[A]])" = load i32, ptr [[A]], align 4
156*2e9f8696SJustin Fargnoli; CHECK-NEXT:    store i32 %"vl16028([[A]])", ptr [[A]], align 4
157*2e9f8696SJustin Fargnoli; CHECK-NEXT:    ret void
158*2e9f8696SJustin Fargnoli;
159*2e9f8696SJustin Fargnoli  %2 = load i32, ptr %a
160*2e9f8696SJustin Fargnoli  store i32 undef, ptr %b
161*2e9f8696SJustin Fargnoli  store i32 %2, ptr %a
162*2e9f8696SJustin Fargnoli  ret void
163*2e9f8696SJustin Fargnoli}
164