diff options
| author | Ash Wolf <ninji@wuffs.org> | 2023-01-26 11:30:47 +0000 | 
|---|---|---|
| committer | Ash Wolf <ninji@wuffs.org> | 2023-01-26 11:30:47 +0000 | 
| commit | 094b96ca1df4a035b5f93c351f773306c0241f3f (patch) | |
| tree | 95ce05e3ebe816c7ee7996206bb37ea17d8ca33c /compiler_and_linker/unsorted/IroJump.c | |
| parent | fc0c4c0df7b583b55a08317cf1ef6a71d27c0440 (diff) | |
| download | MWCC-main.tar.gz MWCC-main.zip | |
move lots of source files around to match their actual placement in the original treemain
Diffstat (limited to 'compiler_and_linker/unsorted/IroJump.c')
| -rw-r--r-- | compiler_and_linker/unsorted/IroJump.c | 267 | 
1 files changed, 0 insertions, 267 deletions
| diff --git a/compiler_and_linker/unsorted/IroJump.c b/compiler_and_linker/unsorted/IroJump.c deleted file mode 100644 index e39e3f0..0000000 --- a/compiler_and_linker/unsorted/IroJump.c +++ /dev/null @@ -1,267 +0,0 @@ -#include "compiler/IroJump.h" -#include "compiler/IroDump.h" -#include "compiler/IroFlowgraph.h" -#include "compiler/IroLinearForm.h" -#include "compiler/IroUtil.h" -#include "compiler/CFunc.h" -#include "compiler/Exceptions.h" - -static Boolean CheckChain(CLabel **labelptr) { -    IRONode *node; - -    for (node = IRO_FirstNode; node; node = node->nextnode) { -        if (node->first && node->first->type == IROLinearLabel && node->first->u.label.label == *labelptr) { -            IROLinear *linear; -            CLabel *lab; -            for (linear = node->first->next, lab = NULL; linear && (linear->type == IROLinearLabel || linear->type == IROLinearNop); linear = linear->next) { -                if (linear->type == IROLinearLabel) -                    lab = linear->u.label.label; -            } - -            if (linear->type == IROLinearGoto && *labelptr != linear->u.label.label) { -                *labelptr = linear->u.label.label; -                IRO_Dump("Chaining goto at %d\n", linear->index); -                return 1; -            } - -            if (lab && *labelptr != lab) -                *labelptr = lab; -            return 0; -        } -    } - -    return 0; -} - -Boolean IRO_DoJumpChaining(void) { -    IRONode *node; -    IROLinear *linear; -    Boolean flag; -    SwitchInfo *info; -    SwitchCase *curcase; -    Boolean result; - -    result = 0; -    do { -        flag = 0; -        for (node = IRO_FirstNode; node; node = node->nextnode) { -            if (node->first) { -                linear = node->last; -                switch (linear->type) { -                    case IROLinearGoto: -                        if (CheckChain(&linear->u.label.label)) -                            flag = 1; -                        break; -                    case IROLinearIf: -                    case IROLinearIfNot: -                        if (CheckChain(&linear->u.label.label)) -                            flag = 1; -                        break; -                    case IROLinearSwitch: -                        info = linear->u.swtch.info; -                        for (curcase = info->cases; curcase; curcase = curcase->next) { -                            if (CheckChain(&curcase->label)) -                                flag = 1; -                        } -                        if (CheckChain(&info->defaultlabel)) -                            flag = 1; -                        break; -                } -            } -        } -        result |= flag; -        IRO_CheckForUserBreak(); -    } while (flag); - -    return result; -} - -void IRO_MakeReachable(IRONode *node) { -    UInt16 i; -    Boolean flag; - -    node->x36 = 1; -    do { -        flag = 0; -        for (node = IRO_FirstNode; node; node = node->nextnode) { -            if (node->x36 && !node->x37) { -                for (i = 0; i < node->numsucc; i++) { -                    if (!IRO_NodeTable[node->succ[i]]->x36) { -                        flag = 1; -                        IRO_NodeTable[node->succ[i]]->x36 = 1; -                    } -                } -                node->x37 = 1; -            } -        } -    } while (flag); -} - -Boolean IRO_RemoveUnreachable(void) { -    IRONode *node2; -    IRONode *node1; -    IROLinear *scan; -    IROLinear *linear; -    Boolean result; -    ExceptionAction **actptr; -    ExceptionAction *act; - -    result = 0; -    IRO_ComputeSuccPred(); -    IRO_MakeReachable(IRO_FirstNode); -    node1 = IRO_FirstNode; -    for (node2 = IRO_FirstNode->nextnode; node2; node2 = node2->nextnode) { -        if (node2->first && !node2->x36) { -            IRO_Dump("Removing unreachable code at: %d\n", node2->index); -            node1->nextnode = node2->nextnode; -            node1->last->next = node2->last->next; -            result = 1; -            for (linear = node2->first; linear && linear->type == IROLinearLabel && linear != node2->last->next; linear = linear->next) { -                for (scan = IRO_FirstLinear; scan; scan = scan->next) { -                    if (scan->stmt) -                        scan->stmt->marked = 0; -                } - -                for (scan = IRO_FirstLinear; scan; scan = scan->next) { -                    if (scan->stmt && !scan->stmt->marked) { -                        scan->stmt->marked = 1; -                        for (actptr = &scan->stmt->dobjstack; (act = *actptr); actptr = &act->prev) { -                            if ( -                                    (act->type == EAT_CATCHBLOCK && act->data.catch_block.catch_label == linear->u.label.label) || -                                            (act->type == EAT_SPECIFICATION && act->data.specification.unexp_label == linear->u.label.label)) { -                                *actptr = act->prev; -                            } -                        } -                    } -                } -            } -            if (node2 == IRO_LastNode) -                IRO_LastNode = node1; -        } else { -            node1 = node2; -        } -    } - -    if (result) { -        IRO_ComputeSuccPred(); -        IRO_ComputeDom(); -    } - -    IRO_CheckForUserBreak(); -    return result; -} - -Boolean IRO_RemoveRedundantJumps(void) { -    IRONode *node; -    IROLinear *linear; -    IROLinear *scan; -    IROLinear *scan2; -    SwitchInfo *info; -    SwitchCase *curcase; -    Boolean result; - -    result = 0; -    for (node = IRO_FirstNode; node; node = node->nextnode) { -        if (node->first) { -            linear = node->last; -            switch (linear->type) { -                case IROLinearGoto: -                    scan = linear->next; -                    while (scan && ((scan->type == IROLinearNop) || (scan->type == IROLinearLabel && scan->u.label.label != linear->u.label.label))) -                        scan = scan->next; -                    while (1) { -                        if (!scan) break; -                        if (scan->type != IROLinearLabel) break; -                        if (scan->u.label.label == linear->u.label.label) { -                            IRO_Dump("Removing goto next at %d\n", linear->index); -                            linear->type = IROLinearNop; -                            result = 1; -                            break; -                        } -                        scan = scan->next; -                    } -                    break; - -                case IROLinearIf: -                case IROLinearIfNot: -                    scan = linear->next; -                    while (scan && scan->type == IROLinearNop) -                        scan = scan->next; -                    if (scan && scan->type == IROLinearGoto) { -                        scan2 = scan->next; -                        while (scan2 && ((scan2->type == IROLinearNop) || (scan2->type == IROLinearLabel && scan2->u.label.label != linear->u.label.label))) -                            scan2 = scan2->next; - -                        if (scan2 && scan2->type == IROLinearLabel && scan2->u.label.label == linear->u.label.label) { -                            if (linear->type == IROLinearIf) -                                linear->type = IROLinearIfNot; -                            else -                                linear->type = IROLinearIf; - -                            linear->u.label.label = scan->u.label.label; -                            scan->type = IROLinearNop; -                            IRO_Dump("Removing branch around goto at %d\n", linear->index); -                            result = 1; -                        } -                    } - -                    scan2 = linear->next; -                    while (scan2 && ((scan2->type == IROLinearNop) || (scan2->type == IROLinearLabel && scan2->u.label.label != linear->u.label.label))) -                        scan2 = scan2->next; -                    while (1) { -                        if (!scan2) break; -                        if (scan2->type != IROLinearLabel) break; -                        if (scan2->u.label.label == linear->u.label.label) { -                            IRO_Dump("Removing If/IfNot_Goto next at %d\n", linear->index); -                            linear->type = IROLinearNop; -                            IRO_CheckSideEffect(linear->u.label.x4); -                            result = 1; -                            break; -                        } -                        scan2 = scan2->next; -                    } -                    break; - -                case IROLinearSwitch: -                    info = linear->u.swtch.info; -                    curcase = info->cases; -                    while (curcase && curcase->label == info->defaultlabel) -                        curcase = curcase->next; -                    if (!curcase) { -                        IRO_Dump("Removing Switch next at %d\n", linear->index); -                        IRO_CheckSideEffect(linear->u.swtch.x4); -                        linear->type = IROLinearGoto; -                        linear->u.label.label = info->defaultlabel; -                        result = 1; -                    } -                    break; -            } -        } -    } - -    if (result) { -        IRO_ComputeSuccPred(); -        IRO_ComputeDom(); -    } - -    IRO_CheckForUserBreak(); -    return result; -} - -Boolean IRO_RemoveLabels(void) { -    Boolean result; -    IRONode *node; - -    result = 0; -    IRO_ComputeSuccPred(); -    for (node = IRO_FirstNode; node; node = node->nextnode) { -        if (node->first && node->first->type == IROLinearLabel && !node->x39) { -            node->first->type = IROLinearNop; -            node->first->flags &= ~IROLF_1; -            result = 1; -        } -    } - -    IRO_CheckForUserBreak(); -    return result; -} | 
