diff mbox

PR 61692 - Fix for inline asm ICE

Message ID 54682138.70008@LimeGreenSocks.com
State New
Headers show

Commit Message

David Wohlferd Nov. 16, 2014, 3:59 a.m. UTC
On 9/15/2014 2:51 PM, Jeff Law wrote:
> Let's go with your original inputs + outputs + labels change and punt 
> the clobbers stuff for now.
>
> jeff

I have also added the test code you requested.

I have a release on file with the FSF, but don't have SVN write access.

Problem:
extract_insn() in recog.c will ICE if (noperands > MAX_RECOG_OPERANDS).  
Normally this isn't a problem since expand_asm_operands() in cfgexpand.c 
catches and reports a proper error for this condition.  However, 
expand_asm_operands() only checks (ninputs + noutputs) instead of 
(ninputs + noutputs + nlabels), so you can get the ICE when using "asm 
goto."

ChangeLog:
2014-11-15  David Wohlferd <dw@LimeGreenSocks.com>

         PR target/61692
         * cfgexpand.c (expand_asm_operands): Count all inline asm params.
         * testsuite/gcc.dg/pr61692.c: New test.

dw

Comments

David Wohlferd Dec. 6, 2014, 12:39 p.m. UTC | #1
Ping?

dw

On 11/15/2014 7:59 PM, David Wohlferd wrote:
> On 9/15/2014 2:51 PM, Jeff Law wrote:
>> Let's go with your original inputs + outputs + labels change and punt 
>> the clobbers stuff for now.
>>
>> jeff
>
> I have also added the test code you requested.
>
> I have a release on file with the FSF, but don't have SVN write access.
>
> Problem:
> extract_insn() in recog.c will ICE if (noperands > 
> MAX_RECOG_OPERANDS).  Normally this isn't a problem since 
> expand_asm_operands() in cfgexpand.c catches and reports a proper 
> error for this condition.  However, expand_asm_operands() only checks 
> (ninputs + noutputs) instead of (ninputs + noutputs + nlabels), so you 
> can get the ICE when using "asm goto."
>
> ChangeLog:
> 2014-11-15  David Wohlferd <dw@LimeGreenSocks.com>
>
>         PR target/61692
>         * cfgexpand.c (expand_asm_operands): Count all inline asm params.
>         * testsuite/gcc.dg/pr61692.c: New test.
>
> dw
Jeff Law Dec. 8, 2014, 9:59 p.m. UTC | #2
On 11/15/14 20:59, David Wohlferd wrote:
> On 9/15/2014 2:51 PM, Jeff Law wrote:
>> Let's go with your original inputs + outputs + labels change and punt
>> the clobbers stuff for now.
>>
>> jeff
>
> I have also added the test code you requested.
>
> I have a release on file with the FSF, but don't have SVN write access.
>
> Problem:
> extract_insn() in recog.c will ICE if (noperands > MAX_RECOG_OPERANDS).
> Normally this isn't a problem since expand_asm_operands() in cfgexpand.c
> catches and reports a proper error for this condition.  However,
> expand_asm_operands() only checks (ninputs + noutputs) instead of
> (ninputs + noutputs + nlabels), so you can get the ICE when using "asm
> goto."
>
> ChangeLog:
> 2014-11-15  David Wohlferd <dw@LimeGreenSocks.com>
>
>          PR target/61692
>          * cfgexpand.c (expand_asm_operands): Count all inline asm params.
>          * testsuite/gcc.dg/pr61692.c: New test.
Thanks.  I put the testsuite ChangeLog entry in the right place and 
added a dg-do directive to the testcase to ensure we just try to compile it.

Thanks for your patience, things got rather busy and obviously I'm still 
working through my personal backlog of patches from folks.

Jeff
diff mbox

Patch

Index: gcc/cfgexpand.c
===================================================================
--- gcc/cfgexpand.c	(revision 217623)
+++ gcc/cfgexpand.c	(working copy)
@@ -2589,7 +2589,7 @@ 
     }
 
   ninputs += ninout;
-  if (ninputs + noutputs > MAX_RECOG_OPERANDS)
+  if (ninputs + noutputs + nlabels > MAX_RECOG_OPERANDS)
     {
       error ("more than %d operands in %<asm%>", MAX_RECOG_OPERANDS);
       return;
Index: gcc/testsuite/gcc.dg/pr61692.c
===================================================================
--- gcc/testsuite/gcc.dg/pr61692.c	(revision 0)
+++ gcc/testsuite/gcc.dg/pr61692.c	(working copy)
@@ -0,0 +1,173 @@ 
+/*  PR 61692  */
+
+/* Check for ice when exceededing the max #
+   of parameters to inline asm. */
+
+int Labels()
+{
+    label01: label02: label03: label04: label05:
+    label06: label07: label08: label09: label10:
+    label11: label12: label13: label14: label15:
+    label16: label17: label18: label19: label20:
+    label21: label22: label23: label24: label25:
+    label26: label27: label28: label29: label30:
+    label31:
+
+    __asm__ goto ("" /* Works. */
+        : /* no outputs */ 
+        : /* no inputs */ 
+        : /* no clobbers */
+        : label01, label02, label03, label04, label05, 
+          label06, label07, label08, label09, label10, 
+          label11, label12, label13, label14, label15, 
+          label16, label17, label18, label19, label20, 
+          label21, label22, label23, label24, label25, 
+          label26, label27, label28, label29, label30);
+
+    __asm__ goto ("" /* { dg-error "more than 30 operands" } */
+        : /* no outputs */ 
+        : /* no inputs */ 
+        : /* no clobbers */
+        : label01, label02, label03, label04, label05, 
+          label06, label07, label08, label09, label10, 
+          label11, label12, label13, label14, label15, 
+          label16, label17, label18, label19, label20, 
+          label21, label22, label23, label24, label25, 
+          label26, label27, label28, label29, label30, 
+          label31);
+
+    return 0;
+}
+
+int Labels_and_Inputs()
+{
+    int b01, b02, b03, b04, b05, b06, b07, b08, b09, b10;
+    int b11, b12, b13, b14, b15, b16, b17, b18, b19, b20;
+    int b21, b22, b23, b24, b25, b26, b27, b28, b29, b30;
+    int b31;
+
+    label01: label02: label03: label04: label05:
+    label06: label07: label08: label09: label10:
+    label11: label12: label13: label14: label15:
+    label16: label17: label18: label19: label20:
+    label21: label22: label23: label24: label25:
+    label26: label27: label28: label29: label30:
+    label31:
+
+    b01 = b02 = b03 = b04 = b05 = b06 = b07 = b08 = b09 = b10 = 0;
+    b11 = b12 = b13 = b14 = b15 = b16 = b17 = b18 = b19 = b20 = 0;
+    b21 = b22 = b23 = b24 = b25 = b26 = b27 = b28 = b29 = b30 = 0;
+    b31 = 0;
+
+    __asm__ goto ("" /* Works. */
+      : /* no outputs */
+      : "m" (b01), "m" (b02), "m" (b03), "m" (b04), "m" (b05), 
+        "m" (b06), "m" (b07), "m" (b08), "m" (b09), "m" (b10), 
+        "m" (b11), "m" (b12), "m" (b13), "m" (b14), "m" (b15),
+        "m" (b16), "m" (b17), "m" (b18), "m" (b19), "m" (b20), 
+        "m" (b21), "m" (b22), "m" (b23), "m" (b24), "m" (b25),
+        "m" (b26), "m" (b27), "m" (b28), "m" (b29)
+      : /* no clobbers */
+      : label01);
+
+    __asm__ goto ("" /* { dg-error "more than 30 operands" } */
+      : /* no outputs */
+      : "m" (b01), "m" (b02), "m" (b03), "m" (b04), "m" (b05), 
+        "m" (b06), "m" (b07), "m" (b08), "m" (b09), "m" (b10), 
+        "m" (b11), "m" (b12), "m" (b13), "m" (b14), "m" (b15),
+        "m" (b16), "m" (b17), "m" (b18), "m" (b19), "m" (b20), 
+        "m" (b21), "m" (b22), "m" (b23), "m" (b24), "m" (b25),
+        "m" (b26), "m" (b27), "m" (b28), "m" (b29), "m" (b30)
+      : /* no clobbers */
+      : label01);
+
+      return 0;
+}
+
+int Outputs()
+{
+    int b01, b02, b03, b04, b05, b06, b07, b08, b09, b10;
+    int b11, b12, b13, b14, b15, b16, b17, b18, b19, b20;
+    int b21, b22, b23, b24, b25, b26, b27, b28, b29, b30;
+    int b31;
+
+    /* Outputs. */
+    __asm__ volatile ("" /* Works. */
+         : "=m" (b01),  "=m" (b02),  "=m" (b03),  "=m" (b04), "=m" (b05),
+           "=m" (b06),  "=m" (b07),  "=m" (b08),  "=m" (b09), "=m" (b10),
+           "=m" (b11),  "=m" (b12),  "=m" (b13),  "=m" (b14), "=m" (b15),
+           "=m" (b16),  "=m" (b17),  "=m" (b18),  "=m" (b19), "=m" (b20), 
+           "=m" (b21),  "=m" (b22),  "=m" (b23),  "=m" (b24), "=m" (b25),
+           "=m" (b26),  "=m" (b27),  "=m" (b28),  "=m" (b29), "=m" (b30));
+
+    __asm__ volatile ("" /* { dg-error "more than 30 operands" } */
+         : "=m" (b01),  "=m" (b02),  "=m" (b03),  "=m" (b04), "=m" (b05),
+           "=m" (b06),  "=m" (b07),  "=m" (b08),  "=m" (b09), "=m" (b10),
+           "=m" (b11),  "=m" (b12),  "=m" (b13),  "=m" (b14), "=m" (b15),
+           "=m" (b16),  "=m" (b17),  "=m" (b18),  "=m" (b19), "=m" (b20), 
+           "=m" (b21),  "=m" (b22),  "=m" (b23),  "=m" (b24), "=m" (b25),
+           "=m" (b26),  "=m" (b27),  "=m" (b28),  "=m" (b29), "=m" (b30),
+           "=m" (b31));
+
+    return 0;
+}
+
+int Inputs()
+{
+    int b01, b02, b03, b04, b05, b06, b07, b08, b09, b10;
+    int b11, b12, b13, b14, b15, b16, b17, b18, b19, b20;
+    int b21, b22, b23, b24, b25, b26, b27, b28, b29, b30;
+    int b31;
+
+    b01 = b02 = b03 = b04 = b05 = b06 = b07 = b08 = b09 = b10 = 0;
+    b11 = b12 = b13 = b14 = b15 = b16 = b17 = b18 = b19 = b20 = 0;
+    b21 = b22 = b23 = b24 = b25 = b26 = b27 = b28 = b29 = b30 = 0;
+    b31 = 0;
+
+    __asm__ volatile ("" /* Works. */
+      : /* no outputs */
+      : "m" (b01), "m" (b02), "m" (b03), "m" (b04), "m" (b05), 
+        "m" (b06), "m" (b07), "m" (b08), "m" (b09), "m" (b10), 
+        "m" (b11), "m" (b12), "m" (b13), "m" (b14), "m" (b15),
+        "m" (b16), "m" (b17), "m" (b18), "m" (b19), "m" (b20), 
+        "m" (b21), "m" (b22), "m" (b23), "m" (b24), "m" (b25),
+        "m" (b26), "m" (b27), "m" (b28), "m" (b29), "m" (b30));
+
+    __asm__ volatile ("" /* { dg-error "more than 30 operands" } */
+      : /* no outputs */
+      : "m" (b01), "m" (b02), "m" (b03), "m" (b04), "m" (b05), 
+        "m" (b06), "m" (b07), "m" (b08), "m" (b09), "m" (b10), 
+        "m" (b11), "m" (b12), "m" (b13), "m" (b14), "m" (b15),
+        "m" (b16), "m" (b17), "m" (b18), "m" (b19), "m" (b20), 
+        "m" (b21), "m" (b22), "m" (b23), "m" (b24), "m" (b25),
+        "m" (b26), "m" (b27), "m" (b28), "m" (b29), "m" (b30),
+        "m" (b31));
+
+    return 0;
+}
+
+int Input_Output()
+{
+    int b01, b02, b03, b04, b05, b06, b07, b08, b09, b10;
+    int b11, b12, b13, b14, b15, b16, b17, b18, b19, b20;
+    int b21, b22, b23, b24, b25, b26, b27, b28, b29, b30;
+    int b31;
+
+    b01 = b02 = b03 = b04 = b05 = b06 = b07 = b08 = b09 = b10 = 0;
+    b11 = b12 = b13 = b14 = b15 = b16 = b17 = b18 = b19 = b20 = 0;
+    b21 = b22 = b23 = b24 = b25 = b26 = b27 = b28 = b29 = b30 = 0;
+    b31 = 0;
+
+    __asm__ volatile ("" /* Works. */
+         : "+m" (b01),  "+m" (b02),  "+m" (b03),  "+m" (b04), "+m" (b05),
+           "+m" (b06),  "+m" (b07),  "+m" (b08),  "+m" (b09), "+m" (b10),
+           "+m" (b11),  "+m" (b12),  "+m" (b13),  "+m" (b14), "+m" (b15));
+
+    __asm__ volatile ("" /* { dg-error "more than 30 operands" } */
+         : "+m" (b01),  "+m" (b02),  "+m" (b03),  "+m" (b04), "+m" (b05),
+           "+m" (b06),  "+m" (b07),  "+m" (b08),  "+m" (b09), "+m" (b10),
+           "+m" (b11),  "+m" (b12),  "+m" (b13),  "+m" (b14), "+m" (b15),
+           "+m" (b16));
+
+    return 0;
+}