arc: Fixes for RTL checking
authorSegher Boessenkool <segher@kernel.crashing.org>
Fri, 24 Feb 2017 22:20:14 +0000 (23:20 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Fri, 24 Feb 2017 22:20:14 +0000 (23:20 +0100)
* config/arc/arc.c (arc_ccfsm_advance): Only take the PATTERN of
this_insn if it is an INSN or JUMP_INSN.
(force_offsettable): Look at base, not at addr.
* config/arc/predicates.md (brcc_nolimm_operator): Don't call INTVAL
on things that aren' necessarily CONST_INTs.

From-SVN: r245720

gcc/ChangeLog
gcc/config/arc/arc.c
gcc/config/arc/predicates.md

index 5e65244458ef1ffea8f54d43238e120e95445df2..d8766e277279e1471ae4446873c7a5547b156639 100644 (file)
@@ -1,3 +1,11 @@
+2017-02-24  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * config/arc/arc.c (arc_ccfsm_advance): Only take the PATTERN of
+       this_insn if it is an INSN or JUMP_INSN.
+       (force_offsettable): Look at base, not at addr.
+       * config/arc/predicates.md (brcc_nolimm_operator): Don't call INTVAL
+       on things that aren't necessarily CONST_INTs.
+
 2017-02-24  Uros Bizjak  <ubizjak@gmail.com>
 
        * doc/invoke.texi (x86 Options, -mfpmath=sse): Mention that
index 8a838f93c0b3a301ec710a78eb6b87528d0186a9..4c99f1ddcafb840e0dcdbb3b43ab19ffaf7cb581 100644 (file)
@@ -3832,8 +3832,6 @@ arc_ccfsm_advance (rtx_insn *insn, struct arc_ccfsm *state)
              break;
            }
 
-         scanbody = PATTERN (this_insn);
-
          switch (GET_CODE (this_insn))
            {
            case CODE_LABEL:
@@ -3868,6 +3866,8 @@ arc_ccfsm_advance (rtx_insn *insn, struct arc_ccfsm *state)
              break;
 
            case JUMP_INSN:
+             scanbody = PATTERN (this_insn);
+
              /* If this is an unconditional branch to the same label, succeed.
                 If it is to another label, do nothing.  If it is conditional,
                 fail.  */
@@ -3902,6 +3902,8 @@ arc_ccfsm_advance (rtx_insn *insn, struct arc_ccfsm *state)
              break;
 
            case INSN:
+             scanbody = PATTERN (this_insn);
+
              /* We can only do this with insns that can use the condition
                 codes (and don't set them).  */
              if (GET_CODE (scanbody) == SET
@@ -7401,7 +7403,7 @@ force_offsettable (rtx addr, HOST_WIDE_INT size, bool reuse)
     }
   if (!REG_P (base)
       || (REGNO (base) != STACK_POINTER_REGNUM
-         && REGNO_PTR_FRAME_P (REGNO (addr)))
+         && REGNO_PTR_FRAME_P (REGNO (base)))
       || !CONST_INT_P (offs) || !SMALL_INT (INTVAL (offs))
       || !SMALL_INT (INTVAL (offs) + size))
     {
index 159a6b4a4338f93c3ecdf45716c8c31bb5d4e9e5..0dec736be5f0585ccfb845b4dbb0fa0d940a3d7e 100644 (file)
 (define_predicate "brcc_nolimm_operator"
   (ior (match_test "REG_P (XEXP (op, 1))")
        (and (match_code "eq, ne, lt, ge, ltu, geu")
+           (match_test "CONST_INT_P (XEXP (op, 1))")
            (match_test "u6_immediate_operand (XEXP (op, 1), SImode)"))
        (and (match_code "le, gt, leu, gtu")
+           (match_test "CONST_INT_P (XEXP (op, 1))")
            (match_test "UNSIGNED_INT6 (INTVAL (XEXP (op, 1)) + 1)"))))
 
 ;; Return TRUE if this is the condition code register, if we aren't given