Physical register definition removed by MachineCSE

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?

Best regards,
Mikael Holmén

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?

-Tom

Hi,

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

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?

The instructions which set this control register are distinct from normal reg-to-reg moves and such, I assume? The way that’s typically modeled is to mark those instructions as having side effects (hasSideEffects=1) in the .td file.

Note that LLVM doesn’t have any more general notion of things like saturating arithmetic, so it is possible (likely even) that you’ll end up with some strange mis-optimizations when operations get optimized across one of those instructions. That’s a wholly separate issue, though.

-Jim