Fix ICE on empty FIQ interrupt handler on ARM
authorThomas Preud'homme <thomas.preudhomme@arm.com>
Wed, 16 Nov 2016 18:30:56 +0000 (18:30 +0000)
committerThomas Preud'homme <thopre01@gcc.gnu.org>
Wed, 16 Nov 2016 18:30:56 +0000 (18:30 +0000)
2016-11-16  Thomas Preud'homme  <thomas.preudhomme@arm.com>

    gcc/
    * config/arm/arm.md (arm_addsi3): Add alternative for addition of
    general register with general register or ARM constant into SP
    register.

    gcc/testsuite/
    * gcc.target/arm/empty_fiq_handler.c: New test.

From-SVN: r242508

gcc/ChangeLog
gcc/config/arm/arm.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/empty_fiq_handler.c [new file with mode: 0644]

index 5d90c17021d71d54b84f87af26ff7a235243e651..02a309f735ff4b2e2d74c110f016940ea3613739 100644 (file)
@@ -1,3 +1,9 @@
+2016-11-16  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       * config/arm/arm.md (arm_addsi3): Add alternative for addition of
+       general register with general register or ARM constant into SP
+       register.
+
 2016-11-16  Jakub Jelinek  <jakub@redhat.com>
 
        PR fortran/78299
index 761c52f4185019435eef1a616b61a806aba72899..a4f83d6737776a087237a9784c0afbb7af11dbf7 100644 (file)
 ;;  (plus (reg rN) (reg sp)) into (reg rN).  In this case reload will
 ;; put the duplicated register first, and not try the commutative version.
 (define_insn_and_split "*arm_addsi3"
-  [(set (match_operand:SI          0 "s_register_operand" "=rk,l,l ,l ,r ,k ,r,r ,k ,r ,k,k,r ,k ,r")
-        (plus:SI (match_operand:SI 1 "s_register_operand" "%0 ,l,0 ,l ,rk,k ,r,rk,k ,rk,k,r,rk,k ,rk")
-                 (match_operand:SI 2 "reg_or_int_operand" "rk ,l,Py,Pd,rI,rI,k,Pj,Pj,L ,L,L,PJ,PJ,?n")))]
+  [(set (match_operand:SI          0 "s_register_operand" "=rk,l,l ,l ,r ,k ,r,k ,r ,k ,r ,k,k,r ,k ,r")
+       (plus:SI (match_operand:SI 1 "s_register_operand" "%0 ,l,0 ,l ,rk,k ,r,r ,rk,k ,rk,k,r,rk,k ,rk")
+                (match_operand:SI 2 "reg_or_int_operand" "rk ,l,Py,Pd,rI,rI,k,rI,Pj,Pj,L ,L,L,PJ,PJ,?n")))]
   "TARGET_32BIT"
   "@
    add%?\\t%0, %0, %2
    add%?\\t%0, %1, %2
    add%?\\t%0, %1, %2
    add%?\\t%0, %2, %1
+   add%?\\t%0, %1, %2
    addw%?\\t%0, %1, %2
    addw%?\\t%0, %1, %2
    sub%?\\t%0, %1, #%n2
                      operands[1], 0);
   DONE;
   "
-  [(set_attr "length" "2,4,4,4,4,4,4,4,4,4,4,4,4,4,16")
+  [(set_attr "length" "2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,16")
    (set_attr "predicable" "yes")
-   (set_attr "predicable_short_it" "yes,yes,yes,yes,no,no,no,no,no,no,no,no,no,no,no")
-   (set_attr "arch" "t2,t2,t2,t2,*,*,*,t2,t2,*,*,a,t2,t2,*")
+   (set_attr "predicable_short_it" "yes,yes,yes,yes,no,no,no,no,no,no,no,no,no,no,no,no")
+   (set_attr "arch" "t2,t2,t2,t2,*,*,*,a,t2,t2,*,*,a,t2,t2,*")
    (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "")
                      (const_string "alu_imm")
                      (const_string "alu_sreg")))
index e095a40262706f87956c24725c847f561983d015..4c274d731488b15f686083be40050caf68704b26 100644 (file)
@@ -1,3 +1,7 @@
+2016-11-16  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       * gcc.target/arm/empty_fiq_handler.c: New test.
+
 2016-11-16  Jakub Jelinek  <jakub@redhat.com>
 
        PR fortran/78299
diff --git a/gcc/testsuite/gcc.target/arm/empty_fiq_handler.c b/gcc/testsuite/gcc.target/arm/empty_fiq_handler.c
new file mode 100644 (file)
index 0000000..bbcfd0e
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+
+/* Below code used to trigger an ICE due to missing constraints for
+   sp = fp + cst pattern.  */
+
+void fiq_handler (void) __attribute__((interrupt ("FIQ")));
+
+void
+fiq_handler (void)
+{
+}