* [PATCH] Fix PR51071
@ 2011-11-10 13:43 Richard Guenther
0 siblings, 0 replies; only message in thread
From: Richard Guenther @ 2011-11-10 13:43 UTC (permalink / raw)
To: gcc-patches
When using gimple_has_side_effects on a GIMPLE_LABEL with a
LABEL_DECL with DECL_FORCED_LABEL set we ICE. That is because
gimple_has_side_effects uses TREE_SIDE_EFFECTS on the LABEL_DECL
which isn't valid. Fixed by (finally) cleaning up this
predicate, removing all code that can only be executed if we
eventually ICE and has no other side-effects.
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
Richard.
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.
Index: gcc/gimple.c
===================================================================
*** gcc/gimple.c (revision 181206)
--- gcc/gimple.c (working copy)
*************** gimple_set_modified (gimple s, bool modi
*** 2457,2464 ****
bool
gimple_has_side_effects (const_gimple s)
{
- unsigned i;
-
if (is_gimple_debug (s))
return false;
--- 2457,2462 ----
*************** gimple_has_side_effects (const_gimple s)
*** 2474,2520 ****
if (is_gimple_call (s))
{
! unsigned nargs = gimple_call_num_args (s);
! tree fn;
! 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. */
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;
}
--- 2472,2486 ----
if (is_gimple_call (s))
{
! int flags = gimple_call_flags (s);
! /* An infinite loop is considered a side effect. */
! if (!(flags & (ECF_CONST | ECF_PURE))
! || (flags & ECF_LOOPING_CONST_OR_PURE))
return true;
return false;
}
return false;
}
Index: gcc/testsuite/gcc.dg/torture/pr51071.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr51071.c (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr51071.c (revision 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);
+ }
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2011-11-10 12:07 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-10 13:43 [PATCH] Fix PR51071 Richard Guenther
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).