long long a();
long long b() {
  return a();
}

At the end of b there will be some useless register shuffling.
This is because return wants to have the result of a in REG_IRET.
gv checks if this is the case for BOTH registers of the long long.
After this test it uses REG_LRET for the second register if the
first is supposed to be REG_IRET. In other cases it uses RC_INT.

The patch compares the second register against the class it will
have in the end instead of the register class the first register
will have.



At this point I would like to remind those who pick up the patches
that there are two other mails by me with uncommitted fixes:
http://lists.gnu.org/archive/html/tinycc-devel/2003-10/msg00044.html
http://lists.gnu.org/archive/html/tinycc-devel/2008-08/msg00007.html

  Daniel
diff -rud tcc-0.9.24-immed4/tcc.c tcc-0.9.24-my/tcc.c
--- tcc-0.9.24-immed4/tcc.c     Fri Sep  5 18:13:54 2008
+++ tcc-0.9.24-my/tcc.c Fri Sep  5 04:21:19 2008
@@ -4975,6 +4975,9 @@
 #endif
 
         r = vtop->r & VT_VALMASK;
+        rc2 = RC_INT;
+        if (rc == RC_IRET)
+            rc2 = RC_LRET;
         /* need to reload if:
            - constant
            - lvalue (need to dereference pointer)
@@ -4983,7 +4986,7 @@
             (vtop->r & VT_LVAL) ||
             !(reg_classes[r] & rc) ||
             ((vtop->type.t & VT_BTYPE) == VT_LLONG && 
-             !(reg_classes[vtop->r2] & rc))) {
+             !(reg_classes[vtop->r2] & rc2))) {
             r = get_reg(rc);
             if ((vtop->type.t & VT_BTYPE) == VT_LLONG) {
                 /* two register type load : expand to two words
@@ -5020,9 +5023,6 @@
                     vtop->r = vtop[-1].r2;
                 }
                 /* allocate second register */
-                rc2 = RC_INT;
-                if (rc == RC_IRET)
-                    rc2 = RC_LRET;
                 r2 = get_reg(rc2);
                 load(r2, vtop);
                 vpop();

Attachment: pgpIS1IBDJQ58.pgp
Description: PGP signature

_______________________________________________
Tinycc-devel mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/tinycc-devel

Reply via email to