Question about MachineCSE optimization

Hi

I am trying to fix a bug in MachineCSE and have one question about following code:

As far as I understand it (though I didn’t write the code so I may be missing something) this is about making sure liveness flags (kill, dead) are updated correctly when merging instruction. The situations to consider are probably:

1)
OP_X …, implicit-def %X
with
OP_X …, implicit-def dead %X

The merged instruction probably should not have a dead flag set. The 2nd if appears to be about this situation:

2)
OP_X …, implicit-def dead %X
Use killed %X

OP_X …, implicit-def %X ; this gets merged with the previous OP_X
Use %X

Once we merge the 2nd OP_X with the first one, we have to drop the `killed` flags on the %X users.

Though admittedly I am at a loss right now why this is only performed for implicit operands and not for all operands…

- Matthias

As far as I understand it (though I didn’t write the code so I may be missing something) this is about making sure liveness flags (kill, dead) are updated correctly when merging instruction. The situations to consider are probably:

1)
OP_X …, implicit-def %X
with
OP_X …, implicit-def dead %X

The merged instruction probably should not have a dead flag set. The 2nd if appears to be about this situation:

2)
OP_X …, implicit-def dead %X
Use killed %X

OP_X …, implicit-def %X ; this gets merged with the previous OP_X
Use %X

This example should of course read:

OP_X …, implicit-def %X
Use killed %X

OP_X …, implicit-def %X ; this gets merged with the previous OP_X
Use %X

Once we merge the 2nd OP_X with the first one, we have to drop the `killed` flags on all users of %X between the first OP_X and the position where we had the 2nd OP_X before it was merged.

Hi mbraun

Thanks for your information.

What about following situation:

OP_X …, implicit-def dead %X

with

OP_X …, implicit-def dead %X

Between two instructions, there may be another instruction(not OP_X) which also def %X,

Is it correct to do CSE in this situation?

Best wishes

Michael

Yes
OP_X ..., implicit-def dead %X
... potentially more defs/uses of %X
OP_X ..., implicit-def dead %X

is good to merge. Also note that:

%X = DEF
OP_X ..., implicit-def dead %X
use %X

is not valid! (The def overrides the register value but the "dead" flag promises noone will read it, even though in this case another use comes below).

- Matthias

As far as I know, dead register is not only means none would read it , it may means register is clobbered.

http://lists.llvm.org/pipermail/llvm-dev/2018-February/120994.html

As far as I know, dead register is not only means none would read it , it may means register is clobbered.

Yes, any definition "clobbers" a register.