[PATCH] [PATCH][ARM] Fix issue with UMLAL (unsigned multiple accumulate long) lowering
Matthias Braun
matze at braunis.de
Thu May 21 11:29:42 PDT 2015
In http://reviews.llvm.org/D9881#176316, @jyoti.allur wrote:
> Hi Matthias,
> To clarify, Constant, SRA, CopyFromReg are possible input nodes to ADDE node.
Hmm, why would you need to restrict the possible nodes here? My understanding is that UMLAL does a full 64bit addition, so I don't see why you would need to restrict those.
> I was trying to cover cases where ISD::MUL, ISD::ADDC, ISD::ADDE can be combined to a S/UMLAL where in ISD::MUL operands are less 8-bit or 16-bits operands. In these cases result can stored in a in single 32-bit register. Hence in such cases, none of ADDE 's operand will store result from ISD:MUL. Instead, one of the ADDE's operand will hold 32:63 bits of 64-bit accumulate value, while the 0:31 bits of the accumulate value is stored in one of the operands of ADDC.
>
> for example: in the assembly below,
> R1 - ACC [ 32:63 ]
> R0 - ACC [ 0:31 ]
>
> foo:
> ldrb r2, [r2]
> ldrh r3, [r3]
> mul r2, r3, r2
> adds r0, r2, r0
> adc r1, r1, #0
> bx lr
>
>
> I agree, overflow cases were not handled yet. Could you suggest how to detect overflow ?
Well you need to match patterns that are obviously fine and reject everything else.
Good things would probably be querying for the NoUnsignedWrap flag, or using SelectionDAG::computeKnownBits and test if both MUL operands have their upper 16bit known to be zero. One can probably think of more patterns so I'd factor it out into a function so people can add more patterns later.
REPOSITORY
rL LLVM
http://reviews.llvm.org/D9881
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
More information about the llvm-commits
mailing list