1/* PR target/7042. When reorg.c changed branches into return insns, it 2 completely forgot about any current_function_epilogue_delay_list and 3 dropped those insns. Uncovered on cris-axis-elf, where an insn in an 4 epilogue delay-slot set the return-value register with the testcase 5 below. Derived from ghostscript-6.52 (GPL) by hp@axis.com. */ 6 7typedef struct font_hints_s { 8 int axes_swapped; 9 int x_inverted, y_inverted; 10} font_hints; 11typedef struct gs_fixed_point_s { 12 long x, y; 13} gs_fixed_point; 14 15int 16line_hints(const font_hints *fh, const gs_fixed_point *p0, 17 const gs_fixed_point *p1) 18{ 19 long dx = p1->x - p0->x; 20 long dy = p1->y - p0->y; 21 long adx, ady; 22 int xi = fh->x_inverted, yi = fh->y_inverted; 23 int hints; 24 if (xi) 25 dx = -dx; 26 if (yi) 27 dy = -dy; 28 if (fh->axes_swapped) { 29 long t = dx; 30 int ti = xi; 31 dx = dy, xi = yi; 32 dy = t, yi = ti; 33 } 34 adx = dx < 0 ? -dx : dx; 35 ady = dy < 0 ? -dy : dy; 36 if (dy != 0 && (adx <= ady >> 4)) { 37 hints = dy > 0 ? 2 : 1; 38 if (xi) 39 hints ^= 3; 40 } else if (dx != 0 && (ady <= adx >> 4)) { 41 hints = dx < 0 ? 8 : 4; 42 if (yi) 43 hints ^= 12; 44 } else 45 hints = 0; 46 return hints; 47} 48int main () 49{ 50 static font_hints fh[] = {{0, 1, 0}, {0, 0, 1}, {0, 0, 0}}; 51 static gs_fixed_point gsf[] 52 = {{0x30000, 0x13958}, {0x30000, 0x18189}, 53 {0x13958, 0x30000}, {0x18189, 0x30000}}; 54 if (line_hints (fh, gsf, gsf + 1) != 1 55 || line_hints (fh + 1, gsf + 2, gsf + 3) != 8 56 || line_hints (fh + 2, gsf + 2, gsf + 3) != 4) 57 abort (); 58 exit (0); 59} 60