[llvm-dev] analyzePhysReg question
Smith, Kevin B via llvm-dev
llvm-dev at lists.llvm.org
Fri Dec 4 14:22:32 PST 2015
Ø It would be good to check that this maps correctly onto computeRegisterLiveness: there's a bug in analyzePhysReg and I think other parts of the code base are slightly wrong or will become slightly wrong as well :-(
Yes, I agree. I will also have to look into all other users of analyzePhysReg as well. There are surprisingly few users of either computeRegisterLiveness
or analyzePhysReg. The other thing that I am trying to think about would be a way to comprehensively test the correctness of these, both as they stand,
and after changes.
I am curious, does anyone know how do get this kind of Machine IR to be created from LLVM:
xor eax, eax
movw ax, mem
read eax
where the actual intent is for the xor, and the sub-register def in the movw to create form of zero-extension, and then to have full uses of eax? I know this isn't very desirable
code for X86, but these kinds of unusual machine IR are what would stress the implementations of these routines.
Kevin Smith
From: JF Bastien [mailto:jfb at google.com]
Sent: Friday, December 04, 2015 1:00 PM
To: Smith, Kevin B <kevin.b.smith at intel.com>
Cc: Sanjoy Das <sanjoy at playingwithpointers.com>; Quentin Colombet <qcolombet at apple.com>; llvm-dev at lists.llvm.org
Subject: Re: [llvm-dev] analyzePhysReg question
On Fri, Dec 4, 2015 at 8:55 AM, Smith, Kevin B via llvm-dev <llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>> wrote:
>-----Original Message-----
>From: llvm-dev [mailto:llvm-dev-bounces at lists.llvm.org<mailto:llvm-dev-bounces at lists.llvm.org>] On Behalf Of
>Sanjoy Das via llvm-dev
>Sent: Thursday, December 03, 2015 11:16 PM
>To: Quentin Colombet <qcolombet at apple.com<mailto:qcolombet at apple.com>>
>Cc: llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>
>Subject: Re: [llvm-dev] analyzePhysReg question
>
>I think this is related to PR25033:
>https://llvm.org/bugs/show_bug.cgi?id=25033#c9
Yes, I agree this is very closely related. The code referenced in that PR
if (Analysis.Kills || Analysis.Clobbers)
// Register killed, so isn't live.
return LQR_Dead;
is incorrect I think. A clobber isn't a full def, and so cannot be assumed to be a kill. Some bits from the live-in value may pass through into the live-out value.
Looking into the code for anaylzePhysReg, I think the code looks like it intends for Defines to truly mean Reg or a super-register of Reg is defined, not any overlapping Reg is defined.
The code looks like this:
bool IsRegOrSuperReg = MOReg == Reg || TRI->isSuperRegister(MOReg, Reg);
...
if (IsRegOrSuperReg) {
PRI.Defines = true; // Reg or a super-register is defined.
if (!MO.isDead())
AllDefsDead = false;
}
I think the fundamental bug here is that the operands are swapped when passed into isSuperRegister. The definition of isSuperRegister is
/// \brief Returns true if RegB is a super-register of RegA.
bool isSuperRegister(unsigned RegA, unsigned RegB) const;
so, it looks to me as if in the call to isSuperRegister, the parameters are swapped, and analyzePhysReg should really be asking whether
the operand Reg (MOReg) is a super register of Reg, and the code should be:
bool IsRegOrSuperReg = MOReg == Reg || TRI->isSuperRegister(Reg, MOReg);
It would be good to check that this maps correctly onto computeRegisterLiveness: there's a bug in analyzePhysReg and I think other parts of the code base are slightly wrong or will become slightly wrong as well :-(
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20151204/30282f3a/attachment.html>
More information about the llvm-dev
mailing list