Effect: [(if ,test ,[c-code*] (nop)) ; one-armed if pattern (let ([join-label (unique-label 'join)]) (let ([t-code* (Pred test #f altern-label)]) `(,t-code* ... ,c-code* ... ,join-label)))] [(if ,test ,[c-code*] ,[a-code*]) (let ([altern-label (unique-label 'altern)] [join-label (unique-label 'join)]) (let ([t-code* (Pred test #f altern-label)]) `(,t-code* ... ,c-code* ... (jump (label ,join-label)) ,altern-label ,a-code* ... ,join-label)))] Pred: [(true) (if true-label `((jump (label ,true-label))) '())] [(false) (if false-label `((jump (label ,false-label))) '())] [(if ,test ,conseq ,[a-code*]) (let ([altern-label (unique-label 'altern)] [join-label (unique-label 'join)]) (let ([t-code* (Pred test #f altern-label)] [c-code* (Pred conseq true-label false-label)]) `(,t-code* ... ,c-code* ... (jump (label ,join-label)) ,altern-label ,a-code* ... ,join-label)))] Tail: [(if ,test ,[c-code*] ,[a-code*]) (let ([altern-label (unique-label 'altern)]) (let ([t-code* (Pred test #f altern-label)]) `(,t-code* ... ,c-code* ... ,altern-label ,a-code* ...)))]