mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-27 16:17:17 +00:00
Convert EXTRACT_SUBREG to COPY when emitting machine instrs.
EXTRACT_SUBREG no longer appears as a machine instruction. Use COPY instead. Add isCopy() checks in many places using isMoveInstr() and isExtractSubreg(). The isMoveInstr hook will be removed later. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@107879 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -128,12 +128,12 @@ bool OptimizeExts::OptimizeInstr(MachineInstr *MI, MachineBasicBlock *MBB,
|
||||
//
|
||||
// %reg1025 = <sext> %reg1024
|
||||
// ...
|
||||
// %reg1027 = EXTRACT_SUBREG %reg1025, 4
|
||||
// %reg1027 = COPY %reg1025:4
|
||||
// %reg1026 = SUBREG_TO_REG 0, %reg1027, 4
|
||||
//
|
||||
// The problem here is that SUBREG_TO_REG is there to assert that an
|
||||
// implicit zext occurs. It doesn't insert a zext instruction. If we allow
|
||||
// the EXTRACT_SUBREG here, it will give us the value after the <sext>,
|
||||
// the COPY here, it will give us the value after the <sext>,
|
||||
// not the original value of %reg1024 before <sext>.
|
||||
if (UseMI->getOpcode() == TargetOpcode::SUBREG_TO_REG)
|
||||
continue;
|
||||
@@ -185,8 +185,8 @@ bool OptimizeExts::OptimizeInstr(MachineInstr *MI, MachineBasicBlock *MBB,
|
||||
continue;
|
||||
unsigned NewVR = MRI->createVirtualRegister(RC);
|
||||
BuildMI(*UseMBB, UseMI, UseMI->getDebugLoc(),
|
||||
TII->get(TargetOpcode::EXTRACT_SUBREG), NewVR)
|
||||
.addReg(DstReg).addImm(SubIdx);
|
||||
TII->get(TargetOpcode::COPY), NewVR)
|
||||
.addReg(DstReg, 0, SubIdx);
|
||||
UseMO->setReg(NewVR);
|
||||
++NumReuse;
|
||||
Changed = true;
|
||||
|
Reference in New Issue
Block a user