Skip to content

Commit 8f98bdb

Browse files
committed
Fix offset 0 case with different register
1 parent 18de2ef commit 8f98bdb

File tree

2 files changed

+217
-2
lines changed

2 files changed

+217
-2
lines changed

llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2310,8 +2310,11 @@ bool SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
23102310
if (OtherOp.isImm())
23112311
NewOffset += OtherOp.getImm();
23122312

2313-
if (NewOffset == 0 && DeadSCC) {
2314-
MI->eraseFromParent();
2313+
if (NewOffset == 0 && DeadSCC && !OtherOp.isImm()) {
2314+
MI->removeOperand(3);
2315+
MI->removeOperand(FIOperandNum);
2316+
MI->setDesc(
2317+
TII->get(OtherOp.isReg() ? AMDGPU::COPY : AMDGPU::S_MOV_B32));
23152318
} else if (!MaterializedReg && OtherOp.isImm()) {
23162319
// In a kernel, the address should just be an immediate.
23172320
// SCC should really be dead, but preserve the def just in case it

llvm/test/CodeGen/AMDGPU/eliminate-frame-index-s-add-i32.mir

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,25 +260,29 @@ body: |
260260
; MUBUFW64-NEXT: {{ $}}
261261
; MUBUFW64-NEXT: renamable $sgpr7 = S_LSHR_B32 $sgpr32, 6, implicit-def dead $scc
262262
; MUBUFW64-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr7, $sgpr8, implicit-def dead $scc
263+
; MUBUFW64-NEXT: renamable $sgpr7 = COPY $sgpr8
263264
; MUBUFW64-NEXT: SI_RETURN implicit $sgpr7
264265
;
265266
; MUBUFW32-LABEL: name: s_add_i32__sgpr__fi_offset0
266267
; MUBUFW32: liveins: $sgpr8
267268
; MUBUFW32-NEXT: {{ $}}
268269
; MUBUFW32-NEXT: renamable $sgpr7 = S_LSHR_B32 $sgpr32, 5, implicit-def dead $scc
269270
; MUBUFW32-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr7, $sgpr8, implicit-def dead $scc
271+
; MUBUFW32-NEXT: renamable $sgpr7 = COPY $sgpr8
270272
; MUBUFW32-NEXT: SI_RETURN implicit $sgpr7
271273
;
272274
; FLATSCRW64-LABEL: name: s_add_i32__sgpr__fi_offset0
273275
; FLATSCRW64: liveins: $sgpr8
274276
; FLATSCRW64-NEXT: {{ $}}
275277
; FLATSCRW64-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr32, $sgpr8, implicit-def dead $scc
278+
; FLATSCRW64-NEXT: renamable $sgpr7 = COPY $sgpr8
276279
; FLATSCRW64-NEXT: SI_RETURN implicit $sgpr7
277280
;
278281
; FLATSCRW32-LABEL: name: s_add_i32__sgpr__fi_offset0
279282
; FLATSCRW32: liveins: $sgpr8
280283
; FLATSCRW32-NEXT: {{ $}}
281284
; FLATSCRW32-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr32, $sgpr8, implicit-def dead $scc
285+
; FLATSCRW32-NEXT: renamable $sgpr7 = COPY $sgpr8
282286
; FLATSCRW32-NEXT: SI_RETURN implicit $sgpr7
283287
renamable $sgpr7 = S_ADD_I32 $sgpr8, %stack.0, implicit-def dead $scc
284288
SI_RETURN implicit $sgpr7
@@ -302,25 +306,29 @@ body: |
302306
; MUBUFW64-NEXT: {{ $}}
303307
; MUBUFW64-NEXT: renamable $sgpr7 = S_LSHR_B32 $sgpr32, 6, implicit-def dead $scc
304308
; MUBUFW64-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr7, $sgpr8, implicit-def dead $scc
309+
; MUBUFW64-NEXT: renamable $sgpr7 = COPY $sgpr8
305310
; MUBUFW64-NEXT: SI_RETURN implicit $sgpr7
306311
;
307312
; MUBUFW32-LABEL: name: s_add_i32__fi_offset0__sgpr
308313
; MUBUFW32: liveins: $sgpr8
309314
; MUBUFW32-NEXT: {{ $}}
310315
; MUBUFW32-NEXT: renamable $sgpr7 = S_LSHR_B32 $sgpr32, 5, implicit-def dead $scc
311316
; MUBUFW32-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr7, $sgpr8, implicit-def dead $scc
317+
; MUBUFW32-NEXT: renamable $sgpr7 = COPY $sgpr8
312318
; MUBUFW32-NEXT: SI_RETURN implicit $sgpr7
313319
;
314320
; FLATSCRW64-LABEL: name: s_add_i32__fi_offset0__sgpr
315321
; FLATSCRW64: liveins: $sgpr8
316322
; FLATSCRW64-NEXT: {{ $}}
317323
; FLATSCRW64-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr32, $sgpr8, implicit-def dead $scc
324+
; FLATSCRW64-NEXT: renamable $sgpr7 = COPY $sgpr8
318325
; FLATSCRW64-NEXT: SI_RETURN implicit $sgpr7
319326
;
320327
; FLATSCRW32-LABEL: name: s_add_i32__fi_offset0__sgpr
321328
; FLATSCRW32: liveins: $sgpr8
322329
; FLATSCRW32-NEXT: {{ $}}
323330
; FLATSCRW32-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr32, $sgpr8, implicit-def dead $scc
331+
; FLATSCRW32-NEXT: renamable $sgpr7 = COPY $sgpr8
324332
; FLATSCRW32-NEXT: SI_RETURN implicit $sgpr7
325333
renamable $sgpr7 = S_ADD_I32 %stack.0, $sgpr8, implicit-def dead $scc
326334
SI_RETURN implicit $sgpr7
@@ -928,3 +936,207 @@ body: |
928936
SI_RETURN implicit $sgpr7, implicit $scc
929937
930938
...
939+
940+
---
941+
name: s_add_i32__0__fi_offset0
942+
tracksRegLiveness: true
943+
stack:
944+
- { id: 0, size: 32, alignment: 16 }
945+
machineFunctionInfo:
946+
scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3'
947+
frameOffsetReg: '$sgpr33'
948+
stackPtrOffsetReg: '$sgpr32'
949+
body: |
950+
bb.0:
951+
; MUBUFW64-LABEL: name: s_add_i32__0__fi_offset0
952+
; MUBUFW64: renamable $sgpr7 = S_LSHR_B32 $sgpr32, 6, implicit-def dead $scc
953+
; MUBUFW64-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr7, 0, implicit-def dead $scc
954+
; MUBUFW64-NEXT: SI_RETURN implicit $sgpr7
955+
;
956+
; MUBUFW32-LABEL: name: s_add_i32__0__fi_offset0
957+
; MUBUFW32: renamable $sgpr7 = S_LSHR_B32 $sgpr32, 5, implicit-def dead $scc
958+
; MUBUFW32-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr7, 0, implicit-def dead $scc
959+
; MUBUFW32-NEXT: SI_RETURN implicit $sgpr7
960+
;
961+
; FLATSCRW64-LABEL: name: s_add_i32__0__fi_offset0
962+
; FLATSCRW64: renamable $sgpr7 = S_ADD_I32 $sgpr32, 0, implicit-def dead $scc
963+
; FLATSCRW64-NEXT: SI_RETURN implicit $sgpr7
964+
;
965+
; FLATSCRW32-LABEL: name: s_add_i32__0__fi_offset0
966+
; FLATSCRW32: renamable $sgpr7 = S_ADD_I32 $sgpr32, 0, implicit-def dead $scc
967+
; FLATSCRW32-NEXT: SI_RETURN implicit $sgpr7
968+
renamable $sgpr7 = S_ADD_I32 0, %stack.0, implicit-def dead $scc
969+
SI_RETURN implicit $sgpr7
970+
971+
...
972+
973+
---
974+
name: s_add_i32__fi_offset0__0
975+
tracksRegLiveness: true
976+
stack:
977+
- { id: 0, size: 32, alignment: 16 }
978+
machineFunctionInfo:
979+
scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3'
980+
frameOffsetReg: '$sgpr33'
981+
stackPtrOffsetReg: '$sgpr32'
982+
body: |
983+
bb.0:
984+
; MUBUFW64-LABEL: name: s_add_i32__fi_offset0__0
985+
; MUBUFW64: renamable $sgpr7 = S_LSHR_B32 $sgpr32, 6, implicit-def dead $scc
986+
; MUBUFW64-NEXT: renamable $sgpr7 = S_ADD_I32 0, $sgpr7, implicit-def dead $scc
987+
; MUBUFW64-NEXT: SI_RETURN implicit $sgpr7
988+
;
989+
; MUBUFW32-LABEL: name: s_add_i32__fi_offset0__0
990+
; MUBUFW32: renamable $sgpr7 = S_LSHR_B32 $sgpr32, 5, implicit-def dead $scc
991+
; MUBUFW32-NEXT: renamable $sgpr7 = S_ADD_I32 0, $sgpr7, implicit-def dead $scc
992+
; MUBUFW32-NEXT: SI_RETURN implicit $sgpr7
993+
;
994+
; FLATSCRW64-LABEL: name: s_add_i32__fi_offset0__0
995+
; FLATSCRW64: renamable $sgpr7 = S_ADD_I32 0, $sgpr32, implicit-def dead $scc
996+
; FLATSCRW64-NEXT: SI_RETURN implicit $sgpr7
997+
;
998+
; FLATSCRW32-LABEL: name: s_add_i32__fi_offset0__0
999+
; FLATSCRW32: renamable $sgpr7 = S_ADD_I32 0, $sgpr32, implicit-def dead $scc
1000+
; FLATSCRW32-NEXT: SI_RETURN implicit $sgpr7
1001+
renamable $sgpr7 = S_ADD_I32 %stack.0, 0, implicit-def dead $scc
1002+
SI_RETURN implicit $sgpr7
1003+
1004+
...
1005+
1006+
---
1007+
name: s_add_i32__same_sgpr__fi_offset0
1008+
tracksRegLiveness: true
1009+
stack:
1010+
- { id: 0, size: 32, alignment: 16 }
1011+
machineFunctionInfo:
1012+
scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3'
1013+
frameOffsetReg: '$sgpr33'
1014+
stackPtrOffsetReg: '$sgpr32'
1015+
body: |
1016+
bb.0:
1017+
liveins: $sgpr7
1018+
; MUBUFW64-LABEL: name: s_add_i32__same_sgpr__fi_offset0
1019+
; MUBUFW64: liveins: $sgpr7
1020+
; MUBUFW64-NEXT: {{ $}}
1021+
; MUBUFW64-NEXT: renamable $sgpr7 = S_LSHR_B32 $sgpr32, 6, implicit-def dead $scc
1022+
; MUBUFW64-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr7, $sgpr7, implicit-def dead $scc
1023+
; MUBUFW64-NEXT: renamable $sgpr7 = COPY $sgpr7
1024+
; MUBUFW64-NEXT: SI_RETURN implicit $sgpr7
1025+
;
1026+
; MUBUFW32-LABEL: name: s_add_i32__same_sgpr__fi_offset0
1027+
; MUBUFW32: liveins: $sgpr7
1028+
; MUBUFW32-NEXT: {{ $}}
1029+
; MUBUFW32-NEXT: renamable $sgpr7 = S_LSHR_B32 $sgpr32, 5, implicit-def dead $scc
1030+
; MUBUFW32-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr7, $sgpr7, implicit-def dead $scc
1031+
; MUBUFW32-NEXT: renamable $sgpr7 = COPY $sgpr7
1032+
; MUBUFW32-NEXT: SI_RETURN implicit $sgpr7
1033+
;
1034+
; FLATSCRW64-LABEL: name: s_add_i32__same_sgpr__fi_offset0
1035+
; FLATSCRW64: liveins: $sgpr7
1036+
; FLATSCRW64-NEXT: {{ $}}
1037+
; FLATSCRW64-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr32, $sgpr7, implicit-def dead $scc
1038+
; FLATSCRW64-NEXT: renamable $sgpr7 = COPY $sgpr7
1039+
; FLATSCRW64-NEXT: SI_RETURN implicit $sgpr7
1040+
;
1041+
; FLATSCRW32-LABEL: name: s_add_i32__same_sgpr__fi_offset0
1042+
; FLATSCRW32: liveins: $sgpr7
1043+
; FLATSCRW32-NEXT: {{ $}}
1044+
; FLATSCRW32-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr32, $sgpr7, implicit-def dead $scc
1045+
; FLATSCRW32-NEXT: renamable $sgpr7 = COPY $sgpr7
1046+
; FLATSCRW32-NEXT: SI_RETURN implicit $sgpr7
1047+
renamable $sgpr7 = S_ADD_I32 $sgpr7, %stack.0, implicit-def dead $scc
1048+
SI_RETURN implicit $sgpr7
1049+
1050+
...
1051+
1052+
---
1053+
name: s_add_i32__different_sgpr__fi_offset0
1054+
tracksRegLiveness: true
1055+
stack:
1056+
- { id: 0, size: 32, alignment: 16 }
1057+
machineFunctionInfo:
1058+
scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3'
1059+
frameOffsetReg: '$sgpr33'
1060+
stackPtrOffsetReg: '$sgpr32'
1061+
body: |
1062+
bb.0:
1063+
liveins: $sgpr8
1064+
; MUBUFW64-LABEL: name: s_add_i32__different_sgpr__fi_offset0
1065+
; MUBUFW64: liveins: $sgpr8
1066+
; MUBUFW64-NEXT: {{ $}}
1067+
; MUBUFW64-NEXT: renamable $sgpr7 = S_LSHR_B32 $sgpr32, 6, implicit-def dead $scc
1068+
; MUBUFW64-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr7, $sgpr8, implicit-def dead $scc
1069+
; MUBUFW64-NEXT: renamable $sgpr7 = COPY $sgpr8
1070+
; MUBUFW64-NEXT: SI_RETURN implicit $sgpr7
1071+
;
1072+
; MUBUFW32-LABEL: name: s_add_i32__different_sgpr__fi_offset0
1073+
; MUBUFW32: liveins: $sgpr8
1074+
; MUBUFW32-NEXT: {{ $}}
1075+
; MUBUFW32-NEXT: renamable $sgpr7 = S_LSHR_B32 $sgpr32, 5, implicit-def dead $scc
1076+
; MUBUFW32-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr7, $sgpr8, implicit-def dead $scc
1077+
; MUBUFW32-NEXT: renamable $sgpr7 = COPY $sgpr8
1078+
; MUBUFW32-NEXT: SI_RETURN implicit $sgpr7
1079+
;
1080+
; FLATSCRW64-LABEL: name: s_add_i32__different_sgpr__fi_offset0
1081+
; FLATSCRW64: liveins: $sgpr8
1082+
; FLATSCRW64-NEXT: {{ $}}
1083+
; FLATSCRW64-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr32, $sgpr8, implicit-def dead $scc
1084+
; FLATSCRW64-NEXT: renamable $sgpr7 = COPY $sgpr8
1085+
; FLATSCRW64-NEXT: SI_RETURN implicit $sgpr7
1086+
;
1087+
; FLATSCRW32-LABEL: name: s_add_i32__different_sgpr__fi_offset0
1088+
; FLATSCRW32: liveins: $sgpr8
1089+
; FLATSCRW32-NEXT: {{ $}}
1090+
; FLATSCRW32-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr32, $sgpr8, implicit-def dead $scc
1091+
; FLATSCRW32-NEXT: renamable $sgpr7 = COPY $sgpr8
1092+
; FLATSCRW32-NEXT: SI_RETURN implicit $sgpr7
1093+
renamable $sgpr7 = S_ADD_I32 $sgpr8, %stack.0, implicit-def dead $scc
1094+
SI_RETURN implicit $sgpr7
1095+
1096+
...
1097+
1098+
---
1099+
name: s_add_i32__different_sgpr__fi_offset0_live_after
1100+
tracksRegLiveness: true
1101+
stack:
1102+
- { id: 0, size: 32, alignment: 16 }
1103+
machineFunctionInfo:
1104+
scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3'
1105+
frameOffsetReg: '$sgpr33'
1106+
stackPtrOffsetReg: '$sgpr32'
1107+
body: |
1108+
bb.0:
1109+
liveins: $sgpr8
1110+
; MUBUFW64-LABEL: name: s_add_i32__different_sgpr__fi_offset0_live_after
1111+
; MUBUFW64: liveins: $sgpr8
1112+
; MUBUFW64-NEXT: {{ $}}
1113+
; MUBUFW64-NEXT: renamable $sgpr7 = S_LSHR_B32 $sgpr32, 6, implicit-def dead $scc
1114+
; MUBUFW64-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr7, $sgpr8, implicit-def dead $scc
1115+
; MUBUFW64-NEXT: renamable $sgpr7 = COPY $sgpr8
1116+
; MUBUFW64-NEXT: SI_RETURN implicit $sgpr7, implicit $sgpr8
1117+
;
1118+
; MUBUFW32-LABEL: name: s_add_i32__different_sgpr__fi_offset0_live_after
1119+
; MUBUFW32: liveins: $sgpr8
1120+
; MUBUFW32-NEXT: {{ $}}
1121+
; MUBUFW32-NEXT: renamable $sgpr7 = S_LSHR_B32 $sgpr32, 5, implicit-def dead $scc
1122+
; MUBUFW32-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr7, $sgpr8, implicit-def dead $scc
1123+
; MUBUFW32-NEXT: renamable $sgpr7 = COPY $sgpr8
1124+
; MUBUFW32-NEXT: SI_RETURN implicit $sgpr7, implicit $sgpr8
1125+
;
1126+
; FLATSCRW64-LABEL: name: s_add_i32__different_sgpr__fi_offset0_live_after
1127+
; FLATSCRW64: liveins: $sgpr8
1128+
; FLATSCRW64-NEXT: {{ $}}
1129+
; FLATSCRW64-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr32, $sgpr8, implicit-def dead $scc
1130+
; FLATSCRW64-NEXT: renamable $sgpr7 = COPY $sgpr8
1131+
; FLATSCRW64-NEXT: SI_RETURN implicit $sgpr7, implicit $sgpr8
1132+
;
1133+
; FLATSCRW32-LABEL: name: s_add_i32__different_sgpr__fi_offset0_live_after
1134+
; FLATSCRW32: liveins: $sgpr8
1135+
; FLATSCRW32-NEXT: {{ $}}
1136+
; FLATSCRW32-NEXT: renamable $sgpr7 = S_ADD_I32 $sgpr32, $sgpr8, implicit-def dead $scc
1137+
; FLATSCRW32-NEXT: renamable $sgpr7 = COPY $sgpr8
1138+
; FLATSCRW32-NEXT: SI_RETURN implicit $sgpr7, implicit $sgpr8
1139+
renamable $sgpr7 = S_ADD_I32 $sgpr8, %stack.0, implicit-def dead $scc
1140+
SI_RETURN implicit $sgpr7, implicit $sgpr8
1141+
1142+
...

0 commit comments

Comments
 (0)