backport: re PR tree-optimization/71083 (Unaligned bit-field address when predictive commoning)

2016-08-12  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        Backport from mainline
        2016-08-11  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        PR tree-optimization/71083
        * tree-predcom.c (ref_at_iteration): Correctly align the
        reference type.

testsuite:
2016-08-12  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        Backport from mainline
        2016-08-11  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        PR tree-optimization/71083
        * gcc.c-torture/execute/pr71083.c: New test.
        * gnat.dg/loop_optimization23.adb: New test.
        * gnat.dg/loop_optimization23_pkg.ads: New test.
        * gnat.dg/loop_optimization23_pkg.adb: New test.

From-SVN: r239424
This commit is contained in:
Bernd Edlinger 2016-08-12 18:56:30 +00:00 committed by Bernd Edlinger
parent a77babffdd
commit b1fa43b83c
7 changed files with 110 additions and 3 deletions

View File

@ -1,3 +1,12 @@
2016-08-12 Bernd Edlinger <bernd.edlinger@hotmail.de>
Backport from mainline
2016-08-11 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR tree-optimization/71083
* tree-predcom.c (ref_at_iteration): Correctly align the
reference type.
2016-08-08 Georg-Johann Lay <avr@gjlay.de> 2016-08-08 Georg-Johann Lay <avr@gjlay.de>
Backport from 2016-07-29 trunk r238863. Backport from 2016-07-29 trunk r238863.

View File

@ -1,3 +1,14 @@
2016-08-12 Bernd Edlinger <bernd.edlinger@hotmail.de>
Backport from mainline
2016-08-11 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR tree-optimization/71083
* gcc.c-torture/execute/pr71083.c: New test.
* gnat.dg/loop_optimization23.adb: New test.
* gnat.dg/loop_optimization23_pkg.ads: New test.
* gnat.dg/loop_optimization23_pkg.adb: New test.
2016-08-11 Jerry DeLisle <jvdelisle@gcc.gnu.org> 2016-08-11 Jerry DeLisle <jvdelisle@gcc.gnu.org>
Backport from trunk. Backport from trunk.

View File

@ -0,0 +1,43 @@
struct lock_chain {
unsigned int irq_context: 2,
depth: 6,
base: 24;
};
__attribute__((noinline, noclone))
struct lock_chain * foo (struct lock_chain *chain)
{
int i;
for (i = 0; i < 100; i++)
{
chain[i+1].base = chain[i].base;
}
return chain;
}
struct lock_chain1 {
char x;
unsigned short base;
} __attribute__((packed));
__attribute__((noinline, noclone))
struct lock_chain1 * bar (struct lock_chain1 *chain)
{
int i;
for (i = 0; i < 100; i++)
{
chain[i+1].base = chain[i].base;
}
return chain;
}
struct lock_chain test [101];
struct lock_chain1 test1 [101];
int
main ()
{
foo (test);
bar (test1);
return 0;
}

View File

@ -0,0 +1,14 @@
-- { dg-do run }
-- { dg-options "-O3" }
-- PR tree-optimization/71083
with Loop_Optimization23_Pkg;
use Loop_Optimization23_Pkg;
procedure Loop_Optimization23 is
Test : ArrayOfStructB;
begin
Test (0).b.b := 9999;
Foo (Test);
if Test (100).b.b /= 9999 then
raise Program_Error;
end if;
end;

View File

@ -0,0 +1,11 @@
-- { dg-do compile }
-- { dg-options "-O3" }
-- PR tree-optimization/71083
package body Loop_Optimization23_Pkg is
procedure Foo (X : in out ArrayOfStructB) is
begin
for K in 0..99 loop
X (K+1).b.b := X (K).b.b;
end loop;
end Foo;
end Loop_Optimization23_Pkg;

View File

@ -0,0 +1,17 @@
-- PR tree-optimization/71083
package Loop_Optimization23_Pkg is
type Nibble is mod 2**4;
type Int24 is mod 2**24;
type StructA is record
a : Nibble;
b : Int24;
end record;
pragma Pack(StructA);
type StructB is record
a : Nibble;
b : StructA;
end record;
pragma Pack(StructB);
type ArrayOfStructB is array(0..100) of StructB;
procedure Foo (X : in out ArrayOfStructB);
end Loop_Optimization23_Pkg;

View File

@ -252,6 +252,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-affine.h" #include "tree-affine.h"
#include "tree-inline.h" #include "tree-inline.h"
#include "wide-int-print.h" #include "wide-int-print.h"
#include "builtins.h"
/* The maximum number of iterations between the considered memory /* The maximum number of iterations between the considered memory
references. */ references. */
@ -1424,6 +1425,8 @@ ref_at_iteration (data_reference_p dr, int iter, gimple_seq *stmts)
addr = force_gimple_operand_1 (unshare_expr (addr), stmts, addr = force_gimple_operand_1 (unshare_expr (addr), stmts,
is_gimple_mem_ref_addr, NULL_TREE); is_gimple_mem_ref_addr, NULL_TREE);
tree alias_ptr = fold_convert (reference_alias_ptr_type (DR_REF (dr)), coff); tree alias_ptr = fold_convert (reference_alias_ptr_type (DR_REF (dr)), coff);
tree type = build_aligned_type (TREE_TYPE (DR_REF (dr)),
get_object_alignment (DR_REF (dr)));
/* While data-ref analysis punts on bit offsets it still handles /* While data-ref analysis punts on bit offsets it still handles
bitfield accesses at byte boundaries. Cope with that. Note that bitfield accesses at byte boundaries. Cope with that. Note that
we cannot simply re-apply the outer COMPONENT_REF because the we cannot simply re-apply the outer COMPONENT_REF because the
@ -1435,12 +1438,11 @@ ref_at_iteration (data_reference_p dr, int iter, gimple_seq *stmts)
{ {
tree field = TREE_OPERAND (DR_REF (dr), 1); tree field = TREE_OPERAND (DR_REF (dr), 1);
return build3 (BIT_FIELD_REF, TREE_TYPE (DR_REF (dr)), return build3 (BIT_FIELD_REF, TREE_TYPE (DR_REF (dr)),
build2 (MEM_REF, DECL_BIT_FIELD_TYPE (field), build2 (MEM_REF, type, addr, alias_ptr),
addr, alias_ptr),
DECL_SIZE (field), bitsize_zero_node); DECL_SIZE (field), bitsize_zero_node);
} }
else else
return fold_build2 (MEM_REF, TREE_TYPE (DR_REF (dr)), addr, alias_ptr); return fold_build2 (MEM_REF, type, addr, alias_ptr);
} }
/* Get the initialization expression for the INDEX-th temporary variable /* Get the initialization expression for the INDEX-th temporary variable