On Fri, Oct 18, 2019 at 8:49 PM Richard Earnshaw <richard.earns...@arm.com> wrote: > > > 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.
Yay ! it's quite nice to see this go in. Ramana > > 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 >