Paul Edwards wrote: > int > i370_branch_dest (branch) > rtx branch; > { > rtx dest = SET_SRC (PATTERN (branch)); > int dest_uid; > int dest_addr; > > /* first, compute the estimated address of the branch target */ > if (GET_CODE (dest) == IF_THEN_ELSE) > dest = XEXP (dest, 1); > dest = XEXP (dest, 0);
This is set up only to handle direct branches of the form (set (pc) (label_ref ...)) and indirect branches of the form (set (pc) (if_then_else (...) (label_ref ...) (pc))) but *not* indirect branches of the form (set (pc) (if_then_else (...) (pc) (label_ref ...))) This latter form is accepted by the "negated conditional jump instructions in the i370.md file, like so: (define_insn "" [(set (pc) (if_then_else (eq (cc0) (const_int 0)) (pc) (label_ref (match_operand 0 "" "")))) ; (clobber (reg:SI 14)) ] "" "* { check_label_emit (); mvs_check_page (0, 4, 0); if (i370_short_branch(insn) || mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) { Therefore, the i370_branch_dest routine needs to handle those as well. Probably something along the following lines: if (GET_CODE (dest) == IF_THEN_ELSE) { if (GET_CODE (XEXP (dest, 1) == LABEL_REF) dest = XEXP (dest, 1); else dest = XEXP (dest, 2); } gcc_assert (GET_CODE (dest) == LABEL_REF); dest = XEXP (dest, 0); Bye, Ulrich -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE ulrich.weig...@de.ibm.com