From: Eric Botcazou Date: Thu, 16 Dec 2010 22:39:15 +0000 (+0000) Subject: tree-ssa-sccvn.c (vn_reference_lookup_3): Always punt if the call to get_ref_base_and... X-Git-Tag: releases/gcc-4.5.3~367 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f804e43d3c2d9211c6c44c68766cdcfb671ac832;p=thirdparty%2Fgcc.git tree-ssa-sccvn.c (vn_reference_lookup_3): Always punt if the call to get_ref_base_and_extent returns -1 as the max size. * tree-ssa-sccvn.c (vn_reference_lookup_3): Always punt if the call to get_ref_base_and_extent returns -1 as the max size. From-SVN: r167959 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d2eeb4db425e..0d70a33e23c8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-12-16 Eric Botcazou + + * tree-ssa-sccvn.c (vn_reference_lookup_3): Always punt if the call to + get_ref_base_and_extent returns -1 as the max size. + 2010-12-16 Richard Guenther * DEV-PHASE: Set back to prerelease. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 686eda1fb27e..0d5e25526c59 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-12-16 Eric Botcazou + + * gnat.dg/opt13.adb: New test. + * gnat.dg/opt13_pkg.ad[sb]: New helper. + 2010-12-16 Release Manager * GCC 4.5.2 released. diff --git a/gcc/testsuite/gnat.dg/opt13.adb b/gcc/testsuite/gnat.dg/opt13.adb new file mode 100644 index 000000000000..9e47957e9e12 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt13.adb @@ -0,0 +1,13 @@ +-- { dg-do run } +-- { dg-options "-O" } + +with Opt13_Pkg; use Opt13_Pkg; + +procedure Opt13 is + T : My_Type; +begin + Allocate (T); + if N /= 1 then + raise Program_Error; + end if; +end; diff --git a/gcc/testsuite/gnat.dg/opt13_pkg.adb b/gcc/testsuite/gnat.dg/opt13_pkg.adb new file mode 100644 index 000000000000..b596a5c23445 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt13_pkg.adb @@ -0,0 +1,31 @@ +package body Opt13_Pkg is + + subtype Index_Type is Natural range 0 .. 16; + + type Arr is array (Index_Type range <>) of Integer; + + type Rec is record + F1, F2, F3 : Float; + N : Natural; + B1, B2 : Boolean; + F4 : Float; + end record; + + type Data (D : Index_Type) is record + A : Arr (1 .. D); + R : Rec; + end record; + + Zero : constant Rec := (0.0, 0.0, 0.0, 0, False, False, 0.0); + + procedure Allocate (T : out My_Type) is + begin + T := new Data (Index_Type'last); + T.R := Zero; + + for I in 1 .. T.A'last loop + N := 1; + end loop; + end; + +end Opt13_Pkg; diff --git a/gcc/testsuite/gnat.dg/opt13_pkg.ads b/gcc/testsuite/gnat.dg/opt13_pkg.ads new file mode 100644 index 000000000000..39567f606d48 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt13_pkg.ads @@ -0,0 +1,15 @@ +package Opt13_Pkg is + + N : Natural := 0; + + type My_Type is private; + + procedure Allocate (T : out My_Type); + +private + + type Data; + + type My_Type is access Data; + +end Opt13_Pkg; diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index de2f777156ae..9b2638f10904 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -1063,6 +1063,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) size2 = TREE_INT_CST_LOW (gimple_call_arg (def_stmt, 2)) * 8; if ((unsigned HOST_WIDE_INT)size2 / 8 == TREE_INT_CST_LOW (gimple_call_arg (def_stmt, 2)) + && maxsize2 != -1 && operand_equal_p (base, base2, 0) && offset2 <= offset && offset2 + size2 >= offset + maxsize) @@ -1086,7 +1087,8 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) HOST_WIDE_INT offset2, size2, maxsize2; base2 = get_ref_base_and_extent (gimple_assign_lhs (def_stmt), &offset2, &size2, &maxsize2); - if (operand_equal_p (base, base2, 0) + if (maxsize2 != -1 + && operand_equal_p (base, base2, 0) && offset2 <= offset && offset2 + size2 >= offset + maxsize) { @@ -1116,7 +1118,8 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) /* See if the assignment kills REF. */ base2 = get_ref_base_and_extent (gimple_assign_lhs (def_stmt), &offset2, &size2, &maxsize2); - if (!operand_equal_p (base, base2, 0) + if (maxsize2 == -1 + || !operand_equal_p (base, base2, 0) || offset2 > offset || offset2 + size2 < offset + maxsize) return (void *)-1;