diff options
author | Richard Guenther <rguenther@suse.de> | 2011-11-10 12:22:46 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-11-10 12:22:46 +0000 |
commit | 723afc4436e1c3753b152e0a14e6de5c52b07202 (patch) | |
tree | ae04cc73c7c383580aa79ea02aaddaea175a9672 /gcc | |
parent | 08d603d6edd42cd148c78336ecb7457899763f46 (diff) | |
download | gcc-723afc4436e1c3753b152e0a14e6de5c52b07202.zip gcc-723afc4436e1c3753b152e0a14e6de5c52b07202.tar.gz gcc-723afc4436e1c3753b152e0a14e6de5c52b07202.tar.bz2 |
re PR middle-end/51071 (ICE in gimple_has_side_effects, at gimple.c:2513)
2011-11-10 Richard Guenther <rguenther@suse.de>
PR middle-end/51071
* gimple.c (gimple_has_side_effects): Remove checking code
that doesn't belong here.
* gcc.dg/torture/pr51071.c: New testcase.
From-SVN: r181253
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/gimple.c | 42 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr51071.c | 33 |
4 files changed, 48 insertions, 38 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 380779b..56505f7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-11-10 Richard Guenther <rguenther@suse.de> + + PR middle-end/51071 + * gimple.c (gimple_has_side_effects): Remove checking code + that doesn't belong here. + 2011-11-10 Ira Rosen <ira.rosen@linaro.org> PR tree-optimization/51058 diff --git a/gcc/gimple.c b/gcc/gimple.c index 57f15af..6168d33 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -2457,8 +2457,6 @@ gimple_set_modified (gimple s, bool modifiedp) bool gimple_has_side_effects (const_gimple s) { - unsigned i; - if (is_gimple_debug (s)) return false; @@ -2474,47 +2472,15 @@ gimple_has_side_effects (const_gimple s) if (is_gimple_call (s)) { - unsigned nargs = gimple_call_num_args (s); - tree fn; + int flags = gimple_call_flags (s); - if (!(gimple_call_flags (s) & (ECF_CONST | ECF_PURE))) - return true; - else if (gimple_call_flags (s) & ECF_LOOPING_CONST_OR_PURE) - /* An infinite loop is considered a side effect. */ + /* An infinite loop is considered a side effect. */ + if (!(flags & (ECF_CONST | ECF_PURE)) + || (flags & ECF_LOOPING_CONST_OR_PURE)) return true; - if (gimple_call_lhs (s) - && TREE_SIDE_EFFECTS (gimple_call_lhs (s))) - { - gcc_checking_assert (gimple_has_volatile_ops (s)); - return true; - } - - fn = gimple_call_fn (s); - if (fn && TREE_SIDE_EFFECTS (fn)) - return true; - - for (i = 0; i < nargs; i++) - if (TREE_SIDE_EFFECTS (gimple_call_arg (s, i))) - { - gcc_checking_assert (gimple_has_volatile_ops (s)); - return true; - } - return false; } - else - { - for (i = 0; i < gimple_num_ops (s); i++) - { - tree op = gimple_op (s, i); - if (op && TREE_SIDE_EFFECTS (op)) - { - gcc_checking_assert (gimple_has_volatile_ops (s)); - return true; - } - } - } return false; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 833db9b..c36aa06 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-11-10 Richard Guenther <rguenther@suse.de> + + PR middle-end/51071 + * gcc.dg/torture/pr51071.c: New testcase. + 2011-11-10 Eric Botcazou <ebotcazou@adacore.com> * gnat.dg/loop_optimization9.ad[sb]: New test. diff --git a/gcc/testsuite/gcc.dg/torture/pr51071.c b/gcc/testsuite/gcc.dg/torture/pr51071.c new file mode 100644 index 0000000..99af9587 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr51071.c @@ -0,0 +1,33 @@ +/* { dg-do compile } */ + +void foo (void); +void bar (void *); +extern int t; + +static void kmalloc_large (int size, int flags) +{ + (void) size; + (void) flags; + foo (); + bar (({__here:&&__here;})); +} + +static void kmalloc (int size, int flags) +{ + if (size) + { + if ((unsigned long) size > 0x1000) + kmalloc_large (size, flags); + + if (flags) + bar (({__here:&&__here;})); + } +} + +void compress_file_range (int i, int j, int k) +{ + int nr_pages = ({j < k;}); + + if (i || t) + kmalloc (0x1000UL * nr_pages, 0x40UL); +} |