diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr64705.c b/gcc/testsuite/gcc.dg/tree-ssa/pr64705.c index fd24e38a53e9f3a4659dece5af4d71fbc0ce2c18..3c9c2e5deed1ba755d1fae15a6553d68b6ad0098 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr64705.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr64705.c @@ -23,4 +23,4 @@ int foo(char *flags, long len, long i, long steps) /* Don't expand iv {base+step, step}_loop into {base+x+y, step}_loop even if "step == x + y". */ -/* { dg-final { scan-tree-dump "Base:\\tstep_\[0-9\]* \\+ iter|Base:\\titer_\[0-9\]* \\+ step" "ivopts"} } */ +/* { dg-final { scan-tree-dump {Base:\t\(unsigned ?.*\) step_[0-9]* \+ \(unsigned ?.*\) iter|Base:\t\(unsigned ?.*\) iter_[0-9]* \+ \(unsigned ?.*\) step} "ivopts"} } */ diff --git a/gcc/testsuite/gcc.target/i386/pr115462.c b/gcc/testsuite/gcc.target/i386/pr115462.c index ad50a6382bc4bed3e24a281663f50d24b989560d..6526f99bf0e3849c0f633932f24bd7e93d737f46 100644 --- a/gcc/testsuite/gcc.target/i386/pr115462.c +++ b/gcc/testsuite/gcc.target/i386/pr115462.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -mavx2 -fno-tree-vectorize -fno-pic" } */ -/* { dg-final { scan-assembler-times {(?n)movl[ \t]+.*, p1\.0\+[0-9]*\(,} 3 } } */ +/* { dg-final { scan-assembler-times {(?n)movl[ \t]+.*, p1\.0\+[0-9]*\(,} 1 } } */ int foo (long indx, long indx2, long indx3, long indx4, long indx5, long indx6, long n, int* q) diff --git a/gcc/testsuite/gfortran.dg/addressing-modes_1.f90 b/gcc/testsuite/gfortran.dg/addressing-modes_1.f90 new file mode 100644 index 0000000000000000000000000000000000000000..334d5bc47a16e53e9168bb1f90dfeff584b4e494 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/addressing-modes_1.f90 @@ -0,0 +1,37 @@ +! { dg-do compile { target aarch64-*-* } } +! { dg-additional-options "-w -Ofast" } + + module brute_force + integer, parameter :: r=9 + integer block(r, r, 0) + contains + subroutine brute + do + do + do + do + do + do + do i7 = l0, 1 + select case(1 ) + case(1) + block(:2, 7:, 1) = block(:2, 7:, i7) - 1 + end select + do i8 = 1, 1 + do i9 = 1, 1 + if(1 == 1) then + call digits_20 + end if + end do + end do + end do + end do + end do + end do + end do + end do + end do + end + end + +! { dg-final { scan-assembler-not {ldr\s+d([0-9]+),\s+\[x[0-9]+, x[0-9]+\]} } } diff --git a/gcc/tree-ssa-loop-ivopts.cc b/gcc/tree-ssa-loop-ivopts.cc index df1b6b871e395a33bfb86254d6fbd35c1f69962c..989321137df93349f8395a9f746f73eda52fd74f 100644 --- a/gcc/tree-ssa-loop-ivopts.cc +++ b/gcc/tree-ssa-loop-ivopts.cc @@ -1189,19 +1189,19 @@ alloc_iv (struct ivopts_data *data, tree base, tree step, sizeof (struct iv)); gcc_assert (step != NULL_TREE); - /* Lower address expression in base except ones with DECL_P as operand. - By doing this: + /* Canonicalize the address expression in base if it were an unsigned + computation. That leads to more equalities being detected and results in: + 1) More accurate cost can be computed for address expressions; 2) Duplicate candidates won't be created for bases in different - forms, like &a[0] and &a. */ + forms, like &a[0] and &a. + 3) Duplicate candidates won't be created for IV expressions that differ + only in their sign. */ + aff_tree comb; STRIP_NOPS (expr); - if ((TREE_CODE (expr) == ADDR_EXPR && !DECL_P (TREE_OPERAND (expr, 0))) - || contain_complex_addr_expr (expr)) - { - aff_tree comb; - tree_to_aff_combination (expr, TREE_TYPE (expr), &comb); - base = fold_convert (TREE_TYPE (base), aff_combination_to_tree (&comb)); - } + expr = fold_convert (unsigned_type_for (TREE_TYPE (expr)), expr); + tree_to_aff_combination (expr, TREE_TYPE (expr), &comb); + base = fold_convert (TREE_TYPE (base), aff_combination_to_tree (&comb)); iv->base = base; iv->base_object = determine_base_object (data, base);