Details
Diff Detail
- Repository
- rL LLVM
Event Timeline
llvm/include/llvm/ADT/APInt.h | ||
---|---|---|
2160 ↗ | (On Diff #152519) | Nit: rounding Did you consider implementing these in sdiv and udiv and passing in a defaulted Rounded parameter? That seems a bit cleaner to me. Otherwise can you please add comments on sdiv and udiv about their rounding behavior? |
llvm/lib/Support/APInt.cpp | ||
2686 ↗ | (On Diff #152519) | I'm wondering if this can be simplified. Is this logic correct: Q, R = sdivrem(A, B); if (R == 0) { return Q; } if (Q < 0) { return RoundDown ? Q-1:Q; } return RoundDown ? Q:Q-1; the logic being that if R != 0 then the quotient is "off by one" depending on its sign. |
llvm/include/llvm/ADT/APInt.h | ||
---|---|---|
2160 ↗ | (On Diff #152519) |
I thought about it, but it seems bad to just add complexity to the current APInt API, especially when we didn't find more usage. APIntOps, on the other hand, are considered by me a set of helpers built on the top of APInt, therefore not adding API complexity to APInt itself.
I'm not sure if the behavior is intentionally not promised to the user, or just undocumented. |
llvm/lib/Support/APInt.cpp | ||
2686 ↗ | (On Diff #152519) | I'm not sure, as the divisor maybe positive or negative. I found it difficult to prove. Notice that the current algorithm is easy to prove, as it doesn't care whether sdiv rounds towards zero, or down, or up (I changed the comment to make that clear). As long as Quo * B + Rem = A holds, this algorithm is correct. |
lgtm
llvm/include/llvm/ADT/APInt.h | ||
---|---|---|
2160 ↗ | (On Diff #152519) |
SGTM
But you're relying on it right, when the users requests TOWARDS_ZERO? |
llvm/lib/Support/APInt.cpp | ||
2680 ↗ | (On Diff #152762) | Nit: rounding |
This doesn't do what you think it does..
In reality this inner loop simply never runs.