[Peephole] Check instructions from CopyMIs are still COPY (#69511)
Function foldRedundantCopy records COPY instructions in CopyMIs and uses it later. But other optimizations may delete or modify it. So before using it we should check if the extracted instruction is existing and still a COPY instruction.
This commit is contained in:
@@ -1445,7 +1445,9 @@ bool PeepholeOptimizer::foldRedundantCopy(
|
||||
}
|
||||
|
||||
MachineInstr *PrevCopy = CopyMIs.find(SrcPair)->second;
|
||||
if (!LocalMIs.count(PrevCopy))
|
||||
// A COPY instruction can be deleted or changed by other optimizations.
|
||||
// Check if the previous COPY instruction is existing and still a COPY.
|
||||
if (!LocalMIs.count(PrevCopy) || !PrevCopy->isCopy())
|
||||
return false;
|
||||
|
||||
assert(SrcSubReg == PrevCopy->getOperand(1).getSubReg() &&
|
||||
|
||||
34
llvm/test/CodeGen/X86/peephole-copy.mir
Normal file
34
llvm/test/CodeGen/X86/peephole-copy.mir
Normal file
@@ -0,0 +1,34 @@
|
||||
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 3
|
||||
# RUN: llc -mtriple=i686-- -run-pass=peephole-opt %s -o - | FileCheck %s
|
||||
--- |
|
||||
define void @c() {
|
||||
entry:
|
||||
tail call void asm sideeffect "", "q,~{dirflag},~{fpsr},~{flags}"(i32 512)
|
||||
tail call void asm sideeffect "", "q,~{dirflag},~{fpsr},~{flags}"(i32 512)
|
||||
ret void
|
||||
}
|
||||
...
|
||||
---
|
||||
# In peephole optimization the modified COPY instruction should not cause
|
||||
# compiler failure.
|
||||
name: c
|
||||
registers:
|
||||
- { id: 0, class: gr32_abcd }
|
||||
- { id: 1, class: gr32_abcd }
|
||||
- { id: 2, class: gr32 }
|
||||
|
||||
body: |
|
||||
bb.0:
|
||||
; CHECK-LABEL: name: c
|
||||
; CHECK: [[MOV32ri:%[0-9]+]]:gr32_abcd = MOV32ri 512
|
||||
; CHECK-NEXT: INLINEASM &"", 1 /* sideeffect attdialect */, 2359305 /* reguse:GR32 */, [[MOV32ri]], 1 /* reguse */, implicit-def early-clobber $df
|
||||
; CHECK-NEXT: [[MOV32ri1:%[0-9]+]]:gr32_abcd = MOV32ri 512
|
||||
; CHECK-NEXT: INLINEASM &"", 1 /* sideeffect attdialect */, 2359305 /* reguse:GR32 */, [[MOV32ri1]], 1 /* reguse */, implicit-def early-clobber $df
|
||||
; CHECK-NEXT: RET 0
|
||||
%2 = MOV32ri 512
|
||||
%0 = COPY %2
|
||||
INLINEASM &"", 1 /* sideeffect attdialect */, 2359305 /* reguse:GR32_ABCD */, %0:gr32_abcd, 1 /* clobber */, implicit-def early-clobber $df
|
||||
%1 = COPY %2
|
||||
INLINEASM &"", 1 /* sideeffect attdialect */, 2359305 /* reguse:GR32_ABCD */, %1:gr32_abcd, 1 /* clobber */, implicit-def early-clobber $df
|
||||
RET 0
|
||||
...
|
||||
Reference in New Issue
Block a user