aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2002-04-30 16:13:36 -0700
committerRichard Henderson <rth@gcc.gnu.org>2002-04-30 16:13:36 -0700
commit8e8c38cddd8e5b6921b038667216326fb36681a0 (patch)
tree06b41285ab3799d97d618f8eb3b40713043d6e83 /gcc
parenta125b7bc58ceec58eaca9b6b4eae0b36c98edac8 (diff)
downloadgcc-8e8c38cddd8e5b6921b038667216326fb36681a0.zip
gcc-8e8c38cddd8e5b6921b038667216326fb36681a0.tar.gz
gcc-8e8c38cddd8e5b6921b038667216326fb36681a0.tar.bz2
toplev.c (rest_of_compilation): Don't run cross-jump before bb-reorder.
* toplev.c (rest_of_compilation): Don't run cross-jump before bb-reorder. * gcc.dg/20020430-1.c: New. From-SVN: r52981
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/20020430-1.c190
-rw-r--r--gcc/toplev.c10
3 files changed, 201 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1d0d6e8..2ae8455 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2002-04-30 Richard Henderson <rth@redhat.com>
+
+ PR opt/6516
+ * toplev.c (rest_of_compilation): Don't run cross-jump before
+ bb-reorder.
+
2002-04-30 Tom Rix <trix@redhat.com>
* regrename.c (build_def_use, copyprop_hardreg_forward_1): Sanity
diff --git a/gcc/testsuite/gcc.dg/20020430-1.c b/gcc/testsuite/gcc.dg/20020430-1.c
new file mode 100644
index 0000000..981c4f3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20020430-1.c
@@ -0,0 +1,190 @@
+/* PR opt/6516 */
+/* On x86, something about the structure of this function prevented
+ cross-jumping from combining the three arms of the switch statement
+ until the last moment. After which we did not delete dead code,
+ which left a reference to the deleted ADDR_VEC. */
+
+/* { dg-do compile }
+/* { do-options "-O2 -frename-registers -fpic" } */
+
+typedef unsigned long XID;
+typedef XID Window;
+typedef void Display;
+typedef unsigned long Time;
+
+typedef struct {
+ int type;
+ unsigned long serial;
+ int send_event;
+ Display *display;
+ Window window;
+ Window root;
+ Window subwindow;
+ Time time;
+ int x, y;
+ int x_root, y_root;
+ unsigned int state;
+ unsigned int button;
+ int same_screen;
+} XButtonEvent;
+typedef struct {
+ int type;
+ unsigned long serial;
+ int send_event;
+ Display *display;
+ Window window;
+ Window root;
+ Window subwindow;
+ Time time;
+ int x, y;
+ int x_root, y_root;
+ unsigned int state;
+ char is_hint;
+ int same_screen;
+} XMotionEvent;
+typedef struct {
+ int type;
+ unsigned long serial;
+ int send_event;
+ Display *display;
+ Window window;
+ Window root;
+ Window subwindow;
+ Time time;
+ int x, y;
+ int x_root, y_root;
+ int mode;
+ int detail;
+ int same_screen;
+ int focus;
+ unsigned int state;
+} XCrossingEvent;
+typedef union _XEvent {
+ int type;
+ XButtonEvent xbutton;
+ XMotionEvent xmotion;
+ XCrossingEvent xcrossing;
+} XEvent;
+
+typedef struct {
+ int width, height;
+ Display *display;
+} Screen;
+typedef struct _CorePart {
+ Screen *screen;
+} CorePart;
+typedef struct _WidgetRec {
+ CorePart core;
+} WidgetRec;
+typedef struct _WidgetRec *Widget;
+
+typedef struct _SmeRec *SmeObject;
+typedef struct _SimpleMenuPart {
+ SmeObject entry_set;
+} SimpleMenuPart;
+typedef struct _SimpleMenuRec {
+ SimpleMenuPart simple_menu;
+} SimpleMenuRec;
+typedef struct _SimpleMenuRec* SimpleMenuWidget;
+
+typedef short Position;
+typedef unsigned short Dimension;
+typedef char Boolean;
+
+typedef struct _RectObjPart {
+ Position x, y;
+ Dimension width, height;
+ Dimension border_width;
+ Boolean managed;
+ Boolean sensitive;
+ Boolean ancestor_sensitive;
+}RectObjPart;
+typedef struct _RectObjRec {
+ RectObjPart rectangle;
+} RectObjRec;
+typedef struct _RectObjRec *RectObj;
+
+SmeObject DoGetEventEntry();
+
+SmeObject
+GetEventEntry(Widget w, XEvent *event)
+{
+ int x_loc, y_loc, x_root;
+ SimpleMenuWidget smw = (SimpleMenuWidget)w;
+ SmeObject entry;
+ int warp, move;
+ switch (event->type) {
+ case 6:
+ x_loc = event->xmotion.x;
+ y_loc = event->xmotion.y;
+ x_root = event->xmotion.x_root;
+ break;
+ case 7:
+ case 8:
+ x_loc = event->xcrossing.x;
+ y_loc = event->xcrossing.y;
+ x_root = event->xcrossing.x_root;
+ break;
+ case 4:
+ case 5:
+ x_loc = event->xbutton.x;
+ y_loc = event->xbutton.y;
+ x_root = event->xbutton.x_root;
+ break;
+ default:
+ XtAppError(XtWidgetToApplicationContext(w),
+ "Unknown event type in GetEventEntry().");
+ return (((void *)0));
+ }
+ if (x_loc < 0 || x_loc >= (((RectObj)smw)->rectangle.width) ||
+ y_loc < 0 || y_loc >= (((RectObj)smw)->rectangle.height))
+ return (((void *)0));
+ if (x_root == ((((w)->core.screen))->width) - 1 &&
+ (((RectObj)w)->rectangle.x) + (((RectObj)w)->rectangle.width) + ((((RectObj)w)->rectangle.border_width)) > x_root) {
+ warp = -8;
+ if (smw->simple_menu.entry_set) {
+ entry = DoGetEventEntry(w,
+ (((RectObj)smw->simple_menu.entry_set)->rectangle.x)
+ + (((RectObj)smw->simple_menu.entry_set)->rectangle.width) + 1,
+ y_loc);
+ Unhighlight(w, event, ((void *)0), ((void *)0));
+ if (entry) {
+ warp = -(int)(((RectObj)entry)->rectangle.width) >> 1;
+ move = x_loc - (((RectObj)entry)->rectangle.width) - (((RectObj)entry)->rectangle.x) + (((RectObj)w)->rectangle.border_width);
+ }
+ else {
+ warp = 0;
+ move = ((((w)->core.screen))->width) -
+ ((((RectObj)w)->rectangle.x) + (((RectObj)w)->rectangle.width) + ((((RectObj)w)->rectangle.border_width) << 1));
+ }
+ }
+ else {
+ warp = 0;
+ move = ((((w)->core.screen))->width) -
+ ((((RectObj)w)->rectangle.x) + (((RectObj)w)->rectangle.width) + ((((RectObj)w)->rectangle.border_width) << 1));
+ }
+ }
+ else if (x_root == 0 && (((RectObj)w)->rectangle.x) < 0) {
+ warp = 8;
+ if (smw->simple_menu.entry_set) {
+ entry = DoGetEventEntry(w, (((RectObj)smw->simple_menu.entry_set)->rectangle.x) - 1,
+ y_loc);
+ Unhighlight(w, event, ((void *)0), ((void *)0));
+ if (entry) {
+ warp = (((RectObj)entry)->rectangle.width) >> 1;
+ move = x_loc - (((RectObj)entry)->rectangle.x);
+ }
+ else
+ move = x_loc + (((RectObj)w)->rectangle.border_width);
+ }
+ else
+ move = x_loc + (((RectObj)w)->rectangle.border_width);
+ }
+ else
+ move = warp = 0;
+ if (move)
+ XtMoveWidget(w, (((RectObj)w)->rectangle.x) + move, (((RectObj)w)->rectangle.y));
+ if (warp)
+ XWarpPointer((((w)->core.screen)->display), 0L, 0L, 0, 0, 0, 0, warp, 0);
+ return (DoGetEventEntry(w, x_loc, y_loc));
+}
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 5afeb1c..580384f 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -3309,11 +3309,11 @@ rest_of_compilation (decl)
timevar_push (TV_REORDER_BLOCKS);
open_dump_file (DFI_bbro, decl);
- /* Last attempt to optimize CFG, as scheduling, peepholing
- and insn splitting possibly introduced more crossjumping
- oppurtuntities. */
- cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_POST_REGSTACK
- | (flag_crossjumping ? CLEANUP_CROSSJUMP : 0));
+ /* Last attempt to optimize CFG, as scheduling, peepholing and insn
+ splitting possibly introduced more crossjumping oppurtuntities.
+ Except that we can't actually run crossjumping without running
+ another DCE pass, which we can't do after reg-stack. */
+ cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_POST_REGSTACK);
if (flag_reorder_blocks)
{
reorder_basic_blocks ();