mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-24 22:24:54 +00:00
[X86] Fast-ISel was incorrectly always killing the source of a truncate.
A trunc from i32 to i1 on x86_64 generates an instruction such as %vreg19<def> = COPY %vreg9:sub_8bit<kill>; GR8:%vreg19 GR32:%vreg9 However, the copy here should only have the kill flag on the 32-bit path, not the 64-bit one. Otherwise, we are killing the source of the truncate which could be used later in the program. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236890 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -2185,6 +2185,7 @@ bool X86FastISel::X86SelectTrunc(const Instruction *I) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool KillInputReg = false;
|
||||
if (!Subtarget->is64Bit()) {
|
||||
// If we're on x86-32; we can't extract an i8 from a general register.
|
||||
// First issue a copy to GR16_ABCD or GR32_ABCD.
|
||||
@@ -2194,11 +2195,12 @@ bool X86FastISel::X86SelectTrunc(const Instruction *I) {
|
||||
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
|
||||
TII.get(TargetOpcode::COPY), CopyReg).addReg(InputReg);
|
||||
InputReg = CopyReg;
|
||||
KillInputReg = true;
|
||||
}
|
||||
|
||||
// Issue an extract_subreg.
|
||||
unsigned ResultReg = fastEmitInst_extractsubreg(MVT::i8,
|
||||
InputReg, /*Kill=*/true,
|
||||
InputReg, KillInputReg,
|
||||
X86::sub_8bit);
|
||||
if (!ResultReg)
|
||||
return false;
|
||||
|
Reference in New Issue
Block a user