Update the table to return call output values in the right registers. Fix the
authorDavid Given <dg@cowlark.com>
Fri, 11 Nov 2016 20:48:36 +0000 (21:48 +0100)
committerDavid Given <dg@cowlark.com>
Fri, 11 Nov 2016 20:48:36 +0000 (21:48 +0100)
register allocator so the corrupted registers only apply to throughs
(otherwise, you can't put output registers in corrupted registers).

mach/powerpc/mcg/table
mach/proto/mcg/pass_registerallocator.c

index 486d983..a6f416b 100644 (file)
@@ -19,7 +19,7 @@ REGISTERS
     r6                                            int volatile;
     r5                                            int volatile;
     r4                                            int volatile;
-    r3                                            int volatile ret;
+    r3                                            int volatile iret;
 
     r31                                           int; 
     r30                                           int; 
@@ -185,7 +185,7 @@ PATTERNS
                emit "addi sp, sp, 8"
                cost 8;
                
-       SETRET.I(in:(ret)reg)
+       SETRET.I(in:(iret)reg)
                emit "! setret4"
                cost 1;
 
@@ -392,12 +392,12 @@ PATTERNS
         emit "li32 %out.1, 0"
         cost 8;
 
-    out:(ret)reg = FROMF.I(in:(dret)reg)
+    out:(iret)reg = FROMF.I(in:(dret)reg)
         with corrupted(volatile)
         emit "bl .fromf2i"
         cost 4;
 
-    out:(ret)reg = FROMD.I(in:(dret)reg)
+    out:(iret)reg = FROMD.I(in:(dret)reg)
         with corrupted(volatile)
         emit "bl .fromd2i"
         cost 4;
@@ -407,17 +407,17 @@ PATTERNS
         emit "bl .fromf2l"
         cost 4;
 
-    out:(dret)reg = FROMSI.D(in:(ret)reg)
+    out:(dret)reg = FROMSI.D(in:(iret)reg)
         with corrupted(volatile)
         emit "bl .fromsi2d"
         cost 4;
 
-    out:(fret)reg = FROMUI.F(in:(ret)reg)
+    out:(fret)reg = FROMUI.F(in:(iret)reg)
         with corrupted(volatile)
         emit "bl .fromui2f"
         cost 4;
 
-    out:(dret)reg = FROMUI.D(in:(ret)reg)
+    out:(dret)reg = FROMUI.D(in:(iret)reg)
         with corrupted(volatile)
         emit "bl .fromui2d"
         cost 4;
@@ -493,8 +493,8 @@ PATTERNS
             cost 4;
 
     CALLLABEL(CALL)
-    out:(int)reg = CALLLABEL(CALL.I)
-    out:(long)reg = CALLLABEL(CALL.L)
+    out:(iret)reg = CALLLABEL(CALL.I)
+    out:(lret)reg = CALLLABEL(CALL.L)
 
     #define CALLINDIRECT(insn) \
         insn (dest:(int)reg) \
@@ -504,8 +504,8 @@ PATTERNS
             cost 8;
 
     CALLINDIRECT(CALL)
-    out:(int)reg = CALLINDIRECT(CALL.I)
-    out:(long)reg = CALLINDIRECT(CALL.L)
+    out:(iret)reg = CALLINDIRECT(CALL.I)
+    out:(lret)reg = CALLINDIRECT(CALL.L)
 
     JUMP(dest:LABEL.I)
         emit "b $dest"
index 7c348f0..a064adb 100644 (file)
@@ -153,8 +153,7 @@ static bool allocatable_stackable_input(struct hreg* hreg, struct vreg* vreg)
 static bool allocatable_stackable_output(struct hreg* hreg, struct vreg* vreg)
 {
     return !register_used(current_outs, hreg) &&
-        (hreg->attrs & vreg->type) &&
-        !(hreg->attrs & current_hop->insndata->corrupts);
+        (hreg->attrs & vreg->type);
 }
 
 static bool allocatable_input(struct hreg* hreg, struct vreg* vreg)
@@ -174,7 +173,8 @@ static bool allocatable_output(struct hreg* hreg, struct vreg* vreg)
 static bool allocatable_through(struct hreg* hreg, struct vreg* vreg)
 {
     return allocatable_stackable_input(hreg, vreg) &&
-        allocatable_stackable_output(hreg, vreg);
+        allocatable_stackable_output(hreg, vreg) &&
+        !(hreg->attrs & current_hop->insndata->corrupts);
 }
 
 static struct hreg* find_input_reg(struct vreg* vreg)
@@ -203,9 +203,7 @@ static struct hreg* find_output_reg(struct vreg* vreg)
     {
         hreg = hregs.item[i];
         if (allocatable_output(hreg, vreg))
-        {
             return hreg;
-        }
     }
 
     return NULL;