Skip to content

Commit ac17eed

Browse files
committed
AMDGPU: Fold frame indexes into s_or_b32 and s_and_b32
Some pointer adds get turned into ors, and sometimes and is performed on pointers for masking.
1 parent 9088c54 commit ac17eed

File tree

2 files changed

+45
-48
lines changed

2 files changed

+45
-48
lines changed

llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2268,8 +2268,9 @@ bool SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
22682268
MI->eraseFromParent();
22692269
return true;
22702270
}
2271-
case AMDGPU::S_ADD_I32: {
2272-
// TODO: Handle s_or_b32, s_and_b32.
2271+
case AMDGPU::S_ADD_I32:
2272+
case AMDGPU::S_OR_B32:
2273+
case AMDGPU::S_AND_B32: {
22732274
MachineOperand &OtherOp = MI->getOperand(FIOperandNum == 1 ? 2 : 1);
22742275

22752276
assert(FrameReg || MFI->isBottomOfStack());

llvm/test/CodeGen/AMDGPU/eliminate-frame-index-scalar-bit-ops.mir

Lines changed: 42 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,21 @@ machineFunctionInfo:
2121
body: |
2222
bb.0:
2323
; MUBUFW64-LABEL: name: s_or_b32__inline_imm__fi_offset0
24-
; MUBUFW64: $sgpr4 = S_LSHR_B32 $sgpr32, 6, implicit-def dead $scc
25-
; MUBUFW64-NEXT: renamable $sgpr7 = S_OR_B32 12, killed $sgpr4, implicit-def $scc
24+
; MUBUFW64: renamable $sgpr4 = S_LSHR_B32 $sgpr32, 6, implicit-def dead $scc
25+
; MUBUFW64-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr4, 12, implicit-def $scc
2626
; MUBUFW64-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
2727
;
2828
; MUBUFW32-LABEL: name: s_or_b32__inline_imm__fi_offset0
29-
; MUBUFW32: $sgpr4 = S_LSHR_B32 $sgpr32, 5, implicit-def dead $scc
30-
; MUBUFW32-NEXT: renamable $sgpr7 = S_OR_B32 12, killed $sgpr4, implicit-def $scc
29+
; MUBUFW32: renamable $sgpr4 = S_LSHR_B32 $sgpr32, 5, implicit-def dead $scc
30+
; MUBUFW32-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr4, 12, implicit-def $scc
3131
; MUBUFW32-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
3232
;
3333
; FLATSCRW64-LABEL: name: s_or_b32__inline_imm__fi_offset0
34-
; FLATSCRW64: renamable $sgpr7 = S_OR_B32 12, $sgpr32, implicit-def $scc
34+
; FLATSCRW64: renamable $sgpr7 = S_OR_B32 $sgpr32, 12, implicit-def $scc
3535
; FLATSCRW64-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
3636
;
3737
; FLATSCRW32-LABEL: name: s_or_b32__inline_imm__fi_offset0
38-
; FLATSCRW32: renamable $sgpr7 = S_OR_B32 12, $sgpr32, implicit-def $scc
38+
; FLATSCRW32: renamable $sgpr7 = S_OR_B32 $sgpr32, 12, implicit-def $scc
3939
; FLATSCRW32-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
4040
renamable $sgpr7 = S_OR_B32 12, %stack.0, implicit-def $scc
4141
SI_RETURN implicit $sgpr7, implicit $scc
@@ -55,25 +55,21 @@ machineFunctionInfo:
5555
body: |
5656
bb.0:
5757
; MUBUFW64-LABEL: name: s_or_b32__literal__fi_offset96
58-
; MUBUFW64: $sgpr4 = S_LSHR_B32 $sgpr32, 6, implicit-def $scc
59-
; MUBUFW64-NEXT: $sgpr4 = S_ADD_I32 killed $sgpr4, 96, implicit-def $scc
60-
; MUBUFW64-NEXT: renamable $sgpr7 = S_OR_B32 68, killed $sgpr4, implicit-def $scc
58+
; MUBUFW64: renamable $sgpr4 = S_LSHR_B32 $sgpr32, 6, implicit-def dead $scc
59+
; MUBUFW64-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr4, 164, implicit-def $scc
6160
; MUBUFW64-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
6261
;
6362
; MUBUFW32-LABEL: name: s_or_b32__literal__fi_offset96
64-
; MUBUFW32: $sgpr4 = S_LSHR_B32 $sgpr32, 5, implicit-def $scc
65-
; MUBUFW32-NEXT: $sgpr4 = S_ADD_I32 killed $sgpr4, 96, implicit-def $scc
66-
; MUBUFW32-NEXT: renamable $sgpr7 = S_OR_B32 68, killed $sgpr4, implicit-def $scc
63+
; MUBUFW32: renamable $sgpr4 = S_LSHR_B32 $sgpr32, 5, implicit-def dead $scc
64+
; MUBUFW32-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr4, 164, implicit-def $scc
6765
; MUBUFW32-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
6866
;
6967
; FLATSCRW64-LABEL: name: s_or_b32__literal__fi_offset96
70-
; FLATSCRW64: $sgpr4 = S_ADD_I32 $sgpr32, 96, implicit-def $scc
71-
; FLATSCRW64-NEXT: renamable $sgpr7 = S_OR_B32 68, killed $sgpr4, implicit-def $scc
68+
; FLATSCRW64: renamable $sgpr7 = S_OR_B32 $sgpr32, 164, implicit-def $scc
7269
; FLATSCRW64-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
7370
;
7471
; FLATSCRW32-LABEL: name: s_or_b32__literal__fi_offset96
75-
; FLATSCRW32: $sgpr4 = S_ADD_I32 $sgpr32, 96, implicit-def $scc
76-
; FLATSCRW32-NEXT: renamable $sgpr7 = S_OR_B32 68, killed $sgpr4, implicit-def $scc
72+
; FLATSCRW32: renamable $sgpr7 = S_OR_B32 $sgpr32, 164, implicit-def $scc
7773
; FLATSCRW32-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
7874
renamable $sgpr7 = S_OR_B32 68, %stack.1, implicit-def $scc
7975
SI_RETURN implicit $sgpr7, implicit $scc
@@ -96,31 +92,31 @@ body: |
9692
; MUBUFW64-LABEL: name: s_or_b32__sgpr__fi_literal_offset
9793
; MUBUFW64: liveins: $sgpr8
9894
; MUBUFW64-NEXT: {{ $}}
99-
; MUBUFW64-NEXT: $sgpr4 = S_LSHR_B32 $sgpr32, 6, implicit-def $scc
100-
; MUBUFW64-NEXT: $sgpr4 = S_ADD_I32 killed $sgpr4, 80, implicit-def $scc
101-
; MUBUFW64-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr8, killed $sgpr4, implicit-def $scc
95+
; MUBUFW64-NEXT: renamable $sgpr4 = S_LSHR_B32 $sgpr32, 6, implicit-def dead $scc
96+
; MUBUFW64-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr4, $sgpr8, implicit-def $scc
97+
; MUBUFW64-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr7, 80, implicit-def $scc
10298
; MUBUFW64-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
10399
;
104100
; MUBUFW32-LABEL: name: s_or_b32__sgpr__fi_literal_offset
105101
; MUBUFW32: liveins: $sgpr8
106102
; MUBUFW32-NEXT: {{ $}}
107-
; MUBUFW32-NEXT: $sgpr4 = S_LSHR_B32 $sgpr32, 5, implicit-def $scc
108-
; MUBUFW32-NEXT: $sgpr4 = S_ADD_I32 killed $sgpr4, 80, implicit-def $scc
109-
; MUBUFW32-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr8, killed $sgpr4, implicit-def $scc
103+
; MUBUFW32-NEXT: renamable $sgpr4 = S_LSHR_B32 $sgpr32, 5, implicit-def dead $scc
104+
; MUBUFW32-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr4, $sgpr8, implicit-def $scc
105+
; MUBUFW32-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr7, 80, implicit-def $scc
110106
; MUBUFW32-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
111107
;
112108
; FLATSCRW64-LABEL: name: s_or_b32__sgpr__fi_literal_offset
113109
; FLATSCRW64: liveins: $sgpr8
114110
; FLATSCRW64-NEXT: {{ $}}
115-
; FLATSCRW64-NEXT: $sgpr4 = S_ADD_I32 $sgpr32, 80, implicit-def $scc
116-
; FLATSCRW64-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr8, killed $sgpr4, implicit-def $scc
111+
; FLATSCRW64-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr32, $sgpr8, implicit-def $scc
112+
; FLATSCRW64-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr7, 80, implicit-def $scc
117113
; FLATSCRW64-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
118114
;
119115
; FLATSCRW32-LABEL: name: s_or_b32__sgpr__fi_literal_offset
120116
; FLATSCRW32: liveins: $sgpr8
121117
; FLATSCRW32-NEXT: {{ $}}
122-
; FLATSCRW32-NEXT: $sgpr4 = S_ADD_I32 $sgpr32, 80, implicit-def $scc
123-
; FLATSCRW32-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr8, killed $sgpr4, implicit-def $scc
118+
; FLATSCRW32-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr32, $sgpr8, implicit-def $scc
119+
; FLATSCRW32-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr7, 80, implicit-def $scc
124120
; FLATSCRW32-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
125121
renamable $sgpr7 = S_OR_B32 $sgpr8, %stack.1, implicit-def $scc
126122
SI_RETURN implicit $sgpr7, implicit $scc
@@ -143,31 +139,31 @@ body: |
143139
; MUBUFW64-LABEL: name: s_or_b32__sgpr__fi_inlineimm_offset
144140
; MUBUFW64: liveins: $sgpr8
145141
; MUBUFW64-NEXT: {{ $}}
146-
; MUBUFW64-NEXT: $sgpr4 = S_LSHR_B32 $sgpr32, 6, implicit-def $scc
147-
; MUBUFW64-NEXT: $sgpr4 = S_ADD_I32 killed $sgpr4, 32, implicit-def $scc
148-
; MUBUFW64-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr8, killed $sgpr4, implicit-def $scc
142+
; MUBUFW64-NEXT: renamable $sgpr4 = S_LSHR_B32 $sgpr32, 6, implicit-def dead $scc
143+
; MUBUFW64-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr4, $sgpr8, implicit-def $scc
144+
; MUBUFW64-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr7, 32, implicit-def $scc
149145
; MUBUFW64-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
150146
;
151147
; MUBUFW32-LABEL: name: s_or_b32__sgpr__fi_inlineimm_offset
152148
; MUBUFW32: liveins: $sgpr8
153149
; MUBUFW32-NEXT: {{ $}}
154-
; MUBUFW32-NEXT: $sgpr4 = S_LSHR_B32 $sgpr32, 5, implicit-def $scc
155-
; MUBUFW32-NEXT: $sgpr4 = S_ADD_I32 killed $sgpr4, 32, implicit-def $scc
156-
; MUBUFW32-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr8, killed $sgpr4, implicit-def $scc
150+
; MUBUFW32-NEXT: renamable $sgpr4 = S_LSHR_B32 $sgpr32, 5, implicit-def dead $scc
151+
; MUBUFW32-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr4, $sgpr8, implicit-def $scc
152+
; MUBUFW32-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr7, 32, implicit-def $scc
157153
; MUBUFW32-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
158154
;
159155
; FLATSCRW64-LABEL: name: s_or_b32__sgpr__fi_inlineimm_offset
160156
; FLATSCRW64: liveins: $sgpr8
161157
; FLATSCRW64-NEXT: {{ $}}
162-
; FLATSCRW64-NEXT: $sgpr4 = S_ADD_I32 $sgpr32, 32, implicit-def $scc
163-
; FLATSCRW64-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr8, killed $sgpr4, implicit-def $scc
158+
; FLATSCRW64-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr32, $sgpr8, implicit-def $scc
159+
; FLATSCRW64-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr7, 32, implicit-def $scc
164160
; FLATSCRW64-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
165161
;
166162
; FLATSCRW32-LABEL: name: s_or_b32__sgpr__fi_inlineimm_offset
167163
; FLATSCRW32: liveins: $sgpr8
168164
; FLATSCRW32-NEXT: {{ $}}
169-
; FLATSCRW32-NEXT: $sgpr4 = S_ADD_I32 $sgpr32, 32, implicit-def $scc
170-
; FLATSCRW32-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr8, killed $sgpr4, implicit-def $scc
165+
; FLATSCRW32-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr32, $sgpr8, implicit-def $scc
166+
; FLATSCRW32-NEXT: renamable $sgpr7 = S_OR_B32 $sgpr7, 32, implicit-def $scc
171167
; FLATSCRW32-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
172168
renamable $sgpr7 = S_OR_B32 $sgpr8, %stack.1, implicit-def $scc
173169
SI_RETURN implicit $sgpr7, implicit $scc
@@ -190,31 +186,31 @@ body: |
190186
; MUBUFW64-LABEL: name: s_and_b32__sgpr__fi_literal_offset
191187
; MUBUFW64: liveins: $sgpr8
192188
; MUBUFW64-NEXT: {{ $}}
193-
; MUBUFW64-NEXT: $sgpr4 = S_LSHR_B32 $sgpr32, 6, implicit-def $scc
194-
; MUBUFW64-NEXT: $sgpr4 = S_ADD_I32 killed $sgpr4, 80, implicit-def $scc
195-
; MUBUFW64-NEXT: renamable $sgpr7 = S_AND_B32 $sgpr8, killed $sgpr4, implicit-def $scc
189+
; MUBUFW64-NEXT: renamable $sgpr4 = S_LSHR_B32 $sgpr32, 6, implicit-def dead $scc
190+
; MUBUFW64-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr4, $sgpr8, implicit-def $scc
191+
; MUBUFW64-NEXT: renamable $sgpr7 = S_AND_B32 $sgpr7, 80, implicit-def $scc
196192
; MUBUFW64-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
197193
;
198194
; MUBUFW32-LABEL: name: s_and_b32__sgpr__fi_literal_offset
199195
; MUBUFW32: liveins: $sgpr8
200196
; MUBUFW32-NEXT: {{ $}}
201-
; MUBUFW32-NEXT: $sgpr4 = S_LSHR_B32 $sgpr32, 5, implicit-def $scc
202-
; MUBUFW32-NEXT: $sgpr4 = S_ADD_I32 killed $sgpr4, 80, implicit-def $scc
203-
; MUBUFW32-NEXT: renamable $sgpr7 = S_AND_B32 $sgpr8, killed $sgpr4, implicit-def $scc
197+
; MUBUFW32-NEXT: renamable $sgpr4 = S_LSHR_B32 $sgpr32, 5, implicit-def dead $scc
198+
; MUBUFW32-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr4, $sgpr8, implicit-def $scc
199+
; MUBUFW32-NEXT: renamable $sgpr7 = S_AND_B32 $sgpr7, 80, implicit-def $scc
204200
; MUBUFW32-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
205201
;
206202
; FLATSCRW64-LABEL: name: s_and_b32__sgpr__fi_literal_offset
207203
; FLATSCRW64: liveins: $sgpr8
208204
; FLATSCRW64-NEXT: {{ $}}
209-
; FLATSCRW64-NEXT: $sgpr4 = S_ADD_I32 $sgpr32, 80, implicit-def $scc
210-
; FLATSCRW64-NEXT: renamable $sgpr7 = S_AND_B32 $sgpr8, killed $sgpr4, implicit-def $scc
205+
; FLATSCRW64-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr32, $sgpr8, implicit-def $scc
206+
; FLATSCRW64-NEXT: renamable $sgpr7 = S_AND_B32 $sgpr7, 80, implicit-def $scc
211207
; FLATSCRW64-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
212208
;
213209
; FLATSCRW32-LABEL: name: s_and_b32__sgpr__fi_literal_offset
214210
; FLATSCRW32: liveins: $sgpr8
215211
; FLATSCRW32-NEXT: {{ $}}
216-
; FLATSCRW32-NEXT: $sgpr4 = S_ADD_I32 $sgpr32, 80, implicit-def $scc
217-
; FLATSCRW32-NEXT: renamable $sgpr7 = S_AND_B32 $sgpr8, killed $sgpr4, implicit-def $scc
212+
; FLATSCRW32-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr32, $sgpr8, implicit-def $scc
213+
; FLATSCRW32-NEXT: renamable $sgpr7 = S_AND_B32 $sgpr7, 80, implicit-def $scc
218214
; FLATSCRW32-NEXT: SI_RETURN implicit $sgpr7, implicit $scc
219215
renamable $sgpr7 = S_AND_B32 $sgpr8, %stack.1, implicit-def $scc
220216
SI_RETURN implicit $sgpr7, implicit $scc

0 commit comments

Comments
 (0)