[PATCH] D38942: [DAG] Promote ADDCARRY / SUBCARRY
Roger Ferrer Ibanez via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 16 23:30:14 PDT 2017
rogfer01 added inline comments.
================
Comment at: lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp:777-787
+ SDValue LHS = GetPromotedInteger(N->getOperand(0));
+ SDValue RHS = GetPromotedInteger(N->getOperand(1));
+
+ EVT ValueVTs[] = { LHS.getValueType(), N->getValueType(1) };
+
+ SDValue Res = DAG.getNode(N->getOpcode(), SDLoc(N),
+ DAG.getVTList(ValueVTs), LHS, RHS, N->getOperand(2));
----------------
efriedma wrote:
> rogfer01 wrote:
> > This looks like a lot like the "dual" of `PromoteIntRes_Overflow` but replacing the users of `:1` (instead of `:0`). It generates correct code in Arm but I may be missing some subtlety here.
> Yes, you're missing a very important piece here: the output carry bit is wrong. You have to check whether the addition would overflow in the narrow type, not just whether it would overflow in the promoted type.
>
> What code is producing an ADDCARRY like this?
Ah! Of course!
Thanks a lot Eli. This will need fixing.
A testcase (found by csmith)
```
unsigned a, b, e;
void fn1() {
long d = (a + b < b) - e;
short c = d + 1;
if (c)
for (;;)
;
}
```
https://reviews.llvm.org/D38942
More information about the llvm-commits
mailing list