The attached patch is to fix PR target/64833 which is a 4.9/5/6 regression. The target reorg may replace casesi_worker_1 insn with casesi_worker_2 with a temporary wrong length for PIC. It can result the wrong position of the constant pool. See PR target/64833 for details. The patch set the length of casesi_worker_1 to 8 for PIC so to avoid that misplacement of the constant pool. It's tested on sh4-unknown-linux-gnu. Committed on trunk. I'll backport it to 5 and 4.9.
Regards, kaz -- 2015-06-30 Kaz Kojima <kkoj...@gcc.gnu.org> PR target/64833 * config/sh/sh.md (casesi_worker_1): Set length to 8 when flag_pic is set. diff --git a/config/sh/sh.md b/config/sh/sh.md index 35113c0..5c8d306 100644 --- a/config/sh/sh.md +++ b/config/sh/sh.md @@ -11344,6 +11344,8 @@ label: LABEL_NUSES (operands[2])++; }) +;; This may be replaced with casesi_worker_2 in sh_reorg for PIC. +;; The insn length is set to 8 for that case. (define_insn "casesi_worker_1" [(set (match_operand:SI 0 "register_operand" "=r,r") (unspec:SI [(reg:SI R0_REG) @@ -11375,7 +11377,9 @@ label: gcc_unreachable (); } } - [(set_attr "length" "4")]) + [(set_attr_alternative "length" + [(if_then_else (match_test "flag_pic") (const_int 8) (const_int 4)) + (if_then_else (match_test "flag_pic") (const_int 8) (const_int 4))])]) (define_insn "casesi_worker_2" [(set (match_operand:SI 0 "register_operand" "=r,r")