[LLVMdev] Physical register definition removed by MachineCSE

Mikael Holmén
Mon, 18 Aug 2014 07:07:09 -0000

Hi,

On 08/15/14 16:15, Tom Stellard wrote:
> On Fri, Aug 15, 2014 at 11:18:51AM +0200, Mikael Holmén wrote:
>> Hi,
>>
>> My target has a special configuration register that many
>> instructions read implicitly, configuring for example if an add
>> instruction should saturate at over/underflow or not.
>>
>
>> Now, I have a problem where the MachineCSE removes a setting of this
>> configuration register in a basic block, because
>> MachineCSE::isPhysDefTriviallyDead can't find any uses of it in the
>> basic block where it's defined.
>>
>> Similar to other special physical registers, e.g the stack pointer,
>> this configuration register is marked as "reserved".
>>
>> Is there anything else I need to do for the MachineCSE to leave this
>> register and not remove it just because it can't find any uses in
>> the current basic block?
>
> Have you added this register as an implicit use to the instructions
> like add whose behavior depends on its value?

Yes.

So it's like

BB1:
...
def ConfReg
... <no uses of ConfReg>
branch cond BB2
branch BB3

BB2:
...
add ... <imp-use ConfReg>
...


Since there are no uses of ConfReg after the ConfReg def in BB1,
MachineCSE::isPhysDefTriviallyDead decides ConfReg is trivially dead,
and removes the setting.

Best Regards,
Mikael

>
> -Tom


>
>>
>> Best regards,
>> Mikael Holmén
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>