From 1b2aff657ae8ecf10efe5365e7dc3fe8523c6ebf Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20V=C3=A1zquez?= Date: Mon, 20 May 2013 22:42:13 +0100 Subject: [PATCH] NODE-SPLITTING function --- experimental/compiler.lisp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/experimental/compiler.lisp b/experimental/compiler.lisp index 3a22657..11fc293 100644 --- a/experimental/compiler.lisp +++ b/experimental/compiler.lisp @@ -854,10 +854,27 @@ (let ((order (block-order block1))) (= 1 (aref (block-dominators% block2) order)))) +;;; Check if BLOCK is a loop header. It is to say if it dominates one +;;; of its predecessors. (defun loop-header-p (block) (some (lambda (pred) (dominate-p block pred)) (block-pred block))) +;;; This function duplicates the block in component for each input +;;; edge. A technique useful to make a general flowgraph reducible. +(defun node-splitting (block) + (let ((predecessors (block-pred block))) + (when predecessors + (setf (block-pred block) (list (car predecessors))) + (dolist (pred (cdr predecessors)) + (let ((newblock (copy-basic-block block))) + (setf (block-id newblock) (generate-id 'basic-block)) + (push newblock (component-blocks (block-component block))) + (setf (block-pred newblock) (list pred)) + (setf (block-succ pred) (substitute newblock block (block-succ pred)))))))) + + + ;;;; IR Debugging ;;;; ;;;; This section provides a function `/print' which write a textual -- 1.7.10.4