Skip to content

Commit 2682020

Browse files
committed
Do not SCC kill to block optimization
Signed-off-by: John Lu <[email protected]>
1 parent 13d73b2 commit 2682020

File tree

2 files changed

+88
-8
lines changed

2 files changed

+88
-8
lines changed

llvm/lib/Target/AMDGPU/SIInstrInfo.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10612,17 +10612,20 @@ bool SIInstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
1061210612
if (!CanOptimize)
1061310613
return false;
1061410614

10615+
MachineInstr *KillsSCC = nullptr;
1061510616
for (MachineInstr &MI :
1061610617
make_range(std::next(Def->getIterator()), CmpInstr.getIterator())) {
10617-
if (MI.modifiesRegister(AMDGPU::SCC, &RI) ||
10618-
MI.killsRegister(AMDGPU::SCC, &RI))
10618+
if (MI.modifiesRegister(AMDGPU::SCC, &RI))
1061910619
return false;
10620+
if (MI.killsRegister(AMDGPU::SCC, &RI))
10621+
KillsSCC = &MI;
1062010622
}
1062110623

1062210624
if (MachineOperand *SccDef =
1062310625
Def->findRegisterDefOperand(AMDGPU::SCC, /*TRI=*/nullptr))
1062410626
SccDef->setIsDead(false);
10625-
10627+
if (KillsSCC)
10628+
KillsSCC->clearRegisterKills(AMDGPU::SCC, /*TRI=*/nullptr);
1062610629
CmpInstr.eraseFromParent();
1062710630
return true;
1062810631
};
@@ -10701,16 +10704,20 @@ bool SIInstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
1070110704
if (IsReversedCC && !MRI->hasOneNonDBGUse(DefReg))
1070210705
return false;
1070310706

10707+
MachineInstr *KillsSCC = nullptr;
1070410708
for (MachineInstr &MI :
1070510709
make_range(std::next(Def->getIterator()), CmpInstr.getIterator())) {
10706-
if (MI.modifiesRegister(AMDGPU::SCC, &RI) ||
10707-
MI.killsRegister(AMDGPU::SCC, &RI))
10710+
if (MI.modifiesRegister(AMDGPU::SCC, &RI))
1070810711
return false;
10712+
if (MI.killsRegister(AMDGPU::SCC, &RI))
10713+
KillsSCC = &MI;
1070910714
}
1071010715

1071110716
MachineOperand *SccDef =
1071210717
Def->findRegisterDefOperand(AMDGPU::SCC, /*TRI=*/nullptr);
1071310718
SccDef->setIsDead(false);
10719+
if (KillsSCC)
10720+
KillsSCC->clearRegisterKills(AMDGPU::SCC, /*TRI=*/nullptr);
1071410721
CmpInstr.eraseFromParent();
1071510722

1071610723
if (!MRI->use_nodbg_empty(DefReg)) {

llvm/test/CodeGen/AMDGPU/optimize-compare.mir

Lines changed: 76 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -388,9 +388,8 @@ body: |
388388
; GCN-NEXT: liveins: $sgpr0, $vgpr0_vgpr1
389389
; GCN-NEXT: {{ $}}
390390
; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY $sgpr0
391-
; GCN-NEXT: [[S_AND_B32_:%[0-9]+]]:sreg_32 = S_AND_B32 1, killed [[COPY]], implicit-def $scc
392-
; GCN-NEXT: S_NOP 0, implicit killed $scc
393-
; GCN-NEXT: S_CMP_EQ_U32 killed [[S_AND_B32_]], 1, implicit-def $scc
391+
; GCN-NEXT: S_BITCMP1_B32 killed [[COPY]], 0, implicit-def $scc
392+
; GCN-NEXT: S_NOP 0, implicit $scc
394393
; GCN-NEXT: S_CBRANCH_SCC0 %bb.2, implicit $scc
395394
; GCN-NEXT: S_BRANCH %bb.1
396395
; GCN-NEXT: {{ $}}
@@ -416,6 +415,80 @@ body: |
416415
bb.2:
417416
S_ENDPGM 0
418417
418+
...
419+
---
420+
name: xor_1_cmp_lg_0_killed_scc
421+
body: |
422+
; GCN-LABEL: name: xor_1_cmp_lg_0_killed_scc
423+
; GCN: bb.0:
424+
; GCN-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)
425+
; GCN-NEXT: liveins: $sgpr0, $vgpr0_vgpr1
426+
; GCN-NEXT: {{ $}}
427+
; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY $sgpr0
428+
; GCN-NEXT: [[S_XOR_B32_:%[0-9]+]]:sreg_32 = S_XOR_B32 1, killed [[COPY]], implicit-def $scc
429+
; GCN-NEXT: S_NOP 0, implicit $scc
430+
; GCN-NEXT: S_CBRANCH_SCC0 %bb.2, implicit $scc
431+
; GCN-NEXT: S_BRANCH %bb.1
432+
; GCN-NEXT: {{ $}}
433+
; GCN-NEXT: bb.1:
434+
; GCN-NEXT: successors: %bb.2(0x80000000)
435+
; GCN-NEXT: {{ $}}
436+
; GCN-NEXT: bb.2:
437+
; GCN-NEXT: S_ENDPGM 0
438+
bb.0:
439+
successors: %bb.1(0x40000000), %bb.2(0x40000000)
440+
liveins: $sgpr0, $vgpr0_vgpr1
441+
442+
%0:sreg_32 = COPY $sgpr0
443+
%1:sreg_32 = S_XOR_B32 1, killed %0, implicit-def $scc
444+
S_NOP 0, implicit killed $scc
445+
S_CMP_LG_U32 killed %1:sreg_32, 0, implicit-def $scc
446+
S_CBRANCH_SCC0 %bb.2, implicit $scc
447+
S_BRANCH %bb.1
448+
449+
bb.1:
450+
successors: %bb.2(0x80000000)
451+
452+
bb.2:
453+
S_ENDPGM 0
454+
455+
...
456+
---
457+
name: absdiff_1_cmp_lg_0_killed_scc
458+
body: |
459+
; GCN-LABEL: name: absdiff_1_cmp_lg_0_killed_scc
460+
; GCN: bb.0:
461+
; GCN-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)
462+
; GCN-NEXT: liveins: $sgpr0, $vgpr0_vgpr1
463+
; GCN-NEXT: {{ $}}
464+
; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY $sgpr0
465+
; GCN-NEXT: [[S_ABSDIFF_I32_:%[0-9]+]]:sreg_32 = S_ABSDIFF_I32 1, killed [[COPY]], implicit-def $scc
466+
; GCN-NEXT: S_NOP 0, implicit $scc
467+
; GCN-NEXT: S_CBRANCH_SCC0 %bb.2, implicit $scc
468+
; GCN-NEXT: S_BRANCH %bb.1
469+
; GCN-NEXT: {{ $}}
470+
; GCN-NEXT: bb.1:
471+
; GCN-NEXT: successors: %bb.2(0x80000000)
472+
; GCN-NEXT: {{ $}}
473+
; GCN-NEXT: bb.2:
474+
; GCN-NEXT: S_ENDPGM 0
475+
bb.0:
476+
successors: %bb.1(0x40000000), %bb.2(0x40000000)
477+
liveins: $sgpr0, $vgpr0_vgpr1
478+
479+
%0:sreg_32 = COPY $sgpr0
480+
%1:sreg_32 = S_ABSDIFF_I32 1, killed %0, implicit-def $scc
481+
S_NOP 0, implicit killed $scc
482+
S_CMP_LG_U32 killed %1:sreg_32, 0, implicit-def $scc
483+
S_CBRANCH_SCC0 %bb.2, implicit $scc
484+
S_BRANCH %bb.1
485+
486+
bb.1:
487+
successors: %bb.2(0x80000000)
488+
489+
bb.2:
490+
S_ENDPGM 0
491+
419492
...
420493

421494
---

0 commit comments

Comments
 (0)