]> git.sur5r.net Git - cc65/commitdiff
Fixed a bug
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 17 May 2005 12:42:34 +0000 (12:42 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 17 May 2005 12:42:34 +0000 (12:42 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@3513 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/cc65/codeent.c
src/cc65/codeinfo.c

index 5f2b3f1eef943253ec1feea688f22cb57fad58d6..3c2f03b3276cad22f13c663de8a08a1010ecae10 100644 (file)
@@ -144,7 +144,7 @@ static void SetUseChgInfo (CodeEntry* E, const OPCDesc* D)
      * lookup the information about this function and use it. The jump itself
      * does not change any registers, so we don't need to use the data from D.
      */
-    if ((E->Info & (OF_BRA | OF_CALL)) != 0 && E->JumpTo == 0) {
+    if ((E->Info & (OF_UBRA | OF_CALL)) != 0 && E->JumpTo == 0) {
        /* A subroutine call or jump to external symbol (function exit) */
        GetFuncInfo (E->Arg, &E->Use, &E->Chg);
     } else {
index 254b4e07ddca6f757348ae72782f5b1167ddcc3c..712dd1ea602c647fe74a0bb2fb894face4f65ae4 100644 (file)
@@ -416,7 +416,7 @@ static unsigned GetRegInfo2 (CodeSeg* S,
        /* Evaluate the used registers */
        R = E->Use;
        if (E->OPC == OP65_RTS ||
-           ((E->Info & OF_BRA) != 0 && E->JumpTo == 0)) {
+                   ((E->Info & OF_UBRA) != 0 && E->JumpTo == 0)) {
            /* This instruction will leave the function */
            R |= S->ExitRegs;
        }
@@ -472,30 +472,37 @@ static unsigned GetRegInfo2 (CodeSeg* S,
         */
        } else if ((E->Info & OF_CBRA) != 0) {
 
-           if (E->JumpTo) {
+            /* Recursively determine register usage at the branch target */
+           unsigned U1;
+           unsigned U2;
 
-               /* Recursively determine register usage at the branch target */
-               unsigned U1;
-               unsigned U2;
+           if (E->JumpTo) {
 
+                /* Jump to internal label */
                U1 = GetRegInfo2 (S, E->JumpTo->Owner, -1, Visited, Used, Unused, Wanted);
-               if (U1 == REG_ALL) {
-                   /* All registers used, no need for second call */
-                   return REG_AXY;
-               }
-               if (Index < 0) {
-                   Index = CS_GetEntryIndex (S, E);
-               }
-                       if ((E = CS_GetEntry (S, ++Index)) == 0) {
-                   Internal ("GetRegInfo2: No next entry!");
-               }
-                       U2 = GetRegInfo2 (S, E, Index, Visited, Used, Unused, Wanted);
-               return U1 | U2;         /* Used in any of the branches */
 
-           } else {
-               /* Jump to global symbol */
-               break;
-           }
+            } else {
+
+                /* Jump to external label. This will effectively exit the 
+                 * function, so we use the exitregs information here.
+                 */
+                U1 = S->ExitRegs;
+
+            }
+
+            /* Get the next entry */
+            if (Index < 0) {
+                Index = CS_GetEntryIndex (S, E);
+            }
+            if ((E = CS_GetEntry (S, ++Index)) == 0) {
+                Internal ("GetRegInfo2: No next entry!");
+            }                       
+
+            /* Follow flow if branch not taken */
+            U2 = GetRegInfo2 (S, E, Index, Visited, Used, Unused, Wanted);
+
+            /* Registers are used if they're use in any of the branches */
+            return U1 | U2;
 
                } else {