This series of patches rewrites all the DImode arithmetic patterns for the Arm backend when compiling for Arm or Thumb2 to split the operations during expand (the thumb1 code is unchanged and cannot benefit from early splitting as we are unable to expose the carry flag).
This has a number of benefits: - register allocation has more freedom to use independent registers for the upper and lower halves of the register - we can make better use of combine for spotting insn merge opportunities without needing many additional patterns that are only used for DImode - we eliminate a number of bugs in the machine description where the carry calculations were not correctly propagated by the split patterns (we mostly got away with this because the splitting previously happened only after most of the important optimization passes had been run). The patch series starts by paring back all the DImode arithmetic support to a very simple form without any splitting at all and then progressively re-implementing the patterns with early split operations. This proved to be the only sane way of untangling the existing code due to a number of latent bugs which would have been exposed if a different approach had been taken. Each patch should produce a working compiler (it did when it was originally written), though since the patch set has been re-ordered slightly there is a possibility that some of the intermediate steps may have missing test updates that are only cleaned up later. However, only the end of the series should be considered complete. I've kept the patch as a series to permit easier regression hunting should that prove necessary. R. Richard Earnshaw (29): [arm] Rip out DImode addition and subtraction splits. [arm] Perform early splitting of adddi3. [arm] Early split zero- and sign-extension [arm] Rewrite addsi3_carryin_shift_<optab> in canonical form [arm] fix constraints on addsi3_carryin_alt2 [arm] Early split subdi3 [arm] Remove redundant DImode subtract patterns [arm] Introduce arm_carry_operation [arm] Correctly cost addition with a carry-in [arm] Correct cost calculations involving borrow for subtracts. [arm] Reduce cost of insns that are simple reg-reg moves. [arm] Implement negscc using SBC when appropriate. [arm] Add alternative canonicalizations for subtract-with-carry + shift [arm] Early split simple DImode equality comparisons [arm] Improve handling of DImode comparisions against constants. [arm] early split most DImode comparison operations. [arm] Handle some constant comparisons using rsbs+rscs [arm] Cleanup dead code - old support for DImode comparisons [arm] Handle immediate values in uaddvsi4 [arm] Early expansion of uaddvdi4. [arm] Improve code generation for addvsi4. [arm] Allow the summation result of signed add-with-overflow to be discarded. [arm] Early split addvdi4 [arm] Improve constant handling for usubvsi4. [arm] Early expansion of usubvdi4. [arm] Improve constant handling for subvsi4. [arm] Early expansion of subvdi4 [arm] Improvements to negvsi4 and negvdi4. [arm] Fix testsuite nit when compiling for thumb2 gcc/config/arm/arm-modes.def | 19 +- gcc/config/arm/arm-protos.h | 1 + gcc/config/arm/arm.c | 598 ++++- gcc/config/arm/arm.md | 2020 ++++++++++------- gcc/config/arm/iterators.md | 15 +- gcc/config/arm/predicates.md | 29 +- gcc/config/arm/thumb2.md | 8 +- .../gcc.dg/builtin-arith-overflow-3.c | 41 + gcc/testsuite/gcc.target/arm/negdi-3.c | 4 +- 9 files changed, 1757 insertions(+), 978 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/builtin-arith-overflow-3.c