[clang-tidy][use-internal-linkage]fix false positives for global overloaded operator...
[llvm-project.git] / llvm / test / CodeGen / PowerPC / fold-frame-offset-using-rr.mir
blob9c94615406adb19f43e0f95843e7a1545d3f4a03
1 # RUN: llc -mtriple=powerpc64le--linux-gnu -stop-after ppc-pre-emit-peephole %s -o - -verify-machineinstrs | FileCheck %s
3 # ADDI instr: ToBeChangedReg = ADDI FrameBaseReg, OffsetAddi
4 # ADD instr:  ToBeDeletedReg = ADD ToBeChangedReg(killed), ScaleReg
5 # Imm instr:  Reg            = op OffsetImm, ToBeDeletedReg(killed)
6
7 # can be folded to:
9 # new ADDI instr: ToBeChangedReg = ADDI FrameBaseReg, (OffsetAddi + OffsetImm)
10 # Index instr:    Reg            = opx ScaleReg, ToBeChangedReg(killed)
12 ---
13 name: testIndexForm1
14 #CHECK: name: testIndexForm1
15 # ToBeDeletedReg equals to ScaleReg
16 tracksRegLiveness: true
17 body: |
18   bb.0.entry:
19     liveins: $x3, $x1, $x4, $x6
20     $x3 = ADDI8 $x1, -80
21     ; CHECK: $x3 = ADDI8 $x1, -76
22     $x4 = ADD8 killed $x3, killed $x4
23     ; CHECK-NOT: ADD8
24     $x6 = LD 4, killed $x4
25     ; CHECK: $x6 = LDX killed $x4, killed $x3
26     BLR8 implicit $lr8, implicit $rm
27 ...
28 ---
29 name: testIndexForm2
30 #CHECK: name: testIndexForm2
31 # ToBeDeletedReg equals to ToBeChangedReg
32 tracksRegLiveness: true
33 body: |
34   bb.0.entry:
35     liveins: $x3, $x1, $x4, $x6
36     $x3 = ADDI8 $x1, -80
37     ; CHECK: $x3 = ADDI8 $x1, -76
38     $x3 = ADD8 killed $x3, killed $x4
39     ; CHECK-NOT: ADD8
40     $x6 = LD 4, killed $x3
41     ; CHECK: $x6 = LDX killed $x4, killed $x3
42     BLR8 implicit $lr8, implicit $rm
43 ...
44 ---
45 name: testIndexForm3
46 #CHECK: name: testIndexForm3
47 # There is other use for ToBeDeletedReg between ADD instr and Imm instr
48 tracksRegLiveness: true
49 body: |
50   bb.0.entry:
51     liveins: $x3, $x1, $x4, $x6
52     $x3 = ADDI8 $x1, -80
53     ; CHECK: $x3 = ADDI8 $x1, -80
54     $x3 = ADD8 killed $x3, killed $x4
55     ; CHECK: $x3 = ADD8 killed $x3, killed $x4
56     STD $x3, killed $x6, 100
57     ; CHECK: STD $x3, killed $x6, 100
58     $x6 = LD 4, killed $x3
59     ; CHECK: $x6 = LD 4, killed $x3
60     BLR8 implicit $lr8, implicit $rm
61 ...
62 ---
63 name: testIndexForm4
64 #CHECK: name: testIndexForm4
65 # There is other use for ToBeChangedReg between ADDI instr and ADD instr
66 tracksRegLiveness: true
67 body: |
68   bb.0.entry:
69     liveins: $x3, $x1, $x4, $x6
70     $x3 = ADDI8 $x1, -80
71     ; CHECK: $x3 = ADDI8 $x1, -80
72     STD $x3, killed $x6, 100
73     ; CHECK: STD $x3, killed $x6, 100
74     $x3 = ADD8 killed $x3, killed $x4
75     ; CHECK: $x3 = ADD8 killed $x3, killed $x4
76     $x6 = LD 4, killed $x3
77     ; CHECK: $x6 = LD 4, killed $x3
78     BLR8 implicit $lr8, implicit $rm
79 ...
80 ---
81 name: testIndexForm5
82 #CHECK: name: testIndexForm5
83 # ToBeChangedReg has no killed flag
84 tracksRegLiveness: true
85 body: |
86   bb.0.entry:
87     liveins: $x3, $x1, $x4, $x6
88     $x3 = ADDI8 $x1, -80
89     ; CHECK: $x3 = ADDI8 $x1, -80
90     $x4 = ADD8 $x3, killed $x4
91     ; CHECK: $x4 = ADD8 $x3, killed $x4
92     STD killed $x3, killed $x6, 100
93     ; CHECK: STD killed $x3, killed $x6, 100
94     $x6 = LD 4, killed $x4
95     ; CHECK: $x6 = LD 4, killed $x4
96     BLR8 implicit $lr8, implicit $rm
97 ...
98 ---
99 name: testIndexForm6
100 #CHECK: name: testIndexForm6
101 # ToBeDeletedReg has no killed flag
102 tracksRegLiveness: true
103 body: |
104   bb.0.entry:
105     liveins: $x3, $x1, $x4, $x6
106     $x3 = ADDI8 $x1, -80
107     ; CHECK: $x3 = ADDI8 $x1, -80
108     $x4 = ADD8 killed $x3, killed $x4
109     ; CHECK: $x4 = ADD8 killed $x3, killed $x4
110     $x6 = LD 4, $x4
111     ; CHECK: $x6 = LD 4, $x4
112     STD killed $x4, killed $x6, 100
113     BLR8 implicit $lr8, implicit $rm
116 name: testIndexForm7
117 #CHECK: name: testIndexForm7
118 # There is other def for ToBeChangedReg between ADD instr and Imm instr
119 tracksRegLiveness: true
120 body: |
121   bb.0.entry:
122     liveins: $x3, $x1, $x4, $x5, $x6
123     $x3 = ADDI8 $x1, -80
124     ; CHECK: $x3 = ADDI8 $x1, -80
125     $x4 = ADD8 killed $x3, killed $x5
126     ; CHECK: $x4 = ADD8 killed $x3, killed $x5
127     $x3 = LD 100, $x6
128     ; CHECK: $x3 = LD 100, $x6
129     STD killed $x3, killed $x6, 200
130     ; CHECK: STD killed $x3, killed $x6, 200
131     $x6 = LD 4, killed $x4
132     ; CHECK: $x6 = LD 4, killed $x4
133     BLR8 implicit $lr8, implicit $rm
136 name: testIndexForm8
137 #CHECK: name: testIndexForm8
138 # There is other def for ScaleReg between ADD instr and Imm instr
139 tracksRegLiveness: true
140 body: |
141   bb.0.entry:
142     liveins: $x3, $x1, $x4, $x5, $x6
143     $x3 = ADDI8 $x1, -80
144     ; CHECK: $x3 = ADDI8 $x1, -80
145     $x4 = ADD8 killed $x3, killed $x5
146     ; CHECK: $x4 = ADD8 killed $x3, killed $x5
147     $x5 = LD 100, $x6
148     ; CHECK: $x5 = LD 100, $x6
149     STD killed $x5, killed $x6, 200
150     ; CHECK: STD killed $x5, killed $x6, 200
151     $x6 = LD 4, killed $x4
152     ; CHECK: $x6 = LD 4, killed $x4
153     BLR8 implicit $lr8, implicit $rm
156 name: testR0
157 #CHECK: name: testR0
158 # Give up the folding if the register is R0/X0
159 tracksRegLiveness: true
160 body:             |
161   bb.0.entry:
162     liveins: $f1, $x0, $x3
163     $x4 = ADDI8 killed $x3, -8
164     $x4 = ADD8 killed $x4, $x0
165     STFD killed $f1, -8, killed $x4
166     ; CHECK-NOT: STFDX
167     BLR8 implicit $lr8, implicit $rm