/* PR target/7042. When reorg.c changed branches into return insns, it completely forgot about any current_function_epilogue_delay_list and dropped those insns. Uncovered on cris-axis-elf, where an insn in an epilogue delay-slot set the return-value register with the testcase below. Derived from ghostscript-6.52 (GPL) by hp@axis.com. */ typedef struct font_hints_s { int axes_swapped; int x_inverted, y_inverted; } font_hints; typedef struct gs_fixed_point_s { long x, y; } gs_fixed_point; int line_hints(const font_hints *fh, const gs_fixed_point *p0, const gs_fixed_point *p1) { long dx = p1->x - p0->x; long dy = p1->y - p0->y; long adx, ady; int xi = fh->x_inverted, yi = fh->y_inverted; int hints; if (xi) dx = -dx; if (yi) dy = -dy; if (fh->axes_swapped) { long t = dx; int ti = xi; dx = dy, xi = yi; dy = t, yi = ti; } adx = dx < 0 ? -dx : dx; ady = dy < 0 ? -dy : dy; if (dy != 0 && (adx <= ady >> 4)) { hints = dy > 0 ? 2 : 1; if (xi) hints ^= 3; } else if (dx != 0 && (ady <= adx >> 4)) { hints = dx < 0 ? 8 : 4; if (yi) hints ^= 12; } else hints = 0; return hints; } int main () { static font_hints fh[] = {{0, 1, 0}, {0, 0, 1}, {0, 0, 0}}; static gs_fixed_point gsf[] = {{0x30000, 0x13958}, {0x30000, 0x18189}, {0x13958, 0x30000}, {0x18189, 0x30000}}; if (line_hints (fh, gsf, gsf + 1) != 1 || line_hints (fh + 1, gsf + 2, gsf + 3) != 8 || line_hints (fh + 2, gsf + 2, gsf + 3) != 4) abort (); exit (0); }