[llvm-dev] RFC: Legalize input operand to ATOMIC_CMP_SWAP* by zero-extending

Nemanja Ivanovic via llvm-dev llvm-dev at lists.llvm.org
Fri Jan 5 16:02:33 PST 2018

I've already posted a patch (https://reviews.llvm.org/D41791) to do this,
but here's a bit of a background.

When the operands of an ISD::ATOMIC_CMP_SWAP{_WITH_SUCCESS} are legalized
by promoting to a larger type, they're extended without specifying whether
it's a sign or zero extension. However, an analogous node (SETCC) is
legalized by zero-extending when the comparison code is for an equality

The current legalization scheme leads to a bug in the PPC back end when the
input is a negative constant. Namely, the unspecified extension causes the
constant to be materialized with a sign-extending instruction. However, the
atomic load instruction is a zero-extending instruction. Then the
comparison is done on a wider register, leading to a bug. Of course, this
can be fixed in the PPC codegen, but I think it makes more sense to change
how this is legalized since the underlying comparison is indeed an equality

Please let me know what you think. Also, if this is a direction we want to
go in, I would appreciate it if people can review the changed test cases.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180106/a61b9914/attachment.html>

More information about the llvm-dev mailing list