From: Richard Biener Date: Mon, 10 Feb 2014 13:51:23 +0000 (+0000) Subject: re PR tree-optimization/60115 (wrong code at -O3 on x86_64-linux-gnu) X-Git-Tag: releases/gcc-4.9.0~983 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4e1f39e43a61a05299036307745d54fadbfa4971;p=thirdparty%2Fgcc.git re PR tree-optimization/60115 (wrong code at -O3 on x86_64-linux-gnu) 2014-02-10 Richard Biener PR tree-optimization/60115 * tree-eh.c (tree_could_trap_p): Unify TARGET_MEM_REF and MEM_REF handling. Properly verify that the accesses are not out of the objects bound. * gcc.dg/torture/pr60115.c: New testcase. From-SVN: r207656 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index be69545da96f..4abc6eb60c7e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-02-10 Richard Biener + + PR tree-optimization/60115 + * tree-eh.c (tree_could_trap_p): Unify TARGET_MEM_REF and + MEM_REF handling. Properly verify that the accesses are not + out of the objects bound. + 2014-02-10 Kyrylo Tkachov * config/aarch64/aarch64.c (aarch64_override_options): Fix typo from diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ff6ecfa74058..ebe1e51eb29a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-02-10 Richard Biener + + PR tree-optimization/60115 + * gcc.dg/torture/pr60115.c: New testcase. + 2014-02-10 Eric Botcazou * g++.dg/vect/pr33426-ivdep-3.cc: Require vect_int_mult as well. diff --git a/gcc/testsuite/gcc.dg/torture/pr60115.c b/gcc/testsuite/gcc.dg/torture/pr60115.c new file mode 100644 index 000000000000..cf7f45dfb06a --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr60115.c @@ -0,0 +1,14 @@ +/* { dg-do run } */ + +int a, b[2]; + +int +main () +{ +lbl: + for (; a; a--) + if (b[10000]) + goto lbl; + + return 0; +} diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index 857ee4581bca..06941cd17458 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -2610,12 +2610,6 @@ tree_could_trap_p (tree expr) restart: switch (code) { - case TARGET_MEM_REF: - if (TREE_CODE (TMR_BASE (expr)) == ADDR_EXPR - && !TMR_INDEX (expr) && !TMR_INDEX2 (expr)) - return false; - return !TREE_THIS_NOTRAP (expr); - case COMPONENT_REF: case REALPART_EXPR: case IMAGPART_EXPR: @@ -2642,10 +2636,36 @@ tree_could_trap_p (tree expr) return false; return !in_array_bounds_p (expr); + case TARGET_MEM_REF: case MEM_REF: - if (TREE_CODE (TREE_OPERAND (expr, 0)) == ADDR_EXPR) + if (TREE_CODE (TREE_OPERAND (expr, 0)) == ADDR_EXPR + && tree_could_trap_p (TREE_OPERAND (TREE_OPERAND (expr, 0), 0))) + return true; + if (TREE_THIS_NOTRAP (expr)) return false; - /* Fallthru. */ + /* We cannot prove that the access is in-bounds when we have + variable-index TARGET_MEM_REFs. */ + if (code == TARGET_MEM_REF + && (TMR_INDEX (expr) || TMR_INDEX2 (expr))) + return true; + if (TREE_CODE (TREE_OPERAND (expr, 0)) == ADDR_EXPR) + { + tree base = TREE_OPERAND (TREE_OPERAND (expr, 0), 0); + double_int off = mem_ref_offset (expr); + if (off.is_negative ()) + return true; + if (TREE_CODE (base) == STRING_CST) + return double_int::from_uhwi (TREE_STRING_LENGTH (base)).ule (off); + else if (DECL_SIZE_UNIT (base) == NULL_TREE + || TREE_CODE (DECL_SIZE_UNIT (base)) != INTEGER_CST + || tree_to_double_int (DECL_SIZE_UNIT (base)).ule (off)) + return true; + /* Now we are sure the first byte of the access is inside + the object. */ + return false; + } + return true; + case INDIRECT_REF: return !TREE_THIS_NOTRAP (expr);