From bd264323139f8fcc5c6b3a9041a2b79899c1ae36 Mon Sep 17 00:00:00 2001 From: armeetj <38377327+armeetj@users.noreply.github.com> Date: Wed, 8 Apr 2026 21:30:10 +0000 Subject: [PATCH] Add static web UI for nanopass compiler pipeline visualization --- web/app.js | 510 ++++++++++++++++++++++++++++++++++++++++++++++++++++ web/data.js | 326 +++++++++++++++++++++++++++++++++ 2 files changed, 836 insertions(+) create mode 100644 web/app.js create mode 100644 web/data.js diff --git a/web/app.js b/web/app.js new file mode 100644 index 0000000..16609cd --- /dev/null +++ b/web/app.js @@ -0,0 +1,510 @@ +(function() { + 'use strict'; + + // State + const state = { + selectedExampleIndex: 0, + selectedPassIndex: 0, + viewMode: 'output' // 'output' or 'diff' + }; + + // Elements + const elements = { + examplesList: document.getElementById('examples-list'), + sourceCode: document.getElementById('source-code').querySelector('code'), + pipelineStrip: document.getElementById('pipeline-strip'), + passName: document.getElementById('pass-name'), + passDescription: document.getElementById('pass-description'), + passPhase: document.getElementById('pass-phase'), + outputCode: document.getElementById('output-code').querySelector('code'), + outputView: document.getElementById('output-view'), + diffView: document.getElementById('diff-view'), + diffLeftLabel: document.getElementById('diff-left-label'), + diffLeft: document.getElementById('diff-left').querySelector('code'), + diffRightLabel: document.getElementById('diff-right-label'), + diffRight: document.getElementById('diff-right').querySelector('code'), + toggleOutput: document.getElementById('toggle-output'), + toggleDiff: document.getElementById('toggle-diff'), + outputContainer: document.getElementById('output-container') + }; + + // Data + const examples = COMPILER_DATA.examples; + const passes = COMPILER_DATA.passes; + + // Get current selections + function getCurrentExample() { + return examples[state.selectedExampleIndex]; + } + + function getCurrentPass() { + return passes[state.selectedPassIndex]; + } + + // Determine pass phase + function getPassPhase(passId) { + const backendPasses = ['lfun', 'tc1', 'sh', 'un', 'rf', 'lf', 'tc1b', 'ea', 'ug', 'rc', 'ec', 'tc2', 'ru']; + return backendPasses.includes(passId) ? 'backend' : 'frontend'; + } + + // Syntax highlighters + function highlightScheme(code) { + let result = escapeHtml(code); + + // Comments (;; ...) + result = result.replace(/(;{2,}[^\n]*)/g, '$1'); + + // Keywords + const keywords = ['define', 'if', 'let', 'set!', 'begin', 'while', 'void', 'and', 'or', 'not']; + keywords.forEach(kw => { + const regex = new RegExp(`\\b(${kw})\\b`, 'g'); + result = result.replace(regex, '$1'); + }); + + // Vector keywords + const vecKeywords = ['vector', 'vector-ref', 'vector-set!', 'vector-length']; + vecKeywords.forEach(kw => { + const regex = new RegExp(`\\b(${kw.replace(/[!-]/g, '\\$&')})\\b`, 'g'); + result = result.replace(regex, '$1'); + }); + + // Types + const types = ['Integer', 'Boolean', 'Void', 'Vector']; + types.forEach(t => { + const regex = new RegExp(`\\b(${t})\\b`, 'g'); + result = result.replace(regex, '$1'); + }); + + // Operators + const operators = ['\\+', '-', '=', '<', '<=', '>', '>=']; + operators.forEach(op => { + result = result.replace(new RegExp(`(\\(${op})`, 'g'), '(' + op + ''); + }); + + // Read/Print + result = result.replace(/\b(read|print)\b/g, '$1'); + + // Numbers + result = result.replace(/\b(\d+)\b/g, '$1'); + + // Booleans + result = result.replace(/#t|#f/g, '$&'); + + // Parentheses + result = result.replace(/([()])/g, '$1'); + + return result; + } + + function highlightSExp(code) { + let result = escapeHtml(code); + + // Keywords (AST constructors) + const keywords = [ + 'Program', 'Def', 'Let', 'If', 'Prim', 'While', 'Begin', 'Var', 'Int', 'Bool', + 'FunRef', 'Apply', 'SetBang', 'Vec', 'VecLen', 'VecRef', 'VecSet', 'Void', + 'Atm', 'Assign', 'Return', 'Seq', 'Goto', 'IfStmt', 'TailCall', 'Call', + 'Collect', 'Allocate', 'GlobalVal', 'Block', 'CProgram', 'X86Program', + 'Finfo', 'Finfo1', 'Finfo2', 'Finfo3', 'Binfo1', 'Binfo2', 'Label' + ]; + keywords.forEach(kw => { + const regex = new RegExp(`\\b(${kw})\\b`, 'g'); + result = result.replace(regex, '$1'); + }); + + // Types + const types = ['Integer', 'Boolean', 'Vector', 'Function', 'Unit']; + types.forEach(t => { + const regex = new RegExp(`\\b(${t})\\b`, 'g'); + result = result.replace(regex, '$1'); + }); + + // Operators + const operators = ['Add', 'Sub', 'Negate', 'Eq', 'Lt', 'Le', 'Gt', 'Ge', 'Not', 'Read', 'Print', 'Sar']; + operators.forEach(op => { + const regex = new RegExp(`\\b(${op})\\b`, 'g'); + result = result.replace(regex, '$1'); + }); + + // Numbers + result = result.replace(/\b(\d+)\b/g, '$1'); + + // Booleans + result = result.replace(/\b(true|false)\b/g, '$1'); + + // Registers + const registers = ['Rax', 'Rbx', 'Rcx', 'Rdx', 'Rsi', 'Rdi', 'Rsp', 'Rbp', 'R8', 'R9', 'R10', 'R11', 'R12', 'R13', 'R14', 'R15']; + registers.forEach(reg => { + const regex = new RegExp(`\\b(${reg})\\b`, 'g'); + result = result.replace(regex, '$1'); + }); + + // Instructions + const instructions = [ + 'Movq', 'Addq', 'Subq', 'Negq', 'Xorq', 'Cmpq', 'Pushq', 'Popq', 'Leaq', + 'Callq', 'Retq', 'Jmp', 'JmpIf', 'TailJmp', 'Set', 'Movzbq', 'Andq', 'Sarq', + 'IndirectCallq' + ]; + instructions.forEach(inst => { + const regex = new RegExp(`\\b(${inst})\\b`, 'g'); + result = result.replace(regex, '$1'); + }); + + // Special forms + result = result.replace(/\b(args|ret|body|locals|nparams|conflicts|initial|afters|num_spilled|num_spilled_root|used_callee)\b/g, + '$1'); + + // VarL, RegL + result = result.replace(/\b(VarL|RegL)\b/g, '$1'); + + // Imm + result = result.replace(/\b(Imm)\b/g, '$1'); + + // Parentheses + result = result.replace(/([()])/g, '$1'); + + return result; + } + + function highlightAsm(code) { + let result = escapeHtml(code); + const lines = result.split('\n'); + + return lines.map(line => { + let highlighted = line; + + // Comments + if (highlighted.trim().startsWith('#')) { + return '' + highlighted + ''; + } + + // Labels (word followed by colon at start or after whitespace) + highlighted = highlighted.replace(/^(\s*)([a-zA-Z_][a-zA-Z0-9_]*:)/, '$1$2'); + + // Directives + highlighted = highlighted.replace(/(\.globl|\.align|\.text|\.data|\.section|\.type|\.size)/g, + '$1'); + + // Instructions + const instructions = [ + 'movq', 'addq', 'subq', 'negq', 'pushq', 'popq', 'leaq', 'callq', 'retq', + 'jmp', 'jne', 'je', 'jl', 'jg', 'jle', 'jge', 'xorq', 'cmpq', 'movzbq', + 'andq', 'sarq', 'sete', 'setl', 'setg', 'setle', 'setge', 'setne', 'imulq', 'cqto' + ]; + instructions.forEach(inst => { + const regex = new RegExp(`\\b(${inst})\\b`, 'g'); + highlighted = highlighted.replace(regex, '$1'); + }); + + // Registers (%rax etc.) + highlighted = highlighted.replace(/%[a-zA-Z0-9]+/g, '$&'); + + // Immediates ($123) + highlighted = highlighted.replace(/\$(-?\d+)/g, '$&'); + + // Numbers + highlighted = highlighted.replace(/(?$1'); + + return highlighted; + }).join('\n'); + } + + function highlightOutput(code, passId) { + if (passId === 'pa') { + return highlightAsm(code); + } + return highlightSExp(code); + } + + function escapeHtml(text) { + const div = document.createElement('div'); + div.textContent = text; + return div.innerHTML; + } + + // Render functions + function renderExamples() { + elements.examplesList.innerHTML = examples.map((example, index) => ` +
+
${escapeHtml(example.title)}
+
${escapeHtml(example.description)}
+
+ `).join(''); + + // Add click handlers + document.querySelectorAll('.example-card').forEach(card => { + card.addEventListener('click', () => { + const index = parseInt(card.dataset.index); + selectExample(index); + }); + }); + } + + function renderPipeline() { + let html = ''; + passes.forEach((pass, index) => { + const phase = getPassPhase(pass.id); + html += ` +
+
+ ${escapeHtml(pass.id)} +
+ ${index < passes.length - 1 ? '' : ''} +
+ `; + }); + elements.pipelineStrip.innerHTML = html; + + // Add click handlers + document.querySelectorAll('.pass-node').forEach(node => { + node.addEventListener('click', () => { + const index = parseInt(node.dataset.index); + selectPass(index); + }); + }); + + // Scroll selected into view + const selectedNode = elements.pipelineStrip.querySelector('.pass-node.selected'); + if (selectedNode) { + selectedNode.scrollIntoView({ behavior: 'smooth', inline: 'center', block: 'nearest' }); + } + } + + function renderSource() { + const example = getCurrentExample(); + const highlighted = highlightScheme(example.source); + elements.sourceCode.innerHTML = addLineNumbers(highlighted); + } + + function renderPassDetails() { + const pass = getCurrentPass(); + const phase = getPassPhase(pass.id); + + elements.passName.textContent = pass.name; + elements.passDescription.textContent = pass.description; + elements.passPhase.textContent = phase === 'backend' ? 'Backend' : 'Frontend'; + elements.passPhase.className = `pass-phase ${phase}`; + } + + function renderOutput() { + const example = getCurrentExample(); + const pass = getCurrentPass(); + const output = example.passOutputs[pass.id]; + + if (state.viewMode === 'output') { + elements.outputView.classList.remove('hidden'); + elements.diffView.classList.add('hidden'); + + const highlighted = highlightOutput(output, pass.id); + elements.outputCode.innerHTML = addLineNumbers(highlighted); + } else { + elements.outputView.classList.add('hidden'); + elements.diffView.classList.remove('hidden'); + + renderDiff(); + } + } + + function addLineNumbers(code) { + const lines = code.split('\n'); + return lines.map(line => `${line}`).join('\n'); + } + + function renderDiff() { + const example = getCurrentExample(); + const pass = getCurrentPass(); + const currentOutput = example.passOutputs[pass.id]; + + let previousOutput; + let leftLabel; + + if (state.selectedPassIndex === 0) { + // First pass - show source vs output + previousOutput = example.source; + leftLabel = 'Source'; + } else { + const previousPass = passes[state.selectedPassIndex - 1]; + previousOutput = example.passOutputs[previousPass.id]; + leftLabel = previousPass.name; + } + + elements.diffLeftLabel.textContent = leftLabel; + elements.diffRightLabel.textContent = pass.name; + + // Simple line-by-line diff + const prevLines = previousOutput.split('\n'); + const currLines = currentOutput.split('\n'); + + const diff = computeDiff(prevLines, currLines); + + const leftHtml = diff.left.map((line, i) => { + const lineClass = line.type === 'removed' ? 'line-removed' : ''; + return `${escapeHtml(line.content)}`; + }).join('\n'); + + const rightHtml = diff.right.map((line, i) => { + const lineClass = line.type === 'added' ? 'line-added' : ''; + return `${escapeHtml(line.content)}`; + }).join('\n'); + + // Apply syntax highlighting + if (state.selectedPassIndex === 0) { + elements.diffLeft.innerHTML = highlightScheme(leftHtml.replace(//g, + (match, cls) => { + const processed = highlightScheme(match); + return processed.replace(/class="code-line/, 'class="code-line ' + cls.trim()); + })); + } else { + const prevPassId = passes[state.selectedPassIndex - 1].id; + elements.diffLeft.innerHTML = highlightOutput(leftHtml, prevPassId); + } + elements.diffRight.innerHTML = highlightOutput(rightHtml, pass.id); + } + + function computeDiff(prevLines, currLines) { + // Simple LCS-based diff + const result = { left: [], right: [] }; + let i = 0, j = 0; + + // Build a simple LCS matrix for small inputs + const lcs = buildLCS(prevLines, currLines); + + // Backtrack through LCS + let li = prevLines.length; + let lj = currLines.length; + const leftResult = []; + const rightResult = []; + + while (li > 0 || lj > 0) { + if (li > 0 && lj > 0 && prevLines[li - 1] === currLines[lj - 1]) { + leftResult.unshift({ content: prevLines[li - 1], type: 'unchanged' }); + rightResult.unshift({ content: currLines[lj - 1], type: 'unchanged' }); + li--; + lj--; + } else if (lj > 0 && (li === 0 || lcs[li][lj - 1] >= lcs[li - 1][lj])) { + rightResult.unshift({ content: currLines[lj - 1], type: 'added' }); + lj--; + } else if (li > 0) { + leftResult.unshift({ content: prevLines[li - 1], type: 'removed' }); + li--; + } + } + + return { left: leftResult, right: rightResult }; + } + + function buildLCS(a, b) { + const m = a.length; + const n = b.length; + const dp = []; + + for (let i = 0; i <= m; i++) { + dp[i] = []; + for (let j = 0; j <= n; j++) { + if (i === 0 || j === 0) { + dp[i][j] = 0; + } else if (a[i - 1] === b[j - 1]) { + dp[i][j] = dp[i - 1][j - 1] + 1; + } else { + dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); + } + } + } + + return dp; + } + + // Selection functions + function selectExample(index) { + if (index >= 0 && index < examples.length) { + state.selectedExampleIndex = index; + renderExamples(); + renderSource(); + renderOutput(); + } + } + + function selectPass(index) { + if (index >= 0 && index < passes.length) { + state.selectedPassIndex = index; + renderPipeline(); + renderPassDetails(); + renderOutput(); + } + } + + function setViewMode(mode) { + state.viewMode = mode; + elements.toggleOutput.classList.toggle('active', mode === 'output'); + elements.toggleDiff.classList.toggle('active', mode === 'diff'); + renderOutput(); + } + + // Keyboard navigation + function handleKeydown(e) { + switch (e.key) { + case 'ArrowLeft': + e.preventDefault(); + selectPass(state.selectedPassIndex - 1); + break; + case 'ArrowRight': + e.preventDefault(); + selectPass(state.selectedPassIndex + 1); + break; + case 'ArrowUp': + e.preventDefault(); + selectExample(state.selectedExampleIndex - 1); + break; + case 'ArrowDown': + e.preventDefault(); + selectExample(state.selectedExampleIndex + 1); + break; + } + } + + // Sync diff scroll + function syncDiffScroll() { + const leftPre = elements.diffLeft.parentElement; + const rightPre = elements.diffRight.parentElement; + + let syncing = false; + + leftPre.addEventListener('scroll', () => { + if (syncing) return; + syncing = true; + rightPre.scrollTop = leftPre.scrollTop; + rightPre.scrollLeft = leftPre.scrollLeft; + setTimeout(() => syncing = false, 10); + }); + + rightPre.addEventListener('scroll', () => { + if (syncing) return; + syncing = true; + leftPre.scrollTop = rightPre.scrollTop; + leftPre.scrollLeft = rightPre.scrollLeft; + setTimeout(() => syncing = false, 10); + }); + } + + // Initialize + function init() { + renderExamples(); + renderPipeline(); + renderSource(); + renderPassDetails(); + renderOutput(); + syncDiffScroll(); + + // View toggle + elements.toggleOutput.addEventListener('click', () => setViewMode('output')); + elements.toggleDiff.addEventListener('click', () => setViewMode('diff')); + + // Keyboard navigation + document.addEventListener('keydown', handleKeydown); + } + + // Start + init(); +})(); diff --git a/web/data.js b/web/data.js new file mode 100644 index 0000000..8cf844c --- /dev/null +++ b/web/data.js @@ -0,0 +1,326 @@ +const COMPILER_DATA = { + "examples": [ + { + "id": "functions_test_1", + "title": "Identity Function", + "description": "Simple function that returns its argument", + "source": ";; OUTPUT: 42\n\n(define (id (x : Integer)) : Integer\n x)\n\n(+ 1 (id 41))\n", + "passOutputs": { + "lfun": "(Program\n ((Def\n id\n ((args ((x Integer)))\n (ret Integer)\n (body (Var x)))))\n (Prim\n Add\n ((Int 1) (Apply (Var id) ((Int 41))))))\n", + "tc1": "(Program\n ((Def\n id\n ((args ((x Integer)))\n (ret Integer)\n (body (Var x)))))\n (Prim\n Add\n ((Int 1) (Apply (Var id) ((Int 41))))))\n", + "sh": "(Program\n ((Def\n main\n ((args ())\n (ret Integer)\n (body\n (Prim\n Add\n ((Int 1) (Apply (Var id) ((Int 41))))))))\n (Def\n id\n ((args ((x Integer)))\n (ret Integer)\n (body (Var x))))))\n", + "un": "(Program\n ((Def\n main\n ((args ())\n (ret Integer)\n (body\n (Prim\n Add\n ((Int 1) (Apply (Var id) ((Int 41))))))))\n (Def\n id\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Var x.1))))))\n", + "rf": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Prim\n Add\n ((Int 1)\n (Apply (FunRef (Label id) 1) ((Int 41))))))))\n (Def\n (Label id)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Var x.1))))))\n", + "lf": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Prim\n Add\n ((Int 1)\n (Apply (FunRef (Label id) 1) ((Int 41))))))))\n (Def\n (Label id)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Var x.1))))))\n", + "tc1b": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Prim\n Add\n ((Int 1)\n (Apply (FunRef (Label id) 1) ((Int 41))))))))\n (Def\n (Label id)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Var x.1))))))\n", + "ea": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Prim\n Add\n ((Int 1)\n (Apply (FunRef (Label id) 1) ((Int 41))))))))\n (Def\n (Label id)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Var x.1))))))\n", + "ug": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Prim\n Add\n ((Int 1)\n (Apply (FunRef (Label id) 1) ((Int 41))))))))\n (Def\n (Label id)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Var x.1))))))\n", + "rc": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Let\n $tmp.1\n (FunRef (Label id) 1)\n (Let\n $tmp.2\n (Apply (Var $tmp.1) ((Int 41)))\n (Prim Add ((Int 1) (Var $tmp.2))))))))\n (Def\n (Label id)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Atm (Var x.1)))))))\n", + "ec": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals ())\n (body\n (((Label start)\n (Seq\n (Assign $tmp.1 (FunRef (Label id) 1))\n (Seq\n (Assign\n $tmp.2\n (Call (Var $tmp.1) ((Int 41))))\n (Return\n (Prim Add ((Int 1) (Var $tmp.2)))))))))))\n (Def\n (Label id)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals ())\n (body\n (((Label start) (Return (Atm (Var x.1))))))))))\n", + "tc2": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (id (Function (Integer) Integer))))\n (body\n (((Label start)\n (Seq\n (Assign $tmp.1 (FunRef (Label id) 1))\n (Seq\n (Assign\n $tmp.2\n (Call (Var $tmp.1) ((Int 41))))\n (Return\n (Prim Add ((Int 1) (Var $tmp.2)))))))))))\n (Def\n (Label id)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals ((x.1 Integer)))\n (body\n (((Label start) (Return (Atm (Var x.1))))))))))\n", + "ru": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (id (Function (Integer) Integer))))\n (body\n (((Label start)\n (Seq\n (Assign $tmp.1 (FunRef (Label id) 1))\n (Seq\n (Assign\n $tmp.2\n (Call (Var $tmp.1) ((Int 41))))\n (Return\n (Prim Add ((Int 1) (Var $tmp.2)))))))))))\n (Def\n (Label id)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals ((x.1 Integer)))\n (body\n (((Label start) (Return (Atm (Var x.1))))))))))\n", + "si": "(X86Program\n ((Def\n (Label main)\n Finfo1\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (id (Function (Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label id))\n (Var $tmp.1))\n (Movq (Imm 41) (Reg Rdi))\n (IndirectCallq (Var $tmp.1) 1)\n (Movq (Reg Rax) (Var $tmp.2))\n (Movq (Imm 1) (Reg Rax))\n (Addq (Var $tmp.2) (Reg Rax))\n (Jmp (Label main_conclusion)))))))))\n (Def\n (Label id)\n Finfo1\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label id_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var x.1))\n (Movq (Var x.1) (Reg Rax))\n (Jmp (Label id_conclusion)))))))))))\n", + "ul": "(X86Program\n ((Def\n (Label main)\n Finfo1\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (id (Function (Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n (Binfo2\n ((initial ((RegL Rsp)))\n (afters\n (((VarL $tmp.1) (RegL Rsp))\n ((VarL $tmp.1) (RegL Rsp) (RegL Rdi))\n ((RegL Rsp) (RegL Rax))\n ((VarL $tmp.2) (RegL Rsp))\n ((VarL $tmp.2) (RegL Rsp) (RegL Rax))\n ((RegL Rsp) (RegL Rax))\n ()))))\n ((Leaq\n (GlobalArg (Label id))\n (Var $tmp.1))\n (Movq (Imm 41) (Reg Rdi))\n (IndirectCallq (Var $tmp.1) 1)\n (Movq (Reg Rax) (Var $tmp.2))\n (Movq (Imm 1) (Reg Rax))\n (Addq (Var $tmp.2) (Reg Rax))\n (Jmp (Label main_conclusion)))))))))\n (Def\n (Label id)\n Finfo1\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label id_start)\n (Block\n (Binfo2\n ((initial ((RegL Rsp) (RegL Rdi)))\n (afters\n (((VarL x.1) (RegL Rsp))\n ((RegL Rsp) (RegL Rax))\n ()))))\n ((Movq (Reg Rdi) (Var x.1))\n (Movq (Var x.1) (Reg Rax))\n (Jmp (Label id_conclusion)))))))))))\n", + "bi": "(X86Program\n ((Def\n (Label main)\n (Finfo2\n (conflicts\n (((VarL $tmp.1) ((RegL Rsp) (RegL Rdi)))\n ((VarL $tmp.2) ((RegL Rsp) (RegL Rax)))\n ((VarL id) ((RegL Rsp)))\n ((RegL Rsp)\n ((VarL $tmp.1)\n (VarL $tmp.2)\n (VarL id)\n (RegL Rax)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)))\n ((RegL Rax)\n ((VarL $tmp.2)\n (RegL Rsp)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)))\n ((RegL Rcx) ((RegL Rsp) (RegL Rax)))\n ((RegL Rdx) ((RegL Rsp) (RegL Rax)))\n ((RegL Rsi) ((RegL Rsp) (RegL Rax)))\n ((RegL Rdi)\n ((VarL $tmp.1) (RegL Rsp) (RegL Rax)))\n ((RegL R8) ((RegL Rsp) (RegL Rax)))\n ((RegL R9) ((RegL Rsp) (RegL Rax)))\n ((RegL R10) ((RegL Rsp) (RegL Rax)))\n ((RegL R11) ((RegL Rsp) (RegL Rax))))))\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (id (Function (Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label id))\n (Var $tmp.1))\n (Movq (Imm 41) (Reg Rdi))\n (IndirectCallq (Var $tmp.1) 1)\n (Movq (Reg Rax) (Var $tmp.2))\n (Movq (Imm 1) (Reg Rax))\n (Addq (Var $tmp.2) (Reg Rax))\n (Jmp (Label main_conclusion)))))))))\n (Def\n (Label id)\n (Finfo2\n (conflicts\n (((VarL x.1) ((RegL Rsp)))\n ((RegL Rsp) ((VarL x.1) (RegL Rax)))\n ((RegL Rax) ((RegL Rsp))))))\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label id_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var x.1))\n (Movq (Var x.1) (Reg Rax))\n (Jmp (Label id_conclusion)))))))))))\n", + "ar": "(X86Program\n ((Def\n (Label main)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (id (Function (Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n Binfo1\n ((Leaq (GlobalArg (Label id)) (Reg Rcx))\n (Movq (Imm 41) (Reg Rdi))\n (IndirectCallq (Reg Rcx) 1)\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 1) (Reg Rax))\n (Addq (Reg Rcx) (Reg Rax))\n (Jmp (Label main_conclusion)))))))))\n (Def\n (Label id)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label id_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Jmp (Label id_conclusion)))))))))))\n", + "rj": "(X86Program\n ((Def\n (Label main)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (id (Function (Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n Binfo1\n ((Leaq (GlobalArg (Label id)) (Reg Rcx))\n (Movq (Imm 41) (Reg Rdi))\n (IndirectCallq (Reg Rcx) 1)\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 1) (Reg Rax))\n (Addq (Reg Rcx) (Reg Rax))\n (Jmp (Label main_conclusion)))))))))\n (Def\n (Label id)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label id_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Jmp (Label id_conclusion)))))))))))\n", + "pi": "(X86Program\n ((Def\n (Label main)\n (Finfo\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (id (Function (Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n ((Leaq (GlobalArg (Label id)) (Reg Rcx))\n (Movq (Imm 41) (Reg Rdi))\n (IndirectCallq (Reg Rcx) 1)\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 1) (Reg Rax))\n (Addq (Reg Rcx) (Reg Rax))\n (Jmp (Label main_conclusion)))))))))\n (Def\n (Label id)\n (Finfo\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label id_start)\n (Block\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Jmp (Label id_conclusion)))))))))))\n", + "pc": "(X86Program\n ((Label main_start)\n (Leaq\n (GlobalArg Rip (Label id))\n (Reg Rcx))\n (Movq (Imm 41) (Reg Rdi))\n (IndirectCallq (Reg Rcx))\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 1) (Reg Rax))\n (Addq (Reg Rcx) (Reg Rax))\n (Jmp (Label main_conclusion))\n (Global (Label main))\n (Align 8)\n (Label main)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Subq (Imm 0) (Reg Rsp))\n (Movq (Imm 65536) (Reg Rdi))\n (Movq (Imm 65536) (Reg Rsi))\n (Callq (Label initialize))\n (Movq\n (GlobalArg Rip (Label rootstack_begin))\n (Reg R15))\n (Addq (Imm 0) (Reg R15))\n (Jmp (Label main_start))\n (Label main_conclusion)\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n Retq\n (Label id_start)\n (Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Jmp (Label id_conclusion))\n (Global (Label id))\n (Align 8)\n (Label id)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Subq (Imm 0) (Reg Rsp))\n (Addq (Imm 0) (Reg R15))\n (Jmp (Label id_start))\n (Label id_conclusion)\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n Retq))\n", + "opt": "(X86Program\n ((Label main_start)\n (Leaq\n (GlobalArg Rip (Label id))\n (Reg Rcx))\n (Movq (Imm 41) (Reg Rdi))\n (IndirectCallq (Reg Rcx))\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 1) (Reg Rax))\n (Addq (Reg Rcx) (Reg Rax))\n (Jmp (Label main_conclusion))\n (Global (Label main))\n (Align 8)\n (Label main)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Movq (Imm 65536) (Reg Rdi))\n (Movq (Imm 65536) (Reg Rsi))\n (Callq (Label initialize))\n (Movq\n (GlobalArg Rip (Label rootstack_begin))\n (Reg R15))\n (Jmp (Label main_start))\n (Label main_conclusion)\n (Popq (Reg Rbp))\n Retq\n (Label id_start)\n (Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Jmp (Label id_conclusion))\n (Global (Label id))\n (Align 8)\n (Label id)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Jmp (Label id_start))\n (Label id_conclusion)\n (Popq (Reg Rbp))\n Retq))\n", + "pa": "main_start:\n leaq id(%rip), %rcx\n movq $41, %rdi\n callq *%rcx\n movq %rax, %rcx\n movq $1, %rax\n addq %rcx, %rax\n jmp main_conclusion\n\n .globl main\n .align 8\n\nmain:\n pushq %rbp\n movq %rsp, %rbp\n movq $65536, %rdi\n movq $65536, %rsi\n callq initialize\n movq rootstack_begin(%rip), %r15\n jmp main_start\n\nmain_conclusion:\n popq %rbp\n retq\n\nid_start:\n movq %rdi, %rcx\n movq %rcx, %rax\n jmp id_conclusion\n\n .globl id\n .align 8\n\nid:\n pushq %rbp\n movq %rsp, %rbp\n jmp id_start\n\nid_conclusion:\n popq %rbp\n retq\n" + } + }, + { + "id": "functions_test_2", + "title": "Addition", + "description": "Two-argument addition function", + "source": ";; OUTPUT: 42\n\n(define (add (x : Integer) (y : Integer)) : Integer\n (+ x y))\n\n(add 40 2)\n", + "passOutputs": { + "lfun": "(Program\n ((Def\n add\n ((args ((x Integer) (y Integer)))\n (ret Integer)\n (body (Prim Add ((Var x) (Var y)))))))\n (Apply (Var add) ((Int 40) (Int 2))))\n", + "tc1": "(Program\n ((Def\n add\n ((args ((x Integer) (y Integer)))\n (ret Integer)\n (body (Prim Add ((Var x) (Var y)))))))\n (Apply (Var add) ((Int 40) (Int 2))))\n", + "sh": "(Program\n ((Def\n main\n ((args ())\n (ret Integer)\n (body\n (Apply (Var add) ((Int 40) (Int 2))))))\n (Def\n add\n ((args ((x Integer) (y Integer)))\n (ret Integer)\n (body (Prim Add ((Var x) (Var y))))))))\n", + "un": "(Program\n ((Def\n main\n ((args ())\n (ret Integer)\n (body\n (Apply (Var add) ((Int 40) (Int 2))))))\n (Def\n add\n ((args ((x.1 Integer) (y.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Var y.1))))))))\n", + "rf": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Apply\n (FunRef (Label add) 2)\n ((Int 40) (Int 2))))))\n (Def\n (Label add)\n ((args ((x.1 Integer) (y.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Var y.1))))))))\n", + "lf": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Apply\n (FunRef (Label add) 2)\n ((Int 40) (Int 2))))))\n (Def\n (Label add)\n ((args ((x.1 Integer) (y.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Var y.1))))))))\n", + "tc1b": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Apply\n (FunRef (Label add) 2)\n ((Int 40) (Int 2))))))\n (Def\n (Label add)\n ((args ((x.1 Integer) (y.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Var y.1))))))))\n", + "ea": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Apply\n (FunRef (Label add) 2)\n ((Int 40) (Int 2))))))\n (Def\n (Label add)\n ((args ((x.1 Integer) (y.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Var y.1))))))))\n", + "ug": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Apply\n (FunRef (Label add) 2)\n ((Int 40) (Int 2))))))\n (Def\n (Label add)\n ((args ((x.1 Integer) (y.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Var y.1))))))))\n", + "rc": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Let\n $tmp.1\n (FunRef (Label add) 2)\n (Apply (Var $tmp.1) ((Int 40) (Int 2)))))))\n (Def\n (Label add)\n ((args ((x.1 Integer) (y.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Var y.1))))))))\n", + "ec": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals ())\n (body\n (((Label start)\n (Seq\n (Assign $tmp.1 (FunRef (Label add) 2))\n (TailCall\n (Var $tmp.1)\n ((Int 40) (Int 2)))))))))\n (Def\n (Label add)\n ((args ((x.1 Integer) (y.1 Integer)))\n (ret Integer)\n (locals ())\n (body\n (((Label start)\n (Return\n (Prim Add ((Var x.1) (Var y.1)))))))))))\n", + "tc2": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals\n (($tmp.1\n (Function (Integer Integer) Integer))\n (add\n (Function (Integer Integer) Integer))))\n (body\n (((Label start)\n (Seq\n (Assign $tmp.1 (FunRef (Label add) 2))\n (TailCall\n (Var $tmp.1)\n ((Int 40) (Int 2)))))))))\n (Def\n (Label add)\n ((args ((x.1 Integer) (y.1 Integer)))\n (ret Integer)\n (locals ((x.1 Integer) (y.1 Integer)))\n (body\n (((Label start)\n (Return\n (Prim Add ((Var x.1) (Var y.1)))))))))))\n", + "ru": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals\n (($tmp.1\n (Function (Integer Integer) Integer))\n (add\n (Function (Integer Integer) Integer))))\n (body\n (((Label start)\n (Seq\n (Assign $tmp.1 (FunRef (Label add) 2))\n (TailCall\n (Var $tmp.1)\n ((Int 40) (Int 2)))))))))\n (Def\n (Label add)\n ((args ((x.1 Integer) (y.1 Integer)))\n (ret Integer)\n (locals ((x.1 Integer) (y.1 Integer)))\n (body\n (((Label start)\n (Return\n (Prim Add ((Var x.1) (Var y.1)))))))))))\n", + "si": "(X86Program\n ((Def\n (Label main)\n Finfo1\n ((nparams 0)\n (locals\n (($tmp.1\n (Function (Integer Integer) Integer))\n (add\n (Function (Integer Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label add))\n (Var $tmp.1))\n (Movq (Imm 40) (Reg Rdi))\n (Movq (Imm 2) (Reg Rsi))\n (TailJmp (Var $tmp.1) 2))))))))\n (Def\n (Label add)\n Finfo1\n ((nparams 2)\n (locals\n ((x.1 Integer)\n (y.1 Integer)\n (x.1 Integer)\n (y.1 Integer)))\n (body\n (((Label add_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var x.1))\n (Movq (Reg Rsi) (Var y.1))\n (Movq (Var x.1) (Reg Rax))\n (Addq (Var y.1) (Reg Rax))\n (Jmp (Label add_conclusion)))))))))))\n", + "ul": "(X86Program\n ((Def\n (Label main)\n Finfo1\n ((nparams 0)\n (locals\n (($tmp.1\n (Function (Integer Integer) Integer))\n (add\n (Function (Integer Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n (Binfo2\n ((initial ())\n (afters\n (((VarL $tmp.1))\n ((VarL $tmp.1) (RegL Rdi))\n ((VarL $tmp.1) (RegL Rsi) (RegL Rdi))\n ()))))\n ((Leaq\n (GlobalArg (Label add))\n (Var $tmp.1))\n (Movq (Imm 40) (Reg Rdi))\n (Movq (Imm 2) (Reg Rsi))\n (TailJmp (Var $tmp.1) 2))))))))\n (Def\n (Label add)\n Finfo1\n ((nparams 2)\n (locals\n ((x.1 Integer)\n (y.1 Integer)\n (x.1 Integer)\n (y.1 Integer)))\n (body\n (((Label add_start)\n (Block\n (Binfo2\n ((initial\n ((RegL Rsp) (RegL Rsi) (RegL Rdi)))\n (afters\n (((VarL x.1) (RegL Rsp) (RegL Rsi))\n ((VarL x.1) (VarL y.1) (RegL Rsp))\n ((VarL y.1) (RegL Rsp) (RegL Rax))\n ((RegL Rsp) (RegL Rax))\n ()))))\n ((Movq (Reg Rdi) (Var x.1))\n (Movq (Reg Rsi) (Var y.1))\n (Movq (Var x.1) (Reg Rax))\n (Addq (Var y.1) (Reg Rax))\n (Jmp (Label add_conclusion)))))))))))\n", + "bi": "(X86Program\n ((Def\n (Label main)\n (Finfo2\n (conflicts\n (((VarL $tmp.1) ((RegL Rsi) (RegL Rdi)))\n ((VarL add) ((RegL Rsp)))\n ((RegL Rsp) ((VarL add)))\n ((RegL Rsi) ((VarL $tmp.1) (RegL Rdi)))\n ((RegL Rdi) ((VarL $tmp.1) (RegL Rsi))))))\n ((nparams 0)\n (locals\n (($tmp.1\n (Function (Integer Integer) Integer))\n (add\n (Function (Integer Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label add))\n (Var $tmp.1))\n (Movq (Imm 40) (Reg Rdi))\n (Movq (Imm 2) (Reg Rsi))\n (TailJmp (Var $tmp.1) 2))))))))\n (Def\n (Label add)\n (Finfo2\n (conflicts\n (((VarL x.1)\n ((VarL y.1) (RegL Rsp) (RegL Rsi)))\n ((VarL y.1)\n ((VarL x.1) (RegL Rsp) (RegL Rax)))\n ((RegL Rsp)\n ((VarL x.1) (VarL y.1) (RegL Rax)))\n ((RegL Rax) ((VarL y.1) (RegL Rsp)))\n ((RegL Rsi) ((VarL x.1))))))\n ((nparams 2)\n (locals\n ((x.1 Integer)\n (y.1 Integer)\n (x.1 Integer)\n (y.1 Integer)))\n (body\n (((Label add_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var x.1))\n (Movq (Reg Rsi) (Var y.1))\n (Movq (Var x.1) (Reg Rax))\n (Addq (Var y.1) (Reg Rax))\n (Jmp (Label add_conclusion)))))))))))\n", + "ar": "(X86Program\n ((Def\n (Label main)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1\n (Function (Integer Integer) Integer))\n (add\n (Function (Integer Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n Binfo1\n ((Leaq (GlobalArg (Label add)) (Reg Rcx))\n (Movq (Imm 40) (Reg Rdi))\n (Movq (Imm 2) (Reg Rsi))\n (TailJmp (Reg Rcx) 2))))))))\n (Def\n (Label add)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 2)\n (locals\n ((x.1 Integer)\n (y.1 Integer)\n (x.1 Integer)\n (y.1 Integer)))\n (body\n (((Label add_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rsi) (Reg Rdx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Reg Rdx) (Reg Rax))\n (Jmp (Label add_conclusion)))))))))))\n", + "rj": "(X86Program\n ((Def\n (Label main)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1\n (Function (Integer Integer) Integer))\n (add\n (Function (Integer Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n Binfo1\n ((Leaq (GlobalArg (Label add)) (Reg Rcx))\n (Movq (Imm 40) (Reg Rdi))\n (Movq (Imm 2) (Reg Rsi))\n (TailJmp (Reg Rcx) 2))))))))\n (Def\n (Label add)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 2)\n (locals\n ((x.1 Integer)\n (y.1 Integer)\n (x.1 Integer)\n (y.1 Integer)))\n (body\n (((Label add_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rsi) (Reg Rdx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Reg Rdx) (Reg Rax))\n (Jmp (Label add_conclusion)))))))))))\n", + "pi": "(X86Program\n ((Def\n (Label main)\n (Finfo\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1\n (Function (Integer Integer) Integer))\n (add\n (Function (Integer Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n ((Leaq (GlobalArg (Label add)) (Reg Rcx))\n (Movq (Imm 40) (Reg Rdi))\n (Movq (Imm 2) (Reg Rsi))\n (Movq (Reg Rcx) (Reg Rax))\n (TailJmp (Reg Rax) 2))))))))\n (Def\n (Label add)\n (Finfo\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 2)\n (locals\n ((x.1 Integer)\n (y.1 Integer)\n (x.1 Integer)\n (y.1 Integer)))\n (body\n (((Label add_start)\n (Block\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rsi) (Reg Rdx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Reg Rdx) (Reg Rax))\n (Jmp (Label add_conclusion)))))))))))\n", + "pc": "(X86Program\n ((Label main_start)\n (Leaq\n (GlobalArg Rip (Label add))\n (Reg Rcx))\n (Movq (Imm 40) (Reg Rdi))\n (Movq (Imm 2) (Reg Rsi))\n (Movq (Reg Rcx) (Reg Rax))\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n (TailJmp (Reg Rax))\n (Global (Label main))\n (Align 8)\n (Label main)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Subq (Imm 0) (Reg Rsp))\n (Movq (Imm 65536) (Reg Rdi))\n (Movq (Imm 65536) (Reg Rsi))\n (Callq (Label initialize))\n (Movq\n (GlobalArg Rip (Label rootstack_begin))\n (Reg R15))\n (Addq (Imm 0) (Reg R15))\n (Jmp (Label main_start))\n (Label main_conclusion)\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n Retq\n (Label add_start)\n (Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rsi) (Reg Rdx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Reg Rdx) (Reg Rax))\n (Jmp (Label add_conclusion))\n (Global (Label add))\n (Align 8)\n (Label add)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Subq (Imm 0) (Reg Rsp))\n (Addq (Imm 0) (Reg R15))\n (Jmp (Label add_start))\n (Label add_conclusion)\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n Retq))\n", + "opt": "(X86Program\n ((Label main_start)\n (Leaq\n (GlobalArg Rip (Label add))\n (Reg Rcx))\n (Movq (Imm 40) (Reg Rdi))\n (Movq (Imm 2) (Reg Rsi))\n (Movq (Reg Rcx) (Reg Rax))\n (Popq (Reg Rbp))\n (TailJmp (Reg Rax))\n (Global (Label main))\n (Align 8)\n (Label main)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Movq (Imm 65536) (Reg Rdi))\n (Movq (Imm 65536) (Reg Rsi))\n (Callq (Label initialize))\n (Movq\n (GlobalArg Rip (Label rootstack_begin))\n (Reg R15))\n (Jmp (Label main_start))\n (Label main_conclusion)\n (Popq (Reg Rbp))\n Retq\n (Label add_start)\n (Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rsi) (Reg Rdx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Reg Rdx) (Reg Rax))\n (Jmp (Label add_conclusion))\n (Global (Label add))\n (Align 8)\n (Label add)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Jmp (Label add_start))\n (Label add_conclusion)\n (Popq (Reg Rbp))\n Retq))\n", + "pa": "main_start:\n leaq add(%rip), %rcx\n movq $40, %rdi\n movq $2, %rsi\n movq %rcx, %rax\n popq %rbp\n jmp *%rax\n\n .globl main\n .align 8\n\nmain:\n pushq %rbp\n movq %rsp, %rbp\n movq $65536, %rdi\n movq $65536, %rsi\n callq initialize\n movq rootstack_begin(%rip), %r15\n jmp main_start\n\nmain_conclusion:\n popq %rbp\n retq\n\nadd_start:\n movq %rdi, %rcx\n movq %rsi, %rdx\n movq %rcx, %rax\n addq %rdx, %rax\n jmp add_conclusion\n\n .globl add\n .align 8\n\nadd:\n pushq %rbp\n movq %rsp, %rbp\n jmp add_start\n\nadd_conclusion:\n popq %rbp\n retq\n" + } + }, + { + "id": "functions_test_4", + "title": "Recursion", + "description": "Recursive sum with conditionals", + "source": ";; OUTPUT: 42\n\n(define (sum (x : Integer)) : Integer\n (if (= x 1) 1 (+ x (sum (+ x (- 1))))))\n\n(if (= (sum 3) 6)\n 42\n 777)\n", + "passOutputs": { + "lfun": "(Program\n ((Def\n sum\n ((args ((x Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x) (Int 1)))\n (Int 1)\n (Prim\n Add\n ((Var x)\n (Apply\n (Var sum)\n ((Prim\n Add\n ((Var x) (Prim Negate ((Int 1))))))))))))))\n (If\n (Prim\n Eq\n ((Apply (Var sum) ((Int 3))) (Int 6)))\n (Int 42)\n (Int 777)))\n", + "tc1": "(Program\n ((Def\n sum\n ((args ((x Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x) (Int 1)))\n (Int 1)\n (Prim\n Add\n ((Var x)\n (Apply\n (Var sum)\n ((Prim\n Add\n ((Var x) (Prim Negate ((Int 1))))))))))))))\n (If\n (Prim\n Eq\n ((Apply (Var sum) ((Int 3))) (Int 6)))\n (Int 42)\n (Int 777)))\n", + "sh": "(Program\n ((Def\n main\n ((args ())\n (ret Integer)\n (body\n (If\n (Prim\n Eq\n ((Apply (Var sum) ((Int 3))) (Int 6)))\n (Int 42)\n (Int 777)))))\n (Def\n sum\n ((args ((x Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x) (Int 1)))\n (Int 1)\n (Prim\n Add\n ((Var x)\n (Apply\n (Var sum)\n ((Prim\n Add\n ((Var x) (Prim Negate ((Int 1)))))))))))))))\n", + "un": "(Program\n ((Def\n main\n ((args ())\n (ret Integer)\n (body\n (If\n (Prim\n Eq\n ((Apply (Var sum) ((Int 3))) (Int 6)))\n (Int 42)\n (Int 777)))))\n (Def\n sum\n ((args ((x.1 Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x.1) (Int 1)))\n (Int 1)\n (Prim\n Add\n ((Var x.1)\n (Apply\n (Var sum)\n ((Prim\n Add\n ((Var x.1) (Prim Negate ((Int 1)))))))))))))))\n", + "rf": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (If\n (Prim\n Eq\n ((Apply (FunRef (Label sum) 1) ((Int 3)))\n (Int 6)))\n (Int 42)\n (Int 777)))))\n (Def\n (Label sum)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x.1) (Int 1)))\n (Int 1)\n (Prim\n Add\n ((Var x.1)\n (Apply\n (FunRef (Label sum) 1)\n ((Prim\n Add\n ((Var x.1) (Prim Negate ((Int 1)))))))))))))))\n", + "lf": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (If\n (Prim\n Eq\n ((Apply (FunRef (Label sum) 1) ((Int 3)))\n (Int 6)))\n (Int 42)\n (Int 777)))))\n (Def\n (Label sum)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x.1) (Int 1)))\n (Int 1)\n (Prim\n Add\n ((Var x.1)\n (Apply\n (FunRef (Label sum) 1)\n ((Prim\n Add\n ((Var x.1) (Prim Negate ((Int 1)))))))))))))))\n", + "tc1b": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (If\n (Prim\n Eq\n ((Apply (FunRef (Label sum) 1) ((Int 3)))\n (Int 6)))\n (Int 42)\n (Int 777)))))\n (Def\n (Label sum)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x.1) (Int 1)))\n (Int 1)\n (Prim\n Add\n ((Var x.1)\n (Apply\n (FunRef (Label sum) 1)\n ((Prim\n Add\n ((Var x.1) (Prim Negate ((Int 1)))))))))))))))\n", + "ea": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (If\n (Prim\n Eq\n ((Apply (FunRef (Label sum) 1) ((Int 3)))\n (Int 6)))\n (Int 42)\n (Int 777)))))\n (Def\n (Label sum)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x.1) (Int 1)))\n (Int 1)\n (Prim\n Add\n ((Var x.1)\n (Apply\n (FunRef (Label sum) 1)\n ((Prim\n Add\n ((Var x.1) (Prim Negate ((Int 1)))))))))))))))\n", + "ug": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (If\n (Prim\n Eq\n ((Apply (FunRef (Label sum) 1) ((Int 3)))\n (Int 6)))\n (Int 42)\n (Int 777)))))\n (Def\n (Label sum)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x.1) (Int 1)))\n (Int 1)\n (Prim\n Add\n ((Var x.1)\n (Apply\n (FunRef (Label sum) 1)\n ((Prim\n Add\n ((Var x.1) (Prim Negate ((Int 1)))))))))))))))\n", + "rc": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (If\n (Let\n $tmp.1\n (FunRef (Label sum) 1)\n (Let\n $tmp.2\n (Apply (Var $tmp.1) ((Int 3)))\n (Prim Eq ((Var $tmp.2) (Int 6)))))\n (Atm (Int 42))\n (Atm (Int 777))))))\n (Def\n (Label sum)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x.1) (Int 1)))\n (Atm (Int 1))\n (Let\n $tmp.5\n (FunRef (Label sum) 1)\n (Let\n $tmp.3\n (Prim Negate ((Int 1)))\n (Let\n $tmp.4\n (Prim Add ((Var x.1) (Var $tmp.3)))\n (Let\n $tmp.6\n (Apply (Var $tmp.5) ((Var $tmp.4)))\n (Prim Add ((Var x.1) (Var $tmp.6)))))))))))))\n", + "ec": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals ())\n (body\n (((Label start)\n (Seq\n (Assign $tmp.1 (FunRef (Label sum) 1))\n (Seq\n (Assign\n $tmp.2\n (Call (Var $tmp.1) ((Int 3))))\n (IfStmt\n (op Eq)\n (arg1 (Var $tmp.2))\n (arg2 (Int 6))\n (jump_then (Label block_1))\n (jump_else (Label block_2))))))\n ((Label block_1)\n (Return (Atm (Int 42))))\n ((Label block_2)\n (Return (Atm (Int 777))))))))\n (Def\n (Label sum)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals ())\n (body\n (((Label start)\n (IfStmt\n (op Eq)\n (arg1 (Var x.1))\n (arg2 (Int 1))\n (jump_then (Label block_3))\n (jump_else (Label block_4))))\n ((Label block_3) (Return (Atm (Int 1))))\n ((Label block_4)\n (Seq\n (Assign $tmp.5 (FunRef (Label sum) 1))\n (Seq\n (Assign $tmp.3 (Prim Negate ((Int 1))))\n (Seq\n (Assign\n $tmp.4\n (Prim Add ((Var x.1) (Var $tmp.3))))\n (Seq\n (Assign\n $tmp.6\n (Call (Var $tmp.5) ((Var $tmp.4))))\n (Return\n (Prim Add ((Var x.1) (Var $tmp.6)))))))))))))))\n", + "tc2": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (sum (Function (Integer) Integer))))\n (body\n (((Label start)\n (Seq\n (Assign $tmp.1 (FunRef (Label sum) 1))\n (Seq\n (Assign\n $tmp.2\n (Call (Var $tmp.1) ((Int 3))))\n (IfStmt\n (op Eq)\n (arg1 (Var $tmp.2))\n (arg2 (Int 6))\n (jump_then (Label block_1))\n (jump_else (Label block_2))))))\n ((Label block_1)\n (Return (Atm (Int 42))))\n ((Label block_2)\n (Return (Atm (Int 777))))))))\n (Def\n (Label sum)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals\n (($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5 (Function (Integer) Integer))\n ($tmp.6 Integer)\n (sum (Function (Integer) Integer))\n (x.1 Integer)))\n (body\n (((Label start)\n (IfStmt\n (op Eq)\n (arg1 (Var x.1))\n (arg2 (Int 1))\n (jump_then (Label block_3))\n (jump_else (Label block_4))))\n ((Label block_3) (Return (Atm (Int 1))))\n ((Label block_4)\n (Seq\n (Assign $tmp.5 (FunRef (Label sum) 1))\n (Seq\n (Assign $tmp.3 (Prim Negate ((Int 1))))\n (Seq\n (Assign\n $tmp.4\n (Prim Add ((Var x.1) (Var $tmp.3))))\n (Seq\n (Assign\n $tmp.6\n (Call (Var $tmp.5) ((Var $tmp.4))))\n (Return\n (Prim Add ((Var x.1) (Var $tmp.6)))))))))))))))\n", + "ru": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (sum (Function (Integer) Integer))))\n (body\n (((Label block_1)\n (Return (Atm (Int 42))))\n ((Label block_2)\n (Return (Atm (Int 777))))\n ((Label start)\n (Seq\n (Assign $tmp.1 (FunRef (Label sum) 1))\n (Seq\n (Assign\n $tmp.2\n (Call (Var $tmp.1) ((Int 3))))\n (IfStmt\n (op Eq)\n (arg1 (Var $tmp.2))\n (arg2 (Int 6))\n (jump_then (Label block_1))\n (jump_else (Label block_2))))))))))\n (Def\n (Label sum)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals\n (($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5 (Function (Integer) Integer))\n ($tmp.6 Integer)\n (sum (Function (Integer) Integer))\n (x.1 Integer)))\n (body\n (((Label block_3) (Return (Atm (Int 1))))\n ((Label block_4)\n (Seq\n (Assign $tmp.5 (FunRef (Label sum) 1))\n (Seq\n (Assign $tmp.3 (Prim Negate ((Int 1))))\n (Seq\n (Assign\n $tmp.4\n (Prim Add ((Var x.1) (Var $tmp.3))))\n (Seq\n (Assign\n $tmp.6\n (Call (Var $tmp.5) ((Var $tmp.4))))\n (Return\n (Prim Add ((Var x.1) (Var $tmp.6)))))))))\n ((Label start)\n (IfStmt\n (op Eq)\n (arg1 (Var x.1))\n (arg2 (Int 1))\n (jump_then (Label block_3))\n (jump_else (Label block_4))))))))))\n", + "si": "(X86Program\n ((Def\n (Label main)\n Finfo1\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (sum (Function (Integer) Integer))))\n (body\n (((Label block_1)\n (Block\n Binfo1\n ((Movq (Imm 42) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n Binfo1\n ((Movq (Imm 777) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label sum))\n (Var $tmp.1))\n (Movq (Imm 3) (Reg Rdi))\n (IndirectCallq (Var $tmp.1) 1)\n (Movq (Reg Rax) (Var $tmp.2))\n (Cmpq (Imm 6) (Var $tmp.2))\n (JmpIf CC_e (Label block_1))\n (Jmp (Label block_2)))))))))\n (Def\n (Label sum)\n Finfo1\n ((nparams 1)\n (locals\n ((x.1 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5 (Function (Integer) Integer))\n ($tmp.6 Integer)\n (sum (Function (Integer) Integer))\n (x.1 Integer)))\n (body\n (((Label block_3)\n (Block\n Binfo1\n ((Movq (Imm 1) (Reg Rax))\n (Jmp (Label sum_conclusion)))))\n ((Label block_4)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label sum))\n (Var $tmp.5))\n (Movq (Imm 1) (Var $tmp.3))\n (Negq (Var $tmp.3))\n (Movq (Var x.1) (Var $tmp.4))\n (Addq (Var $tmp.3) (Var $tmp.4))\n (Movq (Var $tmp.4) (Reg Rdi))\n (IndirectCallq (Var $tmp.5) 1)\n (Movq (Reg Rax) (Var $tmp.6))\n (Movq (Var x.1) (Reg Rax))\n (Addq (Var $tmp.6) (Reg Rax))\n (Jmp (Label sum_conclusion)))))\n ((Label sum_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var x.1))\n (Cmpq (Imm 1) (Var x.1))\n (JmpIf CC_e (Label block_3))\n (Jmp (Label block_4)))))))))))\n", + "ul": "(X86Program\n ((Def\n (Label main)\n Finfo1\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (sum (Function (Integer) Integer))))\n (body\n (((Label block_1)\n (Block\n (Binfo2\n ((initial ((RegL Rsp)))\n (afters (((RegL Rsp) (RegL Rax)) ()))))\n ((Movq (Imm 42) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n (Binfo2\n ((initial ((RegL Rsp)))\n (afters (((RegL Rsp) (RegL Rax)) ()))))\n ((Movq (Imm 777) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label main_start)\n (Block\n (Binfo2\n ((initial ((RegL Rsp)))\n (afters\n (((VarL $tmp.1) (RegL Rsp))\n ((VarL $tmp.1) (RegL Rsp) (RegL Rdi))\n ((RegL Rsp) (RegL Rax))\n ((VarL $tmp.2) (RegL Rsp))\n ((RegL Rsp) (RegL Rflags))\n ((RegL Rsp))\n ()))))\n ((Leaq\n (GlobalArg (Label sum))\n (Var $tmp.1))\n (Movq (Imm 3) (Reg Rdi))\n (IndirectCallq (Var $tmp.1) 1)\n (Movq (Reg Rax) (Var $tmp.2))\n (Cmpq (Imm 6) (Var $tmp.2))\n (JmpIf CC_e (Label block_1))\n (Jmp (Label block_2)))))))))\n (Def\n (Label sum)\n Finfo1\n ((nparams 1)\n (locals\n ((x.1 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5 (Function (Integer) Integer))\n ($tmp.6 Integer)\n (sum (Function (Integer) Integer))\n (x.1 Integer)))\n (body\n (((Label block_3)\n (Block\n (Binfo2\n ((initial ((RegL Rsp)))\n (afters (((RegL Rsp) (RegL Rax)) ()))))\n ((Movq (Imm 1) (Reg Rax))\n (Jmp (Label sum_conclusion)))))\n ((Label block_4)\n (Block\n (Binfo2\n ((initial ((VarL x.1) (RegL Rsp)))\n (afters\n (((VarL $tmp.5) (VarL x.1) (RegL Rsp))\n ((VarL $tmp.3)\n (VarL $tmp.5)\n (VarL x.1)\n (RegL Rsp))\n ((VarL $tmp.3)\n (VarL $tmp.5)\n (VarL x.1)\n (RegL Rsp))\n ((VarL $tmp.3)\n (VarL $tmp.4)\n (VarL $tmp.5)\n (VarL x.1)\n (RegL Rsp))\n ((VarL $tmp.4)\n (VarL $tmp.5)\n (VarL x.1)\n (RegL Rsp))\n ((VarL $tmp.5)\n (VarL x.1)\n (RegL Rsp)\n (RegL Rdi))\n ((VarL x.1) (RegL Rsp) (RegL Rax))\n ((VarL $tmp.6) (VarL x.1) (RegL Rsp))\n ((VarL $tmp.6) (RegL Rsp) (RegL Rax))\n ((RegL Rsp) (RegL Rax))\n ()))))\n ((Leaq\n (GlobalArg (Label sum))\n (Var $tmp.5))\n (Movq (Imm 1) (Var $tmp.3))\n (Negq (Var $tmp.3))\n (Movq (Var x.1) (Var $tmp.4))\n (Addq (Var $tmp.3) (Var $tmp.4))\n (Movq (Var $tmp.4) (Reg Rdi))\n (IndirectCallq (Var $tmp.5) 1)\n (Movq (Reg Rax) (Var $tmp.6))\n (Movq (Var x.1) (Reg Rax))\n (Addq (Var $tmp.6) (Reg Rax))\n (Jmp (Label sum_conclusion)))))\n ((Label sum_start)\n (Block\n (Binfo2\n ((initial ((RegL Rsp) (RegL Rdi)))\n (afters\n (((VarL x.1) (RegL Rsp))\n ((VarL x.1) (RegL Rsp) (RegL Rflags))\n ((VarL x.1) (RegL Rsp))\n ()))))\n ((Movq (Reg Rdi) (Var x.1))\n (Cmpq (Imm 1) (Var x.1))\n (JmpIf CC_e (Label block_3))\n (Jmp (Label block_4)))))))))))\n", + "bi": "(X86Program\n ((Def\n (Label main)\n (Finfo2\n (conflicts\n (((VarL $tmp.1) ((RegL Rsp) (RegL Rdi)))\n ((VarL $tmp.2) ((RegL Rsp)))\n ((VarL sum) ((RegL Rsp)))\n ((RegL Rsp)\n ((VarL $tmp.1)\n (VarL $tmp.2)\n (VarL sum)\n (RegL Rax)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)\n (RegL Rflags)))\n ((RegL Rax)\n ((RegL Rsp)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)))\n ((RegL Rcx) ((RegL Rsp) (RegL Rax)))\n ((RegL Rdx) ((RegL Rsp) (RegL Rax)))\n ((RegL Rsi) ((RegL Rsp) (RegL Rax)))\n ((RegL Rdi)\n ((VarL $tmp.1) (RegL Rsp) (RegL Rax)))\n ((RegL R8) ((RegL Rsp) (RegL Rax)))\n ((RegL R9) ((RegL Rsp) (RegL Rax)))\n ((RegL R10) ((RegL Rsp) (RegL Rax)))\n ((RegL R11) ((RegL Rsp) (RegL Rax)))\n ((RegL Rflags) ((RegL Rsp))))))\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (sum (Function (Integer) Integer))))\n (body\n (((Label block_1)\n (Block\n Binfo1\n ((Movq (Imm 42) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n Binfo1\n ((Movq (Imm 777) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label sum))\n (Var $tmp.1))\n (Movq (Imm 3) (Reg Rdi))\n (IndirectCallq (Var $tmp.1) 1)\n (Movq (Reg Rax) (Var $tmp.2))\n (Cmpq (Imm 6) (Var $tmp.2))\n (JmpIf CC_e (Label block_1))\n (Jmp (Label block_2)))))))))\n (Def\n (Label sum)\n (Finfo2\n (conflicts\n (((VarL $tmp.3)\n ((VarL $tmp.4)\n (VarL $tmp.5)\n (VarL x.1)\n (RegL Rsp)))\n ((VarL $tmp.4)\n ((VarL $tmp.3)\n (VarL $tmp.5)\n (VarL x.1)\n (RegL Rsp)))\n ((VarL $tmp.5)\n ((VarL $tmp.3)\n (VarL $tmp.4)\n (VarL x.1)\n (RegL Rsp)\n (RegL Rdi)))\n ((VarL $tmp.6)\n ((VarL x.1) (RegL Rsp) (RegL Rax)))\n ((VarL sum) ((RegL Rsp)))\n ((VarL x.1)\n ((VarL $tmp.3)\n (VarL $tmp.4)\n (VarL $tmp.5)\n (VarL $tmp.6)\n (RegL Rsp)\n (RegL Rax)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)\n (RegL Rflags)))\n ((RegL Rsp)\n ((VarL $tmp.3)\n (VarL $tmp.4)\n (VarL $tmp.5)\n (VarL $tmp.6)\n (VarL sum)\n (VarL x.1)\n (RegL Rax)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)\n (RegL Rflags)))\n ((RegL Rax)\n ((VarL $tmp.6)\n (VarL x.1)\n (RegL Rsp)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)))\n ((RegL Rcx)\n ((VarL x.1) (RegL Rsp) (RegL Rax)))\n ((RegL Rdx)\n ((VarL x.1) (RegL Rsp) (RegL Rax)))\n ((RegL Rsi)\n ((VarL x.1) (RegL Rsp) (RegL Rax)))\n ((RegL Rdi)\n ((VarL $tmp.5)\n (VarL x.1)\n (RegL Rsp)\n (RegL Rax)))\n ((RegL R8)\n ((VarL x.1) (RegL Rsp) (RegL Rax)))\n ((RegL R9)\n ((VarL x.1) (RegL Rsp) (RegL Rax)))\n ((RegL R10)\n ((VarL x.1) (RegL Rsp) (RegL Rax)))\n ((RegL R11)\n ((VarL x.1) (RegL Rsp) (RegL Rax)))\n ((RegL Rflags) ((VarL x.1) (RegL Rsp))))))\n ((nparams 1)\n (locals\n ((x.1 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5 (Function (Integer) Integer))\n ($tmp.6 Integer)\n (sum (Function (Integer) Integer))\n (x.1 Integer)))\n (body\n (((Label block_3)\n (Block\n Binfo1\n ((Movq (Imm 1) (Reg Rax))\n (Jmp (Label sum_conclusion)))))\n ((Label block_4)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label sum))\n (Var $tmp.5))\n (Movq (Imm 1) (Var $tmp.3))\n (Negq (Var $tmp.3))\n (Movq (Var x.1) (Var $tmp.4))\n (Addq (Var $tmp.3) (Var $tmp.4))\n (Movq (Var $tmp.4) (Reg Rdi))\n (IndirectCallq (Var $tmp.5) 1)\n (Movq (Reg Rax) (Var $tmp.6))\n (Movq (Var x.1) (Reg Rax))\n (Addq (Var $tmp.6) (Reg Rax))\n (Jmp (Label sum_conclusion)))))\n ((Label sum_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var x.1))\n (Cmpq (Imm 1) (Var x.1))\n (JmpIf CC_e (Label block_3))\n (Jmp (Label block_4)))))))))))\n", + "ar": "(X86Program\n ((Def\n (Label main)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (sum (Function (Integer) Integer))))\n (body\n (((Label block_1)\n (Block\n Binfo1\n ((Movq (Imm 42) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n Binfo1\n ((Movq (Imm 777) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label main_start)\n (Block\n Binfo1\n ((Leaq (GlobalArg (Label sum)) (Reg Rcx))\n (Movq (Imm 3) (Reg Rdi))\n (IndirectCallq (Reg Rcx) 1)\n (Movq (Reg Rax) (Reg Rcx))\n (Cmpq (Imm 6) (Reg Rcx))\n (JmpIf CC_e (Label block_1))\n (Jmp (Label block_2)))))))))\n (Def\n (Label sum)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee (Rbx)))\n ((nparams 1)\n (locals\n ((x.1 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5 (Function (Integer) Integer))\n ($tmp.6 Integer)\n (sum (Function (Integer) Integer))\n (x.1 Integer)))\n (body\n (((Label block_3)\n (Block\n Binfo1\n ((Movq (Imm 1) (Reg Rax))\n (Jmp (Label sum_conclusion)))))\n ((Label block_4)\n (Block\n Binfo1\n ((Leaq (GlobalArg (Label sum)) (Reg Rcx))\n (Movq (Imm 1) (Reg Rdx))\n (Negq (Reg Rdx))\n (Movq (Reg Rbx) (Reg Rsi))\n (Addq (Reg Rdx) (Reg Rsi))\n (Movq (Reg Rsi) (Reg Rdi))\n (IndirectCallq (Reg Rcx) 1)\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Reg Rbx) (Reg Rax))\n (Addq (Reg Rcx) (Reg Rax))\n (Jmp (Label sum_conclusion)))))\n ((Label sum_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg Rbx))\n (Cmpq (Imm 1) (Reg Rbx))\n (JmpIf CC_e (Label block_3))\n (Jmp (Label block_4)))))))))))\n", + "rj": "(X86Program\n ((Def\n (Label main)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (sum (Function (Integer) Integer))))\n (body\n (((Label block_1)\n (Block\n Binfo1\n ((Movq (Imm 42) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n Binfo1\n ((Movq (Imm 777) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label main_start)\n (Block\n Binfo1\n ((Leaq (GlobalArg (Label sum)) (Reg Rcx))\n (Movq (Imm 3) (Reg Rdi))\n (IndirectCallq (Reg Rcx) 1)\n (Movq (Reg Rax) (Reg Rcx))\n (Cmpq (Imm 6) (Reg Rcx))\n (JmpIf CC_e (Label block_1))\n (Jmp (Label block_2)))))))))\n (Def\n (Label sum)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee (Rbx)))\n ((nparams 1)\n (locals\n ((x.1 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5 (Function (Integer) Integer))\n ($tmp.6 Integer)\n (sum (Function (Integer) Integer))\n (x.1 Integer)))\n (body\n (((Label block_3)\n (Block\n Binfo1\n ((Movq (Imm 1) (Reg Rax))\n (Jmp (Label sum_conclusion)))))\n ((Label block_4)\n (Block\n Binfo1\n ((Leaq (GlobalArg (Label sum)) (Reg Rcx))\n (Movq (Imm 1) (Reg Rdx))\n (Negq (Reg Rdx))\n (Movq (Reg Rbx) (Reg Rsi))\n (Addq (Reg Rdx) (Reg Rsi))\n (Movq (Reg Rsi) (Reg Rdi))\n (IndirectCallq (Reg Rcx) 1)\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Reg Rbx) (Reg Rax))\n (Addq (Reg Rcx) (Reg Rax))\n (Jmp (Label sum_conclusion)))))\n ((Label sum_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg Rbx))\n (Cmpq (Imm 1) (Reg Rbx))\n (JmpIf CC_e (Label block_3))\n (Jmp (Label block_4)))))))))))\n", + "pi": "(X86Program\n ((Def\n (Label main)\n (Finfo\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (sum (Function (Integer) Integer))))\n (body\n (((Label block_1)\n (Block\n ((Movq (Imm 42) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n ((Movq (Imm 777) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label main_start)\n (Block\n ((Leaq (GlobalArg (Label sum)) (Reg Rcx))\n (Movq (Imm 3) (Reg Rdi))\n (IndirectCallq (Reg Rcx) 1)\n (Movq (Reg Rax) (Reg Rcx))\n (Cmpq (Imm 6) (Reg Rcx))\n (JmpIf CC_e (Label block_1))\n (Jmp (Label block_2)))))))))\n (Def\n (Label sum)\n (Finfo\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee (Rbx)))\n ((nparams 1)\n (locals\n ((x.1 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5 (Function (Integer) Integer))\n ($tmp.6 Integer)\n (sum (Function (Integer) Integer))\n (x.1 Integer)))\n (body\n (((Label block_3)\n (Block\n ((Movq (Imm 1) (Reg Rax))\n (Jmp (Label sum_conclusion)))))\n ((Label block_4)\n (Block\n ((Leaq (GlobalArg (Label sum)) (Reg Rcx))\n (Movq (Imm 1) (Reg Rdx))\n (Negq (Reg Rdx))\n (Movq (Reg Rbx) (Reg Rsi))\n (Addq (Reg Rdx) (Reg Rsi))\n (Movq (Reg Rsi) (Reg Rdi))\n (IndirectCallq (Reg Rcx) 1)\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Reg Rbx) (Reg Rax))\n (Addq (Reg Rcx) (Reg Rax))\n (Jmp (Label sum_conclusion)))))\n ((Label sum_start)\n (Block\n ((Movq (Reg Rdi) (Reg Rbx))\n (Cmpq (Imm 1) (Reg Rbx))\n (JmpIf CC_e (Label block_3))\n (Jmp (Label block_4)))))))))))\n", + "pc": "(X86Program\n ((Label block_1)\n (Movq (Imm 42) (Reg Rax))\n (Jmp (Label main_conclusion))\n (Label block_2)\n (Movq (Imm 777) (Reg Rax))\n (Jmp (Label main_conclusion))\n (Label main_start)\n (Leaq\n (GlobalArg Rip (Label sum))\n (Reg Rcx))\n (Movq (Imm 3) (Reg Rdi))\n (IndirectCallq (Reg Rcx))\n (Movq (Reg Rax) (Reg Rcx))\n (Cmpq (Imm 6) (Reg Rcx))\n (JmpIf CC_e (Label block_1))\n (Jmp (Label block_2))\n (Global (Label main))\n (Align 8)\n (Label main)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Subq (Imm 0) (Reg Rsp))\n (Movq (Imm 65536) (Reg Rdi))\n (Movq (Imm 65536) (Reg Rsi))\n (Callq (Label initialize))\n (Movq\n (GlobalArg Rip (Label rootstack_begin))\n (Reg R15))\n (Addq (Imm 0) (Reg R15))\n (Jmp (Label main_start))\n (Label main_conclusion)\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n Retq\n (Label block_3)\n (Movq (Imm 1) (Reg Rax))\n (Jmp (Label sum_conclusion))\n (Label block_4)\n (Leaq\n (GlobalArg Rip (Label sum))\n (Reg Rcx))\n (Movq (Imm 1) (Reg Rdx))\n (Negq (Reg Rdx))\n (Movq (Reg Rbx) (Reg Rsi))\n (Addq (Reg Rdx) (Reg Rsi))\n (Movq (Reg Rsi) (Reg Rdi))\n (IndirectCallq (Reg Rcx))\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Reg Rbx) (Reg Rax))\n (Addq (Reg Rcx) (Reg Rax))\n (Jmp (Label sum_conclusion))\n (Label sum_start)\n (Movq (Reg Rdi) (Reg Rbx))\n (Cmpq (Imm 1) (Reg Rbx))\n (JmpIf CC_e (Label block_3))\n (Jmp (Label block_4))\n (Global (Label sum))\n (Align 8)\n (Label sum)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Pushq (Reg Rbx))\n (Subq (Imm 8) (Reg Rsp))\n (Addq (Imm 0) (Reg R15))\n (Jmp (Label sum_start))\n (Label sum_conclusion)\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 8) (Reg Rsp))\n (Popq (Reg Rbx))\n (Popq (Reg Rbp))\n Retq))\n", + "opt": "(X86Program\n ((Label block_1)\n (Movq (Imm 42) (Reg Rax))\n (Jmp (Label main_conclusion))\n (Label block_2)\n (Movq (Imm 777) (Reg Rax))\n (Jmp (Label main_conclusion))\n (Label main_start)\n (Leaq\n (GlobalArg Rip (Label sum))\n (Reg Rcx))\n (Movq (Imm 3) (Reg Rdi))\n (IndirectCallq (Reg Rcx))\n (Movq (Reg Rax) (Reg Rcx))\n (Cmpq (Imm 6) (Reg Rcx))\n (JmpIf CC_e (Label block_1))\n (Jmp (Label block_2))\n (Global (Label main))\n (Align 8)\n (Label main)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Movq (Imm 65536) (Reg Rdi))\n (Movq (Imm 65536) (Reg Rsi))\n (Callq (Label initialize))\n (Movq\n (GlobalArg Rip (Label rootstack_begin))\n (Reg R15))\n (Jmp (Label main_start))\n (Label main_conclusion)\n (Popq (Reg Rbp))\n Retq\n (Label block_3)\n (Movq (Imm 1) (Reg Rax))\n (Jmp (Label sum_conclusion))\n (Label block_4)\n (Leaq\n (GlobalArg Rip (Label sum))\n (Reg Rcx))\n (Movq (Imm 1) (Reg Rdx))\n (Negq (Reg Rdx))\n (Movq (Reg Rbx) (Reg Rsi))\n (Addq (Reg Rdx) (Reg Rsi))\n (Movq (Reg Rsi) (Reg Rdi))\n (IndirectCallq (Reg Rcx))\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Reg Rbx) (Reg Rax))\n (Addq (Reg Rcx) (Reg Rax))\n (Jmp (Label sum_conclusion))\n (Label sum_start)\n (Movq (Reg Rdi) (Reg Rbx))\n (Cmpq (Imm 1) (Reg Rbx))\n (JmpIf CC_e (Label block_3))\n (Jmp (Label block_4))\n (Global (Label sum))\n (Align 8)\n (Label sum)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Pushq (Reg Rbx))\n (Subq (Imm 8) (Reg Rsp))\n (Jmp (Label sum_start))\n (Label sum_conclusion)\n (Addq (Imm 8) (Reg Rsp))\n (Popq (Reg Rbx))\n (Popq (Reg Rbp))\n Retq))\n", + "pa": "block_1:\n movq $42, %rax\n jmp main_conclusion\n\nblock_2:\n movq $777, %rax\n jmp main_conclusion\n\nmain_start:\n leaq sum(%rip), %rcx\n movq $3, %rdi\n callq *%rcx\n movq %rax, %rcx\n cmpq $6, %rcx\n je block_1\n jmp block_2\n\n .globl main\n .align 8\n\nmain:\n pushq %rbp\n movq %rsp, %rbp\n movq $65536, %rdi\n movq $65536, %rsi\n callq initialize\n movq rootstack_begin(%rip), %r15\n jmp main_start\n\nmain_conclusion:\n popq %rbp\n retq\n\nblock_3:\n movq $1, %rax\n jmp sum_conclusion\n\nblock_4:\n leaq sum(%rip), %rcx\n movq $1, %rdx\n negq %rdx\n movq %rbx, %rsi\n addq %rdx, %rsi\n movq %rsi, %rdi\n callq *%rcx\n movq %rax, %rcx\n movq %rbx, %rax\n addq %rcx, %rax\n jmp sum_conclusion\n\nsum_start:\n movq %rdi, %rbx\n cmpq $1, %rbx\n je block_3\n jmp block_4\n\n .globl sum\n .align 8\n\nsum:\n pushq %rbp\n movq %rsp, %rbp\n pushq %rbx\n subq $8, %rsp\n jmp sum_start\n\nsum_conclusion:\n addq $8, %rsp\n popq %rbx\n popq %rbp\n retq\n" + } + }, + { + "id": "functions_test_5", + "title": "Tail Recursion", + "description": "Tail-recursive function with branching", + "source": ";; OUTPUT: 42\n\n(define (tailrecur (x : Integer)) : Integer\n (if (= x 0) 0 (tailrecur (+ x (- 1)))))\n\n(if (= 0 (tailrecur 99))\n 42\n 777)\n", + "passOutputs": { + "lfun": "(Program\n ((Def\n tailrecur\n ((args ((x Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x) (Int 0)))\n (Int 0)\n (Apply\n (Var tailrecur)\n ((Prim\n Add\n ((Var x) (Prim Negate ((Int 1))))))))))))\n (If\n (Prim\n Eq\n ((Int 0)\n (Apply (Var tailrecur) ((Int 99)))))\n (Int 42)\n (Int 777)))\n", + "tc1": "(Program\n ((Def\n tailrecur\n ((args ((x Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x) (Int 0)))\n (Int 0)\n (Apply\n (Var tailrecur)\n ((Prim\n Add\n ((Var x) (Prim Negate ((Int 1))))))))))))\n (If\n (Prim\n Eq\n ((Int 0)\n (Apply (Var tailrecur) ((Int 99)))))\n (Int 42)\n (Int 777)))\n", + "sh": "(Program\n ((Def\n main\n ((args ())\n (ret Integer)\n (body\n (If\n (Prim\n Eq\n ((Int 0)\n (Apply (Var tailrecur) ((Int 99)))))\n (Int 42)\n (Int 777)))))\n (Def\n tailrecur\n ((args ((x Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x) (Int 0)))\n (Int 0)\n (Apply\n (Var tailrecur)\n ((Prim\n Add\n ((Var x) (Prim Negate ((Int 1)))))))))))))\n", + "un": "(Program\n ((Def\n main\n ((args ())\n (ret Integer)\n (body\n (If\n (Prim\n Eq\n ((Int 0)\n (Apply (Var tailrecur) ((Int 99)))))\n (Int 42)\n (Int 777)))))\n (Def\n tailrecur\n ((args ((x.1 Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x.1) (Int 0)))\n (Int 0)\n (Apply\n (Var tailrecur)\n ((Prim\n Add\n ((Var x.1) (Prim Negate ((Int 1)))))))))))))\n", + "rf": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (If\n (Prim\n Eq\n ((Int 0)\n (Apply\n (FunRef (Label tailrecur) 1)\n ((Int 99)))))\n (Int 42)\n (Int 777)))))\n (Def\n (Label tailrecur)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x.1) (Int 0)))\n (Int 0)\n (Apply\n (FunRef (Label tailrecur) 1)\n ((Prim\n Add\n ((Var x.1) (Prim Negate ((Int 1)))))))))))))\n", + "lf": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (If\n (Prim\n Eq\n ((Int 0)\n (Apply\n (FunRef (Label tailrecur) 1)\n ((Int 99)))))\n (Int 42)\n (Int 777)))))\n (Def\n (Label tailrecur)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x.1) (Int 0)))\n (Int 0)\n (Apply\n (FunRef (Label tailrecur) 1)\n ((Prim\n Add\n ((Var x.1) (Prim Negate ((Int 1)))))))))))))\n", + "tc1b": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (If\n (Prim\n Eq\n ((Int 0)\n (Apply\n (FunRef (Label tailrecur) 1)\n ((Int 99)))))\n (Int 42)\n (Int 777)))))\n (Def\n (Label tailrecur)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x.1) (Int 0)))\n (Int 0)\n (Apply\n (FunRef (Label tailrecur) 1)\n ((Prim\n Add\n ((Var x.1) (Prim Negate ((Int 1)))))))))))))\n", + "ea": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (If\n (Prim\n Eq\n ((Int 0)\n (Apply\n (FunRef (Label tailrecur) 1)\n ((Int 99)))))\n (Int 42)\n (Int 777)))))\n (Def\n (Label tailrecur)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x.1) (Int 0)))\n (Int 0)\n (Apply\n (FunRef (Label tailrecur) 1)\n ((Prim\n Add\n ((Var x.1) (Prim Negate ((Int 1)))))))))))))\n", + "ug": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (If\n (Prim\n Eq\n ((Int 0)\n (Apply\n (FunRef (Label tailrecur) 1)\n ((Int 99)))))\n (Int 42)\n (Int 777)))))\n (Def\n (Label tailrecur)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x.1) (Int 0)))\n (Int 0)\n (Apply\n (FunRef (Label tailrecur) 1)\n ((Prim\n Add\n ((Var x.1) (Prim Negate ((Int 1)))))))))))))\n", + "rc": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (If\n (Let\n $tmp.1\n (FunRef (Label tailrecur) 1)\n (Let\n $tmp.2\n (Apply (Var $tmp.1) ((Int 99)))\n (Prim Eq ((Int 0) (Var $tmp.2)))))\n (Atm (Int 42))\n (Atm (Int 777))))))\n (Def\n (Label tailrecur)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body\n (If\n (Prim Eq ((Var x.1) (Int 0)))\n (Atm (Int 0))\n (Let\n $tmp.5\n (FunRef (Label tailrecur) 1)\n (Let\n $tmp.3\n (Prim Negate ((Int 1)))\n (Let\n $tmp.4\n (Prim Add ((Var x.1) (Var $tmp.3)))\n (Apply (Var $tmp.5) ((Var $tmp.4))))))))))))\n", + "ec": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals ())\n (body\n (((Label start)\n (Seq\n (Assign\n $tmp.1\n (FunRef (Label tailrecur) 1))\n (Seq\n (Assign\n $tmp.2\n (Call (Var $tmp.1) ((Int 99))))\n (IfStmt\n (op Eq)\n (arg1 (Int 0))\n (arg2 (Var $tmp.2))\n (jump_then (Label block_1))\n (jump_else (Label block_2))))))\n ((Label block_1)\n (Return (Atm (Int 42))))\n ((Label block_2)\n (Return (Atm (Int 777))))))))\n (Def\n (Label tailrecur)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals ())\n (body\n (((Label start)\n (IfStmt\n (op Eq)\n (arg1 (Var x.1))\n (arg2 (Int 0))\n (jump_then (Label block_3))\n (jump_else (Label block_4))))\n ((Label block_3) (Return (Atm (Int 0))))\n ((Label block_4)\n (Seq\n (Assign\n $tmp.5\n (FunRef (Label tailrecur) 1))\n (Seq\n (Assign $tmp.3 (Prim Negate ((Int 1))))\n (Seq\n (Assign\n $tmp.4\n (Prim Add ((Var x.1) (Var $tmp.3))))\n (TailCall (Var $tmp.5) ((Var $tmp.4)))))))))))))\n", + "tc2": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (tailrecur (Function (Integer) Integer))))\n (body\n (((Label start)\n (Seq\n (Assign\n $tmp.1\n (FunRef (Label tailrecur) 1))\n (Seq\n (Assign\n $tmp.2\n (Call (Var $tmp.1) ((Int 99))))\n (IfStmt\n (op Eq)\n (arg1 (Int 0))\n (arg2 (Var $tmp.2))\n (jump_then (Label block_1))\n (jump_else (Label block_2))))))\n ((Label block_1)\n (Return (Atm (Int 42))))\n ((Label block_2)\n (Return (Atm (Int 777))))))))\n (Def\n (Label tailrecur)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals\n (($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5 (Function (Integer) Integer))\n (tailrecur (Function (Integer) Integer))\n (x.1 Integer)))\n (body\n (((Label start)\n (IfStmt\n (op Eq)\n (arg1 (Var x.1))\n (arg2 (Int 0))\n (jump_then (Label block_3))\n (jump_else (Label block_4))))\n ((Label block_3) (Return (Atm (Int 0))))\n ((Label block_4)\n (Seq\n (Assign\n $tmp.5\n (FunRef (Label tailrecur) 1))\n (Seq\n (Assign $tmp.3 (Prim Negate ((Int 1))))\n (Seq\n (Assign\n $tmp.4\n (Prim Add ((Var x.1) (Var $tmp.3))))\n (TailCall (Var $tmp.5) ((Var $tmp.4)))))))))))))\n", + "ru": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (tailrecur (Function (Integer) Integer))))\n (body\n (((Label block_1)\n (Return (Atm (Int 42))))\n ((Label block_2)\n (Return (Atm (Int 777))))\n ((Label start)\n (Seq\n (Assign\n $tmp.1\n (FunRef (Label tailrecur) 1))\n (Seq\n (Assign\n $tmp.2\n (Call (Var $tmp.1) ((Int 99))))\n (IfStmt\n (op Eq)\n (arg1 (Int 0))\n (arg2 (Var $tmp.2))\n (jump_then (Label block_1))\n (jump_else (Label block_2))))))))))\n (Def\n (Label tailrecur)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals\n (($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5 (Function (Integer) Integer))\n (tailrecur (Function (Integer) Integer))\n (x.1 Integer)))\n (body\n (((Label block_3) (Return (Atm (Int 0))))\n ((Label block_4)\n (Seq\n (Assign\n $tmp.5\n (FunRef (Label tailrecur) 1))\n (Seq\n (Assign $tmp.3 (Prim Negate ((Int 1))))\n (Seq\n (Assign\n $tmp.4\n (Prim Add ((Var x.1) (Var $tmp.3))))\n (TailCall (Var $tmp.5) ((Var $tmp.4)))))))\n ((Label start)\n (IfStmt\n (op Eq)\n (arg1 (Var x.1))\n (arg2 (Int 0))\n (jump_then (Label block_3))\n (jump_else (Label block_4))))))))))\n", + "si": "(X86Program\n ((Def\n (Label main)\n Finfo1\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (tailrecur (Function (Integer) Integer))))\n (body\n (((Label block_1)\n (Block\n Binfo1\n ((Movq (Imm 42) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n Binfo1\n ((Movq (Imm 777) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label tailrecur))\n (Var $tmp.1))\n (Movq (Imm 99) (Reg Rdi))\n (IndirectCallq (Var $tmp.1) 1)\n (Movq (Reg Rax) (Var $tmp.2))\n (Cmpq (Var $tmp.2) (Imm 0))\n (JmpIf CC_e (Label block_1))\n (Jmp (Label block_2)))))))))\n (Def\n (Label tailrecur)\n Finfo1\n ((nparams 1)\n (locals\n ((x.1 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5 (Function (Integer) Integer))\n (tailrecur (Function (Integer) Integer))\n (x.1 Integer)))\n (body\n (((Label block_3)\n (Block\n Binfo1\n ((Movq (Imm 0) (Reg Rax))\n (Jmp (Label tailrecur_conclusion)))))\n ((Label block_4)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label tailrecur))\n (Var $tmp.5))\n (Movq (Imm 1) (Var $tmp.3))\n (Negq (Var $tmp.3))\n (Movq (Var x.1) (Var $tmp.4))\n (Addq (Var $tmp.3) (Var $tmp.4))\n (Movq (Var $tmp.4) (Reg Rdi))\n (TailJmp (Var $tmp.5) 1))))\n ((Label tailrecur_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var x.1))\n (Cmpq (Imm 0) (Var x.1))\n (JmpIf CC_e (Label block_3))\n (Jmp (Label block_4)))))))))))\n", + "ul": "(X86Program\n ((Def\n (Label main)\n Finfo1\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (tailrecur (Function (Integer) Integer))))\n (body\n (((Label block_1)\n (Block\n (Binfo2\n ((initial ((RegL Rsp)))\n (afters (((RegL Rsp) (RegL Rax)) ()))))\n ((Movq (Imm 42) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n (Binfo2\n ((initial ((RegL Rsp)))\n (afters (((RegL Rsp) (RegL Rax)) ()))))\n ((Movq (Imm 777) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label main_start)\n (Block\n (Binfo2\n ((initial ((RegL Rsp)))\n (afters\n (((VarL $tmp.1) (RegL Rsp))\n ((VarL $tmp.1) (RegL Rsp) (RegL Rdi))\n ((RegL Rsp) (RegL Rax))\n ((VarL $tmp.2) (RegL Rsp))\n ((RegL Rsp) (RegL Rflags))\n ((RegL Rsp))\n ()))))\n ((Leaq\n (GlobalArg (Label tailrecur))\n (Var $tmp.1))\n (Movq (Imm 99) (Reg Rdi))\n (IndirectCallq (Var $tmp.1) 1)\n (Movq (Reg Rax) (Var $tmp.2))\n (Cmpq (Var $tmp.2) (Imm 0))\n (JmpIf CC_e (Label block_1))\n (Jmp (Label block_2)))))))))\n (Def\n (Label tailrecur)\n Finfo1\n ((nparams 1)\n (locals\n ((x.1 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5 (Function (Integer) Integer))\n (tailrecur (Function (Integer) Integer))\n (x.1 Integer)))\n (body\n (((Label block_3)\n (Block\n (Binfo2\n ((initial ((RegL Rsp)))\n (afters (((RegL Rsp) (RegL Rax)) ()))))\n ((Movq (Imm 0) (Reg Rax))\n (Jmp (Label tailrecur_conclusion)))))\n ((Label block_4)\n (Block\n (Binfo2\n ((initial ((VarL x.1)))\n (afters\n (((VarL $tmp.5) (VarL x.1))\n ((VarL $tmp.3) (VarL $tmp.5) (VarL x.1))\n ((VarL $tmp.3) (VarL $tmp.5) (VarL x.1))\n ((VarL $tmp.3)\n (VarL $tmp.4)\n (VarL $tmp.5))\n ((VarL $tmp.4) (VarL $tmp.5))\n ((VarL $tmp.5) (RegL Rdi))\n ()))))\n ((Leaq\n (GlobalArg (Label tailrecur))\n (Var $tmp.5))\n (Movq (Imm 1) (Var $tmp.3))\n (Negq (Var $tmp.3))\n (Movq (Var x.1) (Var $tmp.4))\n (Addq (Var $tmp.3) (Var $tmp.4))\n (Movq (Var $tmp.4) (Reg Rdi))\n (TailJmp (Var $tmp.5) 1))))\n ((Label tailrecur_start)\n (Block\n (Binfo2\n ((initial ((RegL Rsp) (RegL Rdi)))\n (afters\n (((VarL x.1) (RegL Rsp))\n ((VarL x.1) (RegL Rsp) (RegL Rflags))\n ((VarL x.1))\n ()))))\n ((Movq (Reg Rdi) (Var x.1))\n (Cmpq (Imm 0) (Var x.1))\n (JmpIf CC_e (Label block_3))\n (Jmp (Label block_4)))))))))))\n", + "bi": "(X86Program\n ((Def\n (Label main)\n (Finfo2\n (conflicts\n (((VarL $tmp.1) ((RegL Rsp) (RegL Rdi)))\n ((VarL $tmp.2) ((RegL Rsp)))\n ((VarL tailrecur) ((RegL Rsp)))\n ((RegL Rsp)\n ((VarL $tmp.1)\n (VarL $tmp.2)\n (VarL tailrecur)\n (RegL Rax)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)\n (RegL Rflags)))\n ((RegL Rax)\n ((RegL Rsp)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)))\n ((RegL Rcx) ((RegL Rsp) (RegL Rax)))\n ((RegL Rdx) ((RegL Rsp) (RegL Rax)))\n ((RegL Rsi) ((RegL Rsp) (RegL Rax)))\n ((RegL Rdi)\n ((VarL $tmp.1) (RegL Rsp) (RegL Rax)))\n ((RegL R8) ((RegL Rsp) (RegL Rax)))\n ((RegL R9) ((RegL Rsp) (RegL Rax)))\n ((RegL R10) ((RegL Rsp) (RegL Rax)))\n ((RegL R11) ((RegL Rsp) (RegL Rax)))\n ((RegL Rflags) ((RegL Rsp))))))\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (tailrecur (Function (Integer) Integer))))\n (body\n (((Label block_1)\n (Block\n Binfo1\n ((Movq (Imm 42) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n Binfo1\n ((Movq (Imm 777) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label tailrecur))\n (Var $tmp.1))\n (Movq (Imm 99) (Reg Rdi))\n (IndirectCallq (Var $tmp.1) 1)\n (Movq (Reg Rax) (Var $tmp.2))\n (Cmpq (Var $tmp.2) (Imm 0))\n (JmpIf CC_e (Label block_1))\n (Jmp (Label block_2)))))))))\n (Def\n (Label tailrecur)\n (Finfo2\n (conflicts\n (((VarL $tmp.3)\n ((VarL $tmp.4) (VarL $tmp.5) (VarL x.1)))\n ((VarL $tmp.4)\n ((VarL $tmp.3) (VarL $tmp.5)))\n ((VarL $tmp.5)\n ((VarL $tmp.3)\n (VarL $tmp.4)\n (VarL x.1)\n (RegL Rdi)))\n ((VarL tailrecur) ((RegL Rsp)))\n ((VarL x.1)\n ((VarL $tmp.3)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL Rflags)))\n ((RegL Rsp)\n ((VarL tailrecur)\n (VarL x.1)\n (RegL Rax)\n (RegL Rflags)))\n ((RegL Rax) ((RegL Rsp)))\n ((RegL Rdi) ((VarL $tmp.5)))\n ((RegL Rflags) ((VarL x.1) (RegL Rsp))))))\n ((nparams 1)\n (locals\n ((x.1 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5 (Function (Integer) Integer))\n (tailrecur (Function (Integer) Integer))\n (x.1 Integer)))\n (body\n (((Label block_3)\n (Block\n Binfo1\n ((Movq (Imm 0) (Reg Rax))\n (Jmp (Label tailrecur_conclusion)))))\n ((Label block_4)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label tailrecur))\n (Var $tmp.5))\n (Movq (Imm 1) (Var $tmp.3))\n (Negq (Var $tmp.3))\n (Movq (Var x.1) (Var $tmp.4))\n (Addq (Var $tmp.3) (Var $tmp.4))\n (Movq (Var $tmp.4) (Reg Rdi))\n (TailJmp (Var $tmp.5) 1))))\n ((Label tailrecur_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var x.1))\n (Cmpq (Imm 0) (Var x.1))\n (JmpIf CC_e (Label block_3))\n (Jmp (Label block_4)))))))))))\n", + "ar": "(X86Program\n ((Def\n (Label main)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (tailrecur (Function (Integer) Integer))))\n (body\n (((Label block_1)\n (Block\n Binfo1\n ((Movq (Imm 42) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n Binfo1\n ((Movq (Imm 777) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label tailrecur))\n (Reg Rcx))\n (Movq (Imm 99) (Reg Rdi))\n (IndirectCallq (Reg Rcx) 1)\n (Movq (Reg Rax) (Reg Rcx))\n (Cmpq (Reg Rcx) (Imm 0))\n (JmpIf CC_e (Label block_1))\n (Jmp (Label block_2)))))))))\n (Def\n (Label tailrecur)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals\n ((x.1 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5 (Function (Integer) Integer))\n (tailrecur (Function (Integer) Integer))\n (x.1 Integer)))\n (body\n (((Label block_3)\n (Block\n Binfo1\n ((Movq (Imm 0) (Reg Rax))\n (Jmp (Label tailrecur_conclusion)))))\n ((Label block_4)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label tailrecur))\n (Reg Rdx))\n (Movq (Imm 1) (Reg Rsi))\n (Negq (Reg Rsi))\n (Movq (Reg Rcx) (Reg Rcx))\n (Addq (Reg Rsi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rdi))\n (TailJmp (Reg Rdx) 1))))\n ((Label tailrecur_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg Rcx))\n (Cmpq (Imm 0) (Reg Rcx))\n (JmpIf CC_e (Label block_3))\n (Jmp (Label block_4)))))))))))\n", + "rj": "(X86Program\n ((Def\n (Label main)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (tailrecur (Function (Integer) Integer))))\n (body\n (((Label block_1)\n (Block\n Binfo1\n ((Movq (Imm 42) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n Binfo1\n ((Movq (Imm 777) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label tailrecur))\n (Reg Rcx))\n (Movq (Imm 99) (Reg Rdi))\n (IndirectCallq (Reg Rcx) 1)\n (Movq (Reg Rax) (Reg Rcx))\n (Cmpq (Reg Rcx) (Imm 0))\n (JmpIf CC_e (Label block_1))\n (Jmp (Label block_2)))))))))\n (Def\n (Label tailrecur)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals\n ((x.1 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5 (Function (Integer) Integer))\n (tailrecur (Function (Integer) Integer))\n (x.1 Integer)))\n (body\n (((Label block_3)\n (Block\n Binfo1\n ((Movq (Imm 0) (Reg Rax))\n (Jmp (Label tailrecur_conclusion)))))\n ((Label block_4)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label tailrecur))\n (Reg Rdx))\n (Movq (Imm 1) (Reg Rsi))\n (Negq (Reg Rsi))\n (Movq (Reg Rcx) (Reg Rcx))\n (Addq (Reg Rsi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rdi))\n (TailJmp (Reg Rdx) 1))))\n ((Label tailrecur_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg Rcx))\n (Cmpq (Imm 0) (Reg Rcx))\n (JmpIf CC_e (Label block_3))\n (Jmp (Label block_4)))))))))))\n", + "pi": "(X86Program\n ((Def\n (Label main)\n (Finfo\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n (tailrecur (Function (Integer) Integer))))\n (body\n (((Label block_1)\n (Block\n ((Movq (Imm 42) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n ((Movq (Imm 777) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label main_start)\n (Block\n ((Leaq\n (GlobalArg (Label tailrecur))\n (Reg Rcx))\n (Movq (Imm 99) (Reg Rdi))\n (IndirectCallq (Reg Rcx) 1)\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 0) (Reg Rax))\n (Cmpq (Reg Rcx) (Reg Rax))\n (JmpIf CC_e (Label block_1))\n (Jmp (Label block_2)))))))))\n (Def\n (Label tailrecur)\n (Finfo\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals\n ((x.1 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5 (Function (Integer) Integer))\n (tailrecur (Function (Integer) Integer))\n (x.1 Integer)))\n (body\n (((Label block_3)\n (Block\n ((Movq (Imm 0) (Reg Rax))\n (Jmp (Label tailrecur_conclusion)))))\n ((Label block_4)\n (Block\n ((Leaq\n (GlobalArg (Label tailrecur))\n (Reg Rdx))\n (Movq (Imm 1) (Reg Rsi))\n (Negq (Reg Rsi))\n (Addq (Reg Rsi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rdi))\n (Movq (Reg Rdx) (Reg Rax))\n (TailJmp (Reg Rax) 1))))\n ((Label tailrecur_start)\n (Block\n ((Movq (Reg Rdi) (Reg Rcx))\n (Cmpq (Imm 0) (Reg Rcx))\n (JmpIf CC_e (Label block_3))\n (Jmp (Label block_4)))))))))))\n", + "pc": "(X86Program\n ((Label block_1)\n (Movq (Imm 42) (Reg Rax))\n (Jmp (Label main_conclusion))\n (Label block_2)\n (Movq (Imm 777) (Reg Rax))\n (Jmp (Label main_conclusion))\n (Label main_start)\n (Leaq\n (GlobalArg Rip (Label tailrecur))\n (Reg Rcx))\n (Movq (Imm 99) (Reg Rdi))\n (IndirectCallq (Reg Rcx))\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 0) (Reg Rax))\n (Cmpq (Reg Rcx) (Reg Rax))\n (JmpIf CC_e (Label block_1))\n (Jmp (Label block_2))\n (Global (Label main))\n (Align 8)\n (Label main)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Subq (Imm 0) (Reg Rsp))\n (Movq (Imm 65536) (Reg Rdi))\n (Movq (Imm 65536) (Reg Rsi))\n (Callq (Label initialize))\n (Movq\n (GlobalArg Rip (Label rootstack_begin))\n (Reg R15))\n (Addq (Imm 0) (Reg R15))\n (Jmp (Label main_start))\n (Label main_conclusion)\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n Retq\n (Label block_3)\n (Movq (Imm 0) (Reg Rax))\n (Jmp (Label tailrecur_conclusion))\n (Label block_4)\n (Leaq\n (GlobalArg Rip (Label tailrecur))\n (Reg Rdx))\n (Movq (Imm 1) (Reg Rsi))\n (Negq (Reg Rsi))\n (Addq (Reg Rsi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rdi))\n (Movq (Reg Rdx) (Reg Rax))\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n (TailJmp (Reg Rax))\n (Label tailrecur_start)\n (Movq (Reg Rdi) (Reg Rcx))\n (Cmpq (Imm 0) (Reg Rcx))\n (JmpIf CC_e (Label block_3))\n (Jmp (Label block_4))\n (Global (Label tailrecur))\n (Align 8)\n (Label tailrecur)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Subq (Imm 0) (Reg Rsp))\n (Addq (Imm 0) (Reg R15))\n (Jmp (Label tailrecur_start))\n (Label tailrecur_conclusion)\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n Retq))\n", + "opt": "(X86Program\n ((Label block_1)\n (Movq (Imm 42) (Reg Rax))\n (Jmp (Label main_conclusion))\n (Label block_2)\n (Movq (Imm 777) (Reg Rax))\n (Jmp (Label main_conclusion))\n (Label main_start)\n (Leaq\n (GlobalArg Rip (Label tailrecur))\n (Reg Rcx))\n (Movq (Imm 99) (Reg Rdi))\n (IndirectCallq (Reg Rcx))\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 0) (Reg Rax))\n (Cmpq (Reg Rcx) (Reg Rax))\n (JmpIf CC_e (Label block_1))\n (Jmp (Label block_2))\n (Global (Label main))\n (Align 8)\n (Label main)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Movq (Imm 65536) (Reg Rdi))\n (Movq (Imm 65536) (Reg Rsi))\n (Callq (Label initialize))\n (Movq\n (GlobalArg Rip (Label rootstack_begin))\n (Reg R15))\n (Jmp (Label main_start))\n (Label main_conclusion)\n (Popq (Reg Rbp))\n Retq\n (Label block_3)\n (Movq (Imm 0) (Reg Rax))\n (Jmp (Label tailrecur_conclusion))\n (Label block_4)\n (Leaq\n (GlobalArg Rip (Label tailrecur))\n (Reg Rdx))\n (Movq (Imm 1) (Reg Rsi))\n (Negq (Reg Rsi))\n (Addq (Reg Rsi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rdi))\n (Movq (Reg Rdx) (Reg Rax))\n (Popq (Reg Rbp))\n (TailJmp (Reg Rax))\n (Label tailrecur_start)\n (Movq (Reg Rdi) (Reg Rcx))\n (Cmpq (Imm 0) (Reg Rcx))\n (JmpIf CC_e (Label block_3))\n (Jmp (Label block_4))\n (Global (Label tailrecur))\n (Align 8)\n (Label tailrecur)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Jmp (Label tailrecur_start))\n (Label tailrecur_conclusion)\n (Popq (Reg Rbp))\n Retq))\n", + "pa": "block_1:\n movq $42, %rax\n jmp main_conclusion\n\nblock_2:\n movq $777, %rax\n jmp main_conclusion\n\nmain_start:\n leaq tailrecur(%rip), %rcx\n movq $99, %rdi\n callq *%rcx\n movq %rax, %rcx\n movq $0, %rax\n cmpq %rcx, %rax\n je block_1\n jmp block_2\n\n .globl main\n .align 8\n\nmain:\n pushq %rbp\n movq %rsp, %rbp\n movq $65536, %rdi\n movq $65536, %rsi\n callq initialize\n movq rootstack_begin(%rip), %r15\n jmp main_start\n\nmain_conclusion:\n popq %rbp\n retq\n\nblock_3:\n movq $0, %rax\n jmp tailrecur_conclusion\n\nblock_4:\n leaq tailrecur(%rip), %rdx\n movq $1, %rsi\n negq %rsi\n addq %rsi, %rcx\n movq %rcx, %rdi\n movq %rdx, %rax\n popq %rbp\n jmp *%rax\n\ntailrecur_start:\n movq %rdi, %rcx\n cmpq $0, %rcx\n je block_3\n jmp block_4\n\n .globl tailrecur\n .align 8\n\ntailrecur:\n pushq %rbp\n movq %rsp, %rbp\n jmp tailrecur_start\n\ntailrecur_conclusion:\n popq %rbp\n retq\n" + } + }, + { + "id": "functions_test_7", + "title": "Higher-Order (identity)", + "description": "Higher-order function returning a function", + "source": ";; OUTPUT: 42\n\n(define (id (f : (Integer -> Integer))) : (Integer -> Integer)\n f)\n\n(define (inc (x : Integer)) : Integer\n (+ x 1))\n\n((id inc) 41)\n", + "passOutputs": { + "lfun": "(Program\n ((Def\n id\n ((args\n ((f (Function (Integer) Integer))))\n (ret (Function (Integer) Integer))\n (body (Var f))))\n (Def\n inc\n ((args ((x Integer)))\n (ret Integer)\n (body (Prim Add ((Var x) (Int 1)))))))\n (Apply\n (Apply (Var id) ((Var inc)))\n ((Int 41))))\n", + "tc1": "(Program\n ((Def\n id\n ((args\n ((f (Function (Integer) Integer))))\n (ret (Function (Integer) Integer))\n (body (Var f))))\n (Def\n inc\n ((args ((x Integer)))\n (ret Integer)\n (body (Prim Add ((Var x) (Int 1)))))))\n (Apply\n (Apply (Var id) ((Var inc)))\n ((Int 41))))\n", + "sh": "(Program\n ((Def\n main\n ((args ())\n (ret Integer)\n (body\n (Apply\n (Apply (Var id) ((Var inc)))\n ((Int 41))))))\n (Def\n id\n ((args\n ((f (Function (Integer) Integer))))\n (ret (Function (Integer) Integer))\n (body (Var f))))\n (Def\n inc\n ((args ((x Integer)))\n (ret Integer)\n (body (Prim Add ((Var x) (Int 1))))))))\n", + "un": "(Program\n ((Def\n main\n ((args ())\n (ret Integer)\n (body\n (Apply\n (Apply (Var id) ((Var inc)))\n ((Int 41))))))\n (Def\n id\n ((args\n ((f.1 (Function (Integer) Integer))))\n (ret (Function (Integer) Integer))\n (body (Var f.1))))\n (Def\n inc\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))))\n", + "rf": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Apply\n (Apply\n (FunRef (Label id) 1)\n ((FunRef (Label inc) 1)))\n ((Int 41))))))\n (Def\n (Label id)\n ((args\n ((f.1 (Function (Integer) Integer))))\n (ret (Function (Integer) Integer))\n (body (Var f.1))))\n (Def\n (Label inc)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))))\n", + "lf": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Apply\n (Apply\n (FunRef (Label id) 1)\n ((FunRef (Label inc) 1)))\n ((Int 41))))))\n (Def\n (Label id)\n ((args\n ((f.1 (Function (Integer) Integer))))\n (ret (Function (Integer) Integer))\n (body (Var f.1))))\n (Def\n (Label inc)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))))\n", + "tc1b": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Apply\n (Apply\n (FunRef (Label id) 1)\n ((FunRef (Label inc) 1)))\n ((Int 41))))))\n (Def\n (Label id)\n ((args\n ((f.1 (Function (Integer) Integer))))\n (ret (Function (Integer) Integer))\n (body (Var f.1))))\n (Def\n (Label inc)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))))\n", + "ea": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Apply\n (Apply\n (FunRef (Label id) 1)\n ((FunRef (Label inc) 1)))\n ((Int 41))))))\n (Def\n (Label id)\n ((args\n ((f.1 (Function (Integer) Integer))))\n (ret (Function (Integer) Integer))\n (body (Var f.1))))\n (Def\n (Label inc)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))))\n", + "ug": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Apply\n (Apply\n (FunRef (Label id) 1)\n ((FunRef (Label inc) 1)))\n ((Int 41))))))\n (Def\n (Label id)\n ((args\n ((f.1 (Function (Integer) Integer))))\n (ret (Function (Integer) Integer))\n (body (Var f.1))))\n (Def\n (Label inc)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))))\n", + "rc": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Let\n $tmp.2\n (FunRef (Label id) 1)\n (Let\n $tmp.1\n (FunRef (Label inc) 1)\n (Let\n $tmp.3\n (Apply (Var $tmp.2) ((Var $tmp.1)))\n (Apply (Var $tmp.3) ((Int 41)))))))))\n (Def\n (Label id)\n ((args\n ((f.1 (Function (Integer) Integer))))\n (ret (Function (Integer) Integer))\n (body (Atm (Var f.1)))))\n (Def\n (Label inc)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))))\n", + "ec": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals ())\n (body\n (((Label start)\n (Seq\n (Assign $tmp.2 (FunRef (Label id) 1))\n (Seq\n (Assign $tmp.1 (FunRef (Label inc) 1))\n (Seq\n (Assign\n $tmp.3\n (Call (Var $tmp.2) ((Var $tmp.1))))\n (TailCall (Var $tmp.3) ((Int 41)))))))))))\n (Def\n (Label id)\n ((args\n ((f.1 (Function (Integer) Integer))))\n (ret (Function (Integer) Integer))\n (locals ())\n (body\n (((Label start) (Return (Atm (Var f.1))))))))\n (Def\n (Label inc)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals ())\n (body\n (((Label start)\n (Return (Prim Add ((Var x.1) (Int 1)))))))))))\n", + "tc2": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2\n (Function\n ((Function (Integer) Integer))\n (Function (Integer) Integer)))\n ($tmp.3 (Function (Integer) Integer))\n (id\n (Function\n ((Function (Integer) Integer))\n (Function (Integer) Integer)))\n (inc (Function (Integer) Integer))))\n (body\n (((Label start)\n (Seq\n (Assign $tmp.2 (FunRef (Label id) 1))\n (Seq\n (Assign $tmp.1 (FunRef (Label inc) 1))\n (Seq\n (Assign\n $tmp.3\n (Call (Var $tmp.2) ((Var $tmp.1))))\n (TailCall (Var $tmp.3) ((Int 41)))))))))))\n (Def\n (Label id)\n ((args\n ((f.1 (Function (Integer) Integer))))\n (ret (Function (Integer) Integer))\n (locals\n ((f.1 (Function (Integer) Integer))))\n (body\n (((Label start) (Return (Atm (Var f.1))))))))\n (Def\n (Label inc)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals ((x.1 Integer)))\n (body\n (((Label start)\n (Return (Prim Add ((Var x.1) (Int 1)))))))))))\n", + "ru": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2\n (Function\n ((Function (Integer) Integer))\n (Function (Integer) Integer)))\n ($tmp.3 (Function (Integer) Integer))\n (id\n (Function\n ((Function (Integer) Integer))\n (Function (Integer) Integer)))\n (inc (Function (Integer) Integer))))\n (body\n (((Label start)\n (Seq\n (Assign $tmp.2 (FunRef (Label id) 1))\n (Seq\n (Assign $tmp.1 (FunRef (Label inc) 1))\n (Seq\n (Assign\n $tmp.3\n (Call (Var $tmp.2) ((Var $tmp.1))))\n (TailCall (Var $tmp.3) ((Int 41)))))))))))\n (Def\n (Label id)\n ((args\n ((f.1 (Function (Integer) Integer))))\n (ret (Function (Integer) Integer))\n (locals\n ((f.1 (Function (Integer) Integer))))\n (body\n (((Label start) (Return (Atm (Var f.1))))))))\n (Def\n (Label inc)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals ((x.1 Integer)))\n (body\n (((Label start)\n (Return (Prim Add ((Var x.1) (Int 1)))))))))))\n", + "si": "(X86Program\n ((Def\n (Label main)\n Finfo1\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2\n (Function\n ((Function (Integer) Integer))\n (Function (Integer) Integer)))\n ($tmp.3 (Function (Integer) Integer))\n (id\n (Function\n ((Function (Integer) Integer))\n (Function (Integer) Integer)))\n (inc (Function (Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label id))\n (Var $tmp.2))\n (Leaq\n (GlobalArg (Label inc))\n (Var $tmp.1))\n (Movq (Var $tmp.1) (Reg Rdi))\n (IndirectCallq (Var $tmp.2) 1)\n (Movq (Reg Rax) (Var $tmp.3))\n (Movq (Imm 41) (Reg Rdi))\n (TailJmp (Var $tmp.3) 1))))))))\n (Def\n (Label id)\n Finfo1\n ((nparams 1)\n (locals\n ((f.1 (Function (Integer) Integer))\n (f.1 (Function (Integer) Integer))))\n (body\n (((Label id_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var f.1))\n (Movq (Var f.1) (Reg Rax))\n (Jmp (Label id_conclusion)))))))))\n (Def\n (Label inc)\n Finfo1\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label inc_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var x.1))\n (Movq (Var x.1) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label inc_conclusion)))))))))))\n", + "ul": "(X86Program\n ((Def\n (Label main)\n Finfo1\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2\n (Function\n ((Function (Integer) Integer))\n (Function (Integer) Integer)))\n ($tmp.3 (Function (Integer) Integer))\n (id\n (Function\n ((Function (Integer) Integer))\n (Function (Integer) Integer)))\n (inc (Function (Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n (Binfo2\n ((initial ())\n (afters\n (((VarL $tmp.2))\n ((VarL $tmp.1) (VarL $tmp.2))\n ((VarL $tmp.2) (RegL Rdi))\n ((RegL Rax))\n ((VarL $tmp.3))\n ((VarL $tmp.3) (RegL Rdi))\n ()))))\n ((Leaq\n (GlobalArg (Label id))\n (Var $tmp.2))\n (Leaq\n (GlobalArg (Label inc))\n (Var $tmp.1))\n (Movq (Var $tmp.1) (Reg Rdi))\n (IndirectCallq (Var $tmp.2) 1)\n (Movq (Reg Rax) (Var $tmp.3))\n (Movq (Imm 41) (Reg Rdi))\n (TailJmp (Var $tmp.3) 1))))))))\n (Def\n (Label id)\n Finfo1\n ((nparams 1)\n (locals\n ((f.1 (Function (Integer) Integer))\n (f.1 (Function (Integer) Integer))))\n (body\n (((Label id_start)\n (Block\n (Binfo2\n ((initial ((RegL Rsp) (RegL Rdi)))\n (afters\n (((VarL f.1) (RegL Rsp))\n ((RegL Rsp) (RegL Rax))\n ()))))\n ((Movq (Reg Rdi) (Var f.1))\n (Movq (Var f.1) (Reg Rax))\n (Jmp (Label id_conclusion)))))))))\n (Def\n (Label inc)\n Finfo1\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label inc_start)\n (Block\n (Binfo2\n ((initial ((RegL Rsp) (RegL Rdi)))\n (afters\n (((VarL x.1) (RegL Rsp))\n ((RegL Rsp) (RegL Rax))\n ((RegL Rsp) (RegL Rax))\n ()))))\n ((Movq (Reg Rdi) (Var x.1))\n (Movq (Var x.1) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label inc_conclusion)))))))))))\n", + "bi": "(X86Program\n ((Def\n (Label main)\n (Finfo2\n (conflicts\n (((VarL $tmp.1) ((VarL $tmp.2)))\n ((VarL $tmp.2)\n ((VarL $tmp.1) (RegL Rdi)))\n ((VarL $tmp.3) ((RegL Rdi)))\n ((VarL id) ((RegL Rsp)))\n ((VarL inc) ((RegL Rsp)))\n ((RegL Rsp) ((VarL id) (VarL inc)))\n ((RegL Rax)\n ((RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)))\n ((RegL Rcx) ((RegL Rax)))\n ((RegL Rdx) ((RegL Rax)))\n ((RegL Rsi) ((RegL Rax)))\n ((RegL Rdi)\n ((VarL $tmp.2) (VarL $tmp.3) (RegL Rax)))\n ((RegL R8) ((RegL Rax)))\n ((RegL R9) ((RegL Rax)))\n ((RegL R10) ((RegL Rax)))\n ((RegL R11) ((RegL Rax))))))\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2\n (Function\n ((Function (Integer) Integer))\n (Function (Integer) Integer)))\n ($tmp.3 (Function (Integer) Integer))\n (id\n (Function\n ((Function (Integer) Integer))\n (Function (Integer) Integer)))\n (inc (Function (Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label id))\n (Var $tmp.2))\n (Leaq\n (GlobalArg (Label inc))\n (Var $tmp.1))\n (Movq (Var $tmp.1) (Reg Rdi))\n (IndirectCallq (Var $tmp.2) 1)\n (Movq (Reg Rax) (Var $tmp.3))\n (Movq (Imm 41) (Reg Rdi))\n (TailJmp (Var $tmp.3) 1))))))))\n (Def\n (Label id)\n (Finfo2\n (conflicts\n (((VarL f.1) ((RegL Rsp)))\n ((RegL Rsp) ((VarL f.1) (RegL Rax)))\n ((RegL Rax) ((RegL Rsp))))))\n ((nparams 1)\n (locals\n ((f.1 (Function (Integer) Integer))\n (f.1 (Function (Integer) Integer))))\n (body\n (((Label id_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var f.1))\n (Movq (Var f.1) (Reg Rax))\n (Jmp (Label id_conclusion)))))))))\n (Def\n (Label inc)\n (Finfo2\n (conflicts\n (((VarL x.1) ((RegL Rsp)))\n ((RegL Rsp) ((VarL x.1) (RegL Rax)))\n ((RegL Rax) ((RegL Rsp))))))\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label inc_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var x.1))\n (Movq (Var x.1) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label inc_conclusion)))))))))))\n", + "ar": "(X86Program\n ((Def\n (Label main)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2\n (Function\n ((Function (Integer) Integer))\n (Function (Integer) Integer)))\n ($tmp.3 (Function (Integer) Integer))\n (id\n (Function\n ((Function (Integer) Integer))\n (Function (Integer) Integer)))\n (inc (Function (Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n Binfo1\n ((Leaq (GlobalArg (Label id)) (Reg Rcx))\n (Leaq (GlobalArg (Label inc)) (Reg Rdx))\n (Movq (Reg Rdx) (Reg Rdi))\n (IndirectCallq (Reg Rcx) 1)\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 41) (Reg Rdi))\n (TailJmp (Reg Rcx) 1))))))))\n (Def\n (Label id)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals\n ((f.1 (Function (Integer) Integer))\n (f.1 (Function (Integer) Integer))))\n (body\n (((Label id_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Jmp (Label id_conclusion)))))))))\n (Def\n (Label inc)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label inc_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label inc_conclusion)))))))))))\n", + "rj": "(X86Program\n ((Def\n (Label main)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2\n (Function\n ((Function (Integer) Integer))\n (Function (Integer) Integer)))\n ($tmp.3 (Function (Integer) Integer))\n (id\n (Function\n ((Function (Integer) Integer))\n (Function (Integer) Integer)))\n (inc (Function (Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n Binfo1\n ((Leaq (GlobalArg (Label id)) (Reg Rcx))\n (Leaq (GlobalArg (Label inc)) (Reg Rdx))\n (Movq (Reg Rdx) (Reg Rdi))\n (IndirectCallq (Reg Rcx) 1)\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 41) (Reg Rdi))\n (TailJmp (Reg Rcx) 1))))))))\n (Def\n (Label id)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals\n ((f.1 (Function (Integer) Integer))\n (f.1 (Function (Integer) Integer))))\n (body\n (((Label id_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Jmp (Label id_conclusion)))))))))\n (Def\n (Label inc)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label inc_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label inc_conclusion)))))))))))\n", + "pi": "(X86Program\n ((Def\n (Label main)\n (Finfo\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1 (Function (Integer) Integer))\n ($tmp.2\n (Function\n ((Function (Integer) Integer))\n (Function (Integer) Integer)))\n ($tmp.3 (Function (Integer) Integer))\n (id\n (Function\n ((Function (Integer) Integer))\n (Function (Integer) Integer)))\n (inc (Function (Integer) Integer))))\n (body\n (((Label main_start)\n (Block\n ((Leaq (GlobalArg (Label id)) (Reg Rcx))\n (Leaq (GlobalArg (Label inc)) (Reg Rdx))\n (Movq (Reg Rdx) (Reg Rdi))\n (IndirectCallq (Reg Rcx) 1)\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 41) (Reg Rdi))\n (Movq (Reg Rcx) (Reg Rax))\n (TailJmp (Reg Rax) 1))))))))\n (Def\n (Label id)\n (Finfo\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals\n ((f.1 (Function (Integer) Integer))\n (f.1 (Function (Integer) Integer))))\n (body\n (((Label id_start)\n (Block\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Jmp (Label id_conclusion)))))))))\n (Def\n (Label inc)\n (Finfo\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label inc_start)\n (Block\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label inc_conclusion)))))))))))\n", + "pc": "(X86Program\n ((Label main_start)\n (Leaq\n (GlobalArg Rip (Label id))\n (Reg Rcx))\n (Leaq\n (GlobalArg Rip (Label inc))\n (Reg Rdx))\n (Movq (Reg Rdx) (Reg Rdi))\n (IndirectCallq (Reg Rcx))\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 41) (Reg Rdi))\n (Movq (Reg Rcx) (Reg Rax))\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n (TailJmp (Reg Rax))\n (Global (Label main))\n (Align 8)\n (Label main)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Subq (Imm 0) (Reg Rsp))\n (Movq (Imm 65536) (Reg Rdi))\n (Movq (Imm 65536) (Reg Rsi))\n (Callq (Label initialize))\n (Movq\n (GlobalArg Rip (Label rootstack_begin))\n (Reg R15))\n (Addq (Imm 0) (Reg R15))\n (Jmp (Label main_start))\n (Label main_conclusion)\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n Retq\n (Label id_start)\n (Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Jmp (Label id_conclusion))\n (Global (Label id))\n (Align 8)\n (Label id)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Subq (Imm 0) (Reg Rsp))\n (Addq (Imm 0) (Reg R15))\n (Jmp (Label id_start))\n (Label id_conclusion)\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n Retq\n (Label inc_start)\n (Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label inc_conclusion))\n (Global (Label inc))\n (Align 8)\n (Label inc)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Subq (Imm 0) (Reg Rsp))\n (Addq (Imm 0) (Reg R15))\n (Jmp (Label inc_start))\n (Label inc_conclusion)\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n Retq))\n", + "opt": "(X86Program\n ((Label main_start)\n (Leaq\n (GlobalArg Rip (Label id))\n (Reg Rcx))\n (Leaq\n (GlobalArg Rip (Label inc))\n (Reg Rdx))\n (Movq (Reg Rdx) (Reg Rdi))\n (IndirectCallq (Reg Rcx))\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 41) (Reg Rdi))\n (Movq (Reg Rcx) (Reg Rax))\n (Popq (Reg Rbp))\n (TailJmp (Reg Rax))\n (Global (Label main))\n (Align 8)\n (Label main)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Movq (Imm 65536) (Reg Rdi))\n (Movq (Imm 65536) (Reg Rsi))\n (Callq (Label initialize))\n (Movq\n (GlobalArg Rip (Label rootstack_begin))\n (Reg R15))\n (Jmp (Label main_start))\n (Label main_conclusion)\n (Popq (Reg Rbp))\n Retq\n (Label id_start)\n (Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Jmp (Label id_conclusion))\n (Global (Label id))\n (Align 8)\n (Label id)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Jmp (Label id_start))\n (Label id_conclusion)\n (Popq (Reg Rbp))\n Retq\n (Label inc_start)\n (Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label inc_conclusion))\n (Global (Label inc))\n (Align 8)\n (Label inc)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Jmp (Label inc_start))\n (Label inc_conclusion)\n (Popq (Reg Rbp))\n Retq))\n", + "pa": "main_start:\n leaq id(%rip), %rcx\n leaq inc(%rip), %rdx\n movq %rdx, %rdi\n callq *%rcx\n movq %rax, %rcx\n movq $41, %rdi\n movq %rcx, %rax\n popq %rbp\n jmp *%rax\n\n .globl main\n .align 8\n\nmain:\n pushq %rbp\n movq %rsp, %rbp\n movq $65536, %rdi\n movq $65536, %rsi\n callq initialize\n movq rootstack_begin(%rip), %r15\n jmp main_start\n\nmain_conclusion:\n popq %rbp\n retq\n\nid_start:\n movq %rdi, %rcx\n movq %rcx, %rax\n jmp id_conclusion\n\n .globl id\n .align 8\n\nid:\n pushq %rbp\n movq %rsp, %rbp\n jmp id_start\n\nid_conclusion:\n popq %rbp\n retq\n\ninc_start:\n movq %rdi, %rcx\n movq %rcx, %rax\n addq $1, %rax\n jmp inc_conclusion\n\n .globl inc\n .align 8\n\ninc:\n pushq %rbp\n movq %rsp, %rbp\n jmp inc_start\n\ninc_conclusion:\n popq %rbp\n retq\n" + } + }, + { + "id": "functions_test_10", + "title": "Vectors + Map", + "description": "Map over a vector with a higher-order function", + "source": ";; OUTPUT: 42\n\n(define (map_vec (f : (Integer -> Integer)) (v : (Vector Integer Integer)))\n : (Vector Integer Integer)\n (vector (f (vector-ref v 0)) (f (vector-ref v 1))))\n\n(define (add1 (x : Integer)) : Integer (+ x 1))\n\n(vector-ref (map_vec add1 (vector 0 41)) 1)\n", + "passOutputs": { + "lfun": "(Program\n ((Def\n map_vec\n ((args\n ((f (Function (Integer) Integer))\n (v (Vector (Integer Integer)))))\n (ret (Vector (Integer Integer)))\n (body\n (Vec\n ((Apply (Var f) ((VecRef (Var v) 0)))\n (Apply (Var f) ((VecRef (Var v) 1))))\n ()))))\n (Def\n add1\n ((args ((x Integer)))\n (ret Integer)\n (body (Prim Add ((Var x) (Int 1)))))))\n (VecRef\n (Apply\n (Var map_vec)\n ((Var add1) (Vec ((Int 0) (Int 41)) ())))\n 1))\n", + "tc1": "(Program\n ((Def\n map_vec\n ((args\n ((f (Function (Integer) Integer))\n (v (Vector (Integer Integer)))))\n (ret (Vector (Integer Integer)))\n (body\n (Vec\n ((Apply (Var f) ((VecRef (Var v) 0)))\n (Apply (Var f) ((VecRef (Var v) 1))))\n ((Vector (Integer Integer)))))))\n (Def\n add1\n ((args ((x Integer)))\n (ret Integer)\n (body (Prim Add ((Var x) (Int 1)))))))\n (VecRef\n (Apply\n (Var map_vec)\n ((Var add1)\n (Vec\n ((Int 0) (Int 41))\n ((Vector (Integer Integer))))))\n 1))\n", + "sh": "(Program\n ((Def\n main\n ((args ())\n (ret Integer)\n (body\n (VecRef\n (Apply\n (Var map_vec)\n ((Var add1)\n (Vec\n ((Int 0) (Int 41))\n ((Vector (Integer Integer))))))\n 1))))\n (Def\n map_vec\n ((args\n ((f (Function (Integer) Integer))\n (v (Vector (Integer Integer)))))\n (ret (Vector (Integer Integer)))\n (body\n (Vec\n ((Apply (Var f) ((VecRef (Var v) 0)))\n (Apply (Var f) ((VecRef (Var v) 1))))\n ((Vector (Integer Integer)))))))\n (Def\n add1\n ((args ((x Integer)))\n (ret Integer)\n (body (Prim Add ((Var x) (Int 1))))))))\n", + "un": "(Program\n ((Def\n main\n ((args ())\n (ret Integer)\n (body\n (VecRef\n (Apply\n (Var map_vec)\n ((Var add1)\n (Vec\n ((Int 0) (Int 41))\n ((Vector (Integer Integer))))))\n 1))))\n (Def\n map_vec\n ((args\n ((f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (ret (Vector (Integer Integer)))\n (body\n (Vec\n ((Apply (Var f.1) ((VecRef (Var v.1) 0)))\n (Apply (Var f.1) ((VecRef (Var v.1) 1))))\n ((Vector (Integer Integer)))))))\n (Def\n add1\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))))\n", + "rf": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (VecRef\n (Apply\n (FunRef (Label map_vec) 2)\n ((FunRef (Label add1) 1)\n (Vec\n ((Int 0) (Int 41))\n ((Vector (Integer Integer))))))\n 1))))\n (Def\n (Label map_vec)\n ((args\n ((f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (ret (Vector (Integer Integer)))\n (body\n (Vec\n ((Apply (Var f.1) ((VecRef (Var v.1) 0)))\n (Apply (Var f.1) ((VecRef (Var v.1) 1))))\n ((Vector (Integer Integer)))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))))\n", + "lf": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (VecRef\n (Apply\n (FunRef (Label map_vec) 2)\n ((FunRef (Label add1) 1)\n (Vec\n ((Int 0) (Int 41))\n ((Vector (Integer Integer))))))\n 1))))\n (Def\n (Label map_vec)\n ((args\n ((f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (ret (Vector (Integer Integer)))\n (body\n (Vec\n ((Apply (Var f.1) ((VecRef (Var v.1) 0)))\n (Apply (Var f.1) ((VecRef (Var v.1) 1))))\n ((Vector (Integer Integer)))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))))\n", + "tc1b": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (VecRef\n (Apply\n (FunRef (Label map_vec) 2)\n ((FunRef (Label add1) 1)\n (Vec\n ((Int 0) (Int 41))\n ((Vector (Integer Integer))))))\n 1))))\n (Def\n (Label map_vec)\n ((args\n ((f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (ret (Vector (Integer Integer)))\n (body\n (Vec\n ((Apply (Var f.1) ((VecRef (Var v.1) 0)))\n (Apply (Var f.1) ((VecRef (Var v.1) 1))))\n ((Vector (Integer Integer)))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))))\n", + "ea": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (VecRef\n (Apply\n (FunRef (Label map_vec) 2)\n ((FunRef (Label add1) 1)\n (Let\n _.3\n (If\n (Prim\n Lt\n ((Prim\n Add\n ((GlobalVal free_ptr) (Int 24)))\n (GlobalVal fromspace_end)))\n Void\n (Collect 24))\n (Let\n $ea.1\n (Allocate 2 (Vector (Integer Integer)))\n (Let\n _.2\n (VecSet (Var $ea.1) 0 (Int 0))\n (Let\n _.1\n (VecSet (Var $ea.1) 1 (Int 41))\n (Var $ea.1)))))))\n 1))))\n (Def\n (Label map_vec)\n ((args\n ((f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (ret (Vector (Integer Integer)))\n (body\n (Let\n $ea.2\n (Apply (Var f.1) ((VecRef (Var v.1) 0)))\n (Let\n $ea.3\n (Apply (Var f.1) ((VecRef (Var v.1) 1)))\n (Let\n _.6\n (If\n (Prim\n Lt\n ((Prim\n Add\n ((GlobalVal free_ptr) (Int 24)))\n (GlobalVal fromspace_end)))\n Void\n (Collect 24))\n (Let\n $ea.4\n (Allocate 2 (Vector (Integer Integer)))\n (Let\n _.5\n (VecSet (Var $ea.4) 0 (Var $ea.2))\n (Let\n _.4\n (VecSet (Var $ea.4) 1 (Var $ea.3))\n (Var $ea.4))))))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))))\n", + "ug": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (VecRef\n (Apply\n (FunRef (Label map_vec) 2)\n ((FunRef (Label add1) 1)\n (Let\n _.3\n (If\n (Prim\n Lt\n ((Prim\n Add\n ((GlobalVal free_ptr) (Int 24)))\n (GlobalVal fromspace_end)))\n Void\n (Collect 24))\n (Let\n $ea.1\n (Allocate 2 (Vector (Integer Integer)))\n (Let\n _.2\n (VecSet (Var $ea.1) 0 (Int 0))\n (Let\n _.1\n (VecSet (Var $ea.1) 1 (Int 41))\n (Var $ea.1)))))))\n 1))))\n (Def\n (Label map_vec)\n ((args\n ((f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (ret (Vector (Integer Integer)))\n (body\n (Let\n $ea.2\n (Apply (Var f.1) ((VecRef (Var v.1) 0)))\n (Let\n $ea.3\n (Apply (Var f.1) ((VecRef (Var v.1) 1)))\n (Let\n _.6\n (If\n (Prim\n Lt\n ((Prim\n Add\n ((GlobalVal free_ptr) (Int 24)))\n (GlobalVal fromspace_end)))\n Void\n (Collect 24))\n (Let\n $ea.4\n (Allocate 2 (Vector (Integer Integer)))\n (Let\n _.5\n (VecSet (Var $ea.4) 0 (Var $ea.2))\n (Let\n _.4\n (VecSet (Var $ea.4) 1 (Var $ea.3))\n (Var $ea.4))))))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))))\n", + "rc": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Let\n $tmp.5\n (FunRef (Label map_vec) 2)\n (Let\n $tmp.1\n (FunRef (Label add1) 1)\n (Let\n _.3\n (If\n (Let\n $tmp.2\n (GlobalVal free_ptr)\n (Let\n $tmp.3\n (Prim Add ((Var $tmp.2) (Int 24)))\n (Let\n $tmp.4\n (GlobalVal fromspace_end)\n (Prim Lt ((Var $tmp.3) (Var $tmp.4))))))\n (Atm Void)\n (Collect 24))\n (Let\n $ea.1\n (Allocate 2 (Vector (Integer Integer)))\n (Let\n _.2\n (VecSet (Var $ea.1) 0 (Int 0))\n (Let\n _.1\n (VecSet (Var $ea.1) 1 (Int 41))\n (Let\n $tmp.6\n (Apply\n (Var $tmp.5)\n ((Var $tmp.1) (Var $ea.1)))\n (VecRef (Var $tmp.6) 1)))))))))))\n (Def\n (Label map_vec)\n ((args\n ((f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (ret (Vector (Integer Integer)))\n (body\n (Let\n $ea.2\n (Let\n $tmp.7\n (VecRef (Var v.1) 0)\n (Apply (Var f.1) ((Var $tmp.7))))\n (Let\n $ea.3\n (Let\n $tmp.8\n (VecRef (Var v.1) 1)\n (Apply (Var f.1) ((Var $tmp.8))))\n (Let\n _.6\n (If\n (Let\n $tmp.9\n (GlobalVal free_ptr)\n (Let\n $tmp.10\n (Prim Add ((Var $tmp.9) (Int 24)))\n (Let\n $tmp.11\n (GlobalVal fromspace_end)\n (Prim Lt ((Var $tmp.10) (Var $tmp.11))))))\n (Atm Void)\n (Collect 24))\n (Let\n $ea.4\n (Allocate 2 (Vector (Integer Integer)))\n (Let\n _.5\n (VecSet (Var $ea.4) 0 (Var $ea.2))\n (Let\n _.4\n (VecSet (Var $ea.4) 1 (Var $ea.3))\n (Atm (Var $ea.4)))))))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))))\n", + "ec": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals ())\n (body\n (((Label start)\n (Seq\n (Assign\n $tmp.5\n (FunRef (Label map_vec) 2))\n (Seq\n (Assign $tmp.1 (FunRef (Label add1) 1))\n (Seq\n (Assign $tmp.2 (GlobalVal free_ptr))\n (Seq\n (Assign\n $tmp.3\n (Prim Add ((Var $tmp.2) (Int 24))))\n (Seq\n (Assign\n $tmp.4\n (GlobalVal fromspace_end))\n (IfStmt\n (op Lt)\n (arg1 (Var $tmp.3))\n (arg2 (Var $tmp.4))\n (jump_then (Label block_2))\n (jump_else (Label block_3)))))))))\n ((Label block_1)\n (Seq\n (Assign\n $ea.1\n (Allocate 2 (Vector (Integer Integer))))\n (Seq\n (Assign\n _.2\n (VecSet (Var $ea.1) 0 (Int 0)))\n (Seq\n (Assign\n _.1\n (VecSet (Var $ea.1) 1 (Int 41)))\n (Seq\n (Assign\n $tmp.6\n (Call\n (Var $tmp.5)\n ((Var $tmp.1) (Var $ea.1))))\n (Return (VecRef (Var $tmp.6) 1)))))))\n ((Label block_2)\n (Seq\n (Assign _.3 (Atm Void))\n (Goto (Label block_1))))\n ((Label block_3)\n (Seq\n (Collect 24)\n (Goto (Label block_1))))))))\n (Def\n (Label map_vec)\n ((args\n ((f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (ret (Vector (Integer Integer)))\n (locals ())\n (body\n (((Label start)\n (Seq\n (Assign $tmp.7 (VecRef (Var v.1) 0))\n (Seq\n (Assign\n $ea.2\n (Call (Var f.1) ((Var $tmp.7))))\n (Seq\n (Assign $tmp.8 (VecRef (Var v.1) 1))\n (Seq\n (Assign\n $ea.3\n (Call (Var f.1) ((Var $tmp.8))))\n (Seq\n (Assign $tmp.9 (GlobalVal free_ptr))\n (Seq\n (Assign\n $tmp.10\n (Prim Add ((Var $tmp.9) (Int 24))))\n (Seq\n (Assign\n $tmp.11\n (GlobalVal fromspace_end))\n (IfStmt\n (op Lt)\n (arg1 (Var $tmp.10))\n (arg2 (Var $tmp.11))\n (jump_then (Label block_5))\n (jump_else (Label block_6)))))))))))\n ((Label block_4)\n (Seq\n (Assign\n $ea.4\n (Allocate 2 (Vector (Integer Integer))))\n (Seq\n (Assign\n _.5\n (VecSet (Var $ea.4) 0 (Var $ea.2)))\n (Seq\n (Assign\n _.4\n (VecSet (Var $ea.4) 1 (Var $ea.3)))\n (Return (Atm (Var $ea.4)))))))\n ((Label block_5)\n (Seq\n (Assign _.6 (Atm Void))\n (Goto (Label block_4))))\n ((Label block_6)\n (Seq\n (Collect 24)\n (Goto (Label block_4))))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals ())\n (body\n (((Label start)\n (Return (Prim Add ((Var x.1) (Int 1)))))))))))\n", + "tc2": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals\n (($ea.1 (Vector (Integer Integer)))\n ($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5\n (Function\n ((Function (Integer) Integer)\n (Vector (Integer Integer)))\n (Vector (Integer Integer))))\n ($tmp.6 (Vector (Integer Integer)))\n (_.1 Unit)\n (_.2 Unit)\n (_.3 Unit)\n (add1 (Function (Integer) Integer))\n (map_vec\n (Function\n ((Function (Integer) Integer)\n (Vector (Integer Integer)))\n (Vector (Integer Integer))))))\n (body\n (((Label start)\n (Seq\n (Assign\n $tmp.5\n (FunRef (Label map_vec) 2))\n (Seq\n (Assign $tmp.1 (FunRef (Label add1) 1))\n (Seq\n (Assign $tmp.2 (GlobalVal free_ptr))\n (Seq\n (Assign\n $tmp.3\n (Prim Add ((Var $tmp.2) (Int 24))))\n (Seq\n (Assign\n $tmp.4\n (GlobalVal fromspace_end))\n (IfStmt\n (op Lt)\n (arg1 (Var $tmp.3))\n (arg2 (Var $tmp.4))\n (jump_then (Label block_2))\n (jump_else (Label block_3)))))))))\n ((Label block_1)\n (Seq\n (Assign\n $ea.1\n (Allocate 2 (Vector (Integer Integer))))\n (Seq\n (Assign\n _.2\n (VecSet (Var $ea.1) 0 (Int 0)))\n (Seq\n (Assign\n _.1\n (VecSet (Var $ea.1) 1 (Int 41)))\n (Seq\n (Assign\n $tmp.6\n (Call\n (Var $tmp.5)\n ((Var $tmp.1) (Var $ea.1))))\n (Return (VecRef (Var $tmp.6) 1)))))))\n ((Label block_2)\n (Seq\n (Assign _.3 (Atm Void))\n (Goto (Label block_1))))\n ((Label block_3)\n (Seq\n (Collect 24)\n (Goto (Label block_1))))))))\n (Def\n (Label map_vec)\n ((args\n ((f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (ret (Vector (Integer Integer)))\n (locals\n (($ea.2 Integer)\n ($ea.3 Integer)\n ($ea.4 (Vector (Integer Integer)))\n ($tmp.10 Integer)\n ($tmp.11 Integer)\n ($tmp.7 Integer)\n ($tmp.8 Integer)\n ($tmp.9 Integer)\n (_.4 Unit)\n (_.5 Unit)\n (_.6 Unit)\n (f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (body\n (((Label start)\n (Seq\n (Assign $tmp.7 (VecRef (Var v.1) 0))\n (Seq\n (Assign\n $ea.2\n (Call (Var f.1) ((Var $tmp.7))))\n (Seq\n (Assign $tmp.8 (VecRef (Var v.1) 1))\n (Seq\n (Assign\n $ea.3\n (Call (Var f.1) ((Var $tmp.8))))\n (Seq\n (Assign $tmp.9 (GlobalVal free_ptr))\n (Seq\n (Assign\n $tmp.10\n (Prim Add ((Var $tmp.9) (Int 24))))\n (Seq\n (Assign\n $tmp.11\n (GlobalVal fromspace_end))\n (IfStmt\n (op Lt)\n (arg1 (Var $tmp.10))\n (arg2 (Var $tmp.11))\n (jump_then (Label block_5))\n (jump_else (Label block_6)))))))))))\n ((Label block_4)\n (Seq\n (Assign\n $ea.4\n (Allocate 2 (Vector (Integer Integer))))\n (Seq\n (Assign\n _.5\n (VecSet (Var $ea.4) 0 (Var $ea.2)))\n (Seq\n (Assign\n _.4\n (VecSet (Var $ea.4) 1 (Var $ea.3)))\n (Return (Atm (Var $ea.4)))))))\n ((Label block_5)\n (Seq\n (Assign _.6 (Atm Void))\n (Goto (Label block_4))))\n ((Label block_6)\n (Seq\n (Collect 24)\n (Goto (Label block_4))))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals ((x.1 Integer)))\n (body\n (((Label start)\n (Return (Prim Add ((Var x.1) (Int 1)))))))))))\n", + "ru": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals\n (($ea.1 (Vector (Integer Integer)))\n ($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5\n (Function\n ((Function (Integer) Integer)\n (Vector (Integer Integer)))\n (Vector (Integer Integer))))\n ($tmp.6 (Vector (Integer Integer)))\n (_.1 Unit)\n (_.2 Unit)\n (_.3 Unit)\n (add1 (Function (Integer) Integer))\n (map_vec\n (Function\n ((Function (Integer) Integer)\n (Vector (Integer Integer)))\n (Vector (Integer Integer))))))\n (body\n (((Label block_1)\n (Seq\n (Assign\n $ea.1\n (Allocate 2 (Vector (Integer Integer))))\n (Seq\n (Assign\n _.2\n (VecSet (Var $ea.1) 0 (Int 0)))\n (Seq\n (Assign\n _.1\n (VecSet (Var $ea.1) 1 (Int 41)))\n (Seq\n (Assign\n $tmp.6\n (Call\n (Var $tmp.5)\n ((Var $tmp.1) (Var $ea.1))))\n (Return (VecRef (Var $tmp.6) 1)))))))\n ((Label block_2)\n (Seq\n (Assign _.3 (Atm Void))\n (Goto (Label block_1))))\n ((Label block_3)\n (Seq\n (Collect 24)\n (Goto (Label block_1))))\n ((Label start)\n (Seq\n (Assign\n $tmp.5\n (FunRef (Label map_vec) 2))\n (Seq\n (Assign $tmp.1 (FunRef (Label add1) 1))\n (Seq\n (Assign $tmp.2 (GlobalVal free_ptr))\n (Seq\n (Assign\n $tmp.3\n (Prim Add ((Var $tmp.2) (Int 24))))\n (Seq\n (Assign\n $tmp.4\n (GlobalVal fromspace_end))\n (IfStmt\n (op Lt)\n (arg1 (Var $tmp.3))\n (arg2 (Var $tmp.4))\n (jump_then (Label block_2))\n (jump_else (Label block_3)))))))))))))\n (Def\n (Label map_vec)\n ((args\n ((f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (ret (Vector (Integer Integer)))\n (locals\n (($ea.2 Integer)\n ($ea.3 Integer)\n ($ea.4 (Vector (Integer Integer)))\n ($tmp.10 Integer)\n ($tmp.11 Integer)\n ($tmp.7 Integer)\n ($tmp.8 Integer)\n ($tmp.9 Integer)\n (_.4 Unit)\n (_.5 Unit)\n (_.6 Unit)\n (f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (body\n (((Label block_4)\n (Seq\n (Assign\n $ea.4\n (Allocate 2 (Vector (Integer Integer))))\n (Seq\n (Assign\n _.5\n (VecSet (Var $ea.4) 0 (Var $ea.2)))\n (Seq\n (Assign\n _.4\n (VecSet (Var $ea.4) 1 (Var $ea.3)))\n (Return (Atm (Var $ea.4)))))))\n ((Label block_5)\n (Seq\n (Assign _.6 (Atm Void))\n (Goto (Label block_4))))\n ((Label block_6)\n (Seq\n (Collect 24)\n (Goto (Label block_4))))\n ((Label start)\n (Seq\n (Assign $tmp.7 (VecRef (Var v.1) 0))\n (Seq\n (Assign\n $ea.2\n (Call (Var f.1) ((Var $tmp.7))))\n (Seq\n (Assign $tmp.8 (VecRef (Var v.1) 1))\n (Seq\n (Assign\n $ea.3\n (Call (Var f.1) ((Var $tmp.8))))\n (Seq\n (Assign $tmp.9 (GlobalVal free_ptr))\n (Seq\n (Assign\n $tmp.10\n (Prim Add ((Var $tmp.9) (Int 24))))\n (Seq\n (Assign\n $tmp.11\n (GlobalVal fromspace_end))\n (IfStmt\n (op Lt)\n (arg1 (Var $tmp.10))\n (arg2 (Var $tmp.11))\n (jump_then (Label block_5))\n (jump_else (Label block_6)))))))))))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals ((x.1 Integer)))\n (body\n (((Label start)\n (Return (Prim Add ((Var x.1) (Int 1)))))))))))\n", + "si": "(X86Program\n ((Def\n (Label main)\n Finfo1\n ((nparams 0)\n (locals\n (($ea.1 (Vector (Integer Integer)))\n ($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5\n (Function\n ((Function (Integer) Integer)\n (Vector (Integer Integer)))\n (Vector (Integer Integer))))\n ($tmp.6 (Vector (Integer Integer)))\n (_.1 Unit)\n (_.2 Unit)\n (_.3 Unit)\n (add1 (Function (Integer) Integer))\n (map_vec\n (Function\n ((Function (Integer) Integer)\n (Vector (Integer Integer)))\n (Vector (Integer Integer))))))\n (body\n (((Label block_1)\n (Block\n Binfo1\n ((Movq\n (GlobalArg (Label free_ptr))\n (Reg R11))\n (Addq\n (Imm 24)\n (GlobalArg (Label free_ptr)))\n (Movq (Imm 5) (Deref R11 0))\n (Movq (Reg R11) (Var $ea.1))\n (Movq (Var $ea.1) (Reg R11))\n (Movq (Imm 0) (Deref R11 8))\n (Movq (Imm 0) (Var _.2))\n (Movq (Var $ea.1) (Reg R11))\n (Movq (Imm 41) (Deref R11 16))\n (Movq (Imm 0) (Var _.1))\n (Movq (Var $tmp.1) (Reg Rdi))\n (Movq (Var $ea.1) (Reg Rsi))\n (IndirectCallq (Var $tmp.5) 2)\n (Movq (Reg Rax) (Var $tmp.6))\n (Movq (Var $tmp.6) (Reg R11))\n (Movq (Deref R11 16) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n Binfo1\n ((Movq (Imm 0) (Var _.3))\n (Jmp (Label block_1)))))\n ((Label block_3)\n (Block\n Binfo1\n ((Movq (Reg R15) (Reg Rdi))\n (Movq (Imm 24) (Reg Rsi))\n (Callq (Label collect) 2)\n (Jmp (Label block_1)))))\n ((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label map_vec))\n (Var $tmp.5))\n (Leaq\n (GlobalArg (Label add1))\n (Var $tmp.1))\n (Movq\n (GlobalArg (Label free_ptr))\n (Var $tmp.2))\n (Movq (Var $tmp.2) (Var $tmp.3))\n (Addq (Imm 24) (Var $tmp.3))\n (Movq\n (GlobalArg (Label fromspace_end))\n (Var $tmp.4))\n (Cmpq (Var $tmp.4) (Var $tmp.3))\n (JmpIf CC_l (Label block_2))\n (Jmp (Label block_3)))))))))\n (Def\n (Label map_vec)\n Finfo1\n ((nparams 2)\n (locals\n ((f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))\n ($ea.2 Integer)\n ($ea.3 Integer)\n ($ea.4 (Vector (Integer Integer)))\n ($tmp.10 Integer)\n ($tmp.11 Integer)\n ($tmp.7 Integer)\n ($tmp.8 Integer)\n ($tmp.9 Integer)\n (_.4 Unit)\n (_.5 Unit)\n (_.6 Unit)\n (f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (body\n (((Label block_4)\n (Block\n Binfo1\n ((Movq\n (GlobalArg (Label free_ptr))\n (Reg R11))\n (Addq\n (Imm 24)\n (GlobalArg (Label free_ptr)))\n (Movq (Imm 5) (Deref R11 0))\n (Movq (Reg R11) (Var $ea.4))\n (Movq (Var $ea.4) (Reg R11))\n (Movq (Var $ea.2) (Deref R11 8))\n (Movq (Imm 0) (Var _.5))\n (Movq (Var $ea.4) (Reg R11))\n (Movq (Var $ea.3) (Deref R11 16))\n (Movq (Imm 0) (Var _.4))\n (Movq (Var $ea.4) (Reg Rax))\n (Jmp (Label map_vec_conclusion)))))\n ((Label block_5)\n (Block\n Binfo1\n ((Movq (Imm 0) (Var _.6))\n (Jmp (Label block_4)))))\n ((Label block_6)\n (Block\n Binfo1\n ((Movq (Reg R15) (Reg Rdi))\n (Movq (Imm 24) (Reg Rsi))\n (Callq (Label collect) 2)\n (Jmp (Label block_4)))))\n ((Label map_vec_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var f.1))\n (Movq (Reg Rsi) (Var v.1))\n (Movq (Var v.1) (Reg R11))\n (Movq (Deref R11 8) (Var $tmp.7))\n (Movq (Var $tmp.7) (Reg Rdi))\n (IndirectCallq (Var f.1) 1)\n (Movq (Reg Rax) (Var $ea.2))\n (Movq (Var v.1) (Reg R11))\n (Movq (Deref R11 16) (Var $tmp.8))\n (Movq (Var $tmp.8) (Reg Rdi))\n (IndirectCallq (Var f.1) 1)\n (Movq (Reg Rax) (Var $ea.3))\n (Movq\n (GlobalArg (Label free_ptr))\n (Var $tmp.9))\n (Movq (Var $tmp.9) (Var $tmp.10))\n (Addq (Imm 24) (Var $tmp.10))\n (Movq\n (GlobalArg (Label fromspace_end))\n (Var $tmp.11))\n (Cmpq (Var $tmp.11) (Var $tmp.10))\n (JmpIf CC_l (Label block_5))\n (Jmp (Label block_6)))))))))\n (Def\n (Label add1)\n Finfo1\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label add1_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var x.1))\n (Movq (Var x.1) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label add1_conclusion)))))))))))\n", + "ul": "(X86Program\n ((Def\n (Label main)\n Finfo1\n ((nparams 0)\n (locals\n (($ea.1 (Vector (Integer Integer)))\n ($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5\n (Function\n ((Function (Integer) Integer)\n (Vector (Integer Integer)))\n (Vector (Integer Integer))))\n ($tmp.6 (Vector (Integer Integer)))\n (_.1 Unit)\n (_.2 Unit)\n (_.3 Unit)\n (add1 (Function (Integer) Integer))\n (map_vec\n (Function\n ((Function (Integer) Integer)\n (Vector (Integer Integer)))\n (Vector (Integer Integer))))))\n (body\n (((Label block_1)\n (Block\n (Binfo2\n ((initial\n ((VarL $tmp.1) (VarL $tmp.5) (RegL Rsp)))\n (afters\n (((VarL $tmp.1) (VarL $tmp.5) (RegL Rsp))\n ((VarL $tmp.1) (VarL $tmp.5) (RegL Rsp))\n ((VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL R11))\n ((VarL $ea.1)\n (VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp))\n ((VarL $ea.1)\n (VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp))\n ((VarL $ea.1)\n (VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp))\n ((VarL $ea.1)\n (VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp))\n ((VarL $ea.1)\n (VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp))\n ((VarL $ea.1)\n (VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp))\n ((VarL $ea.1)\n (VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp))\n ((VarL $ea.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL Rdi))\n ((VarL $tmp.5)\n (RegL Rsp)\n (RegL Rsi)\n (RegL Rdi))\n ((RegL Rsp) (RegL Rax))\n ((VarL $tmp.6) (RegL Rsp))\n ((RegL Rsp) (RegL R11))\n ((RegL Rsp) (RegL Rax))\n ()))))\n ((Movq\n (GlobalArg (Label free_ptr))\n (Reg R11))\n (Addq\n (Imm 24)\n (GlobalArg (Label free_ptr)))\n (Movq (Imm 5) (Deref R11 0))\n (Movq (Reg R11) (Var $ea.1))\n (Movq (Var $ea.1) (Reg R11))\n (Movq (Imm 0) (Deref R11 8))\n (Movq (Imm 0) (Var _.2))\n (Movq (Var $ea.1) (Reg R11))\n (Movq (Imm 41) (Deref R11 16))\n (Movq (Imm 0) (Var _.1))\n (Movq (Var $tmp.1) (Reg Rdi))\n (Movq (Var $ea.1) (Reg Rsi))\n (IndirectCallq (Var $tmp.5) 2)\n (Movq (Reg Rax) (Var $tmp.6))\n (Movq (Var $tmp.6) (Reg R11))\n (Movq (Deref R11 16) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n (Binfo2\n ((initial\n ((VarL $tmp.1) (VarL $tmp.5) (RegL Rsp)))\n (afters\n (((VarL $tmp.1) (VarL $tmp.5) (RegL Rsp))\n ()))))\n ((Movq (Imm 0) (Var _.3))\n (Jmp (Label block_1)))))\n ((Label block_3)\n (Block\n (Binfo2\n ((initial\n ((VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL R15)))\n (afters\n (((VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL Rdi))\n ((VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL Rsi)\n (RegL Rdi))\n ((VarL $tmp.1) (VarL $tmp.5) (RegL Rsp))\n ()))))\n ((Movq (Reg R15) (Reg Rdi))\n (Movq (Imm 24) (Reg Rsi))\n (Callq (Label collect) 2)\n (Jmp (Label block_1)))))\n ((Label main_start)\n (Block\n (Binfo2\n ((initial ((RegL Rsp) (RegL R15)))\n (afters\n (((VarL $tmp.5) (RegL Rsp) (RegL R15))\n ((VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL R15))\n ((VarL $tmp.1)\n (VarL $tmp.2)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL R15))\n ((VarL $tmp.1)\n (VarL $tmp.3)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL R15))\n ((VarL $tmp.1)\n (VarL $tmp.3)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL R15))\n ((VarL $tmp.1)\n (VarL $tmp.3)\n (VarL $tmp.4)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL R15))\n ((VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL R15)\n (RegL Rflags))\n ((VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL R15))\n ()))))\n ((Leaq\n (GlobalArg (Label map_vec))\n (Var $tmp.5))\n (Leaq\n (GlobalArg (Label add1))\n (Var $tmp.1))\n (Movq\n (GlobalArg (Label free_ptr))\n (Var $tmp.2))\n (Movq (Var $tmp.2) (Var $tmp.3))\n (Addq (Imm 24) (Var $tmp.3))\n (Movq\n (GlobalArg (Label fromspace_end))\n (Var $tmp.4))\n (Cmpq (Var $tmp.4) (Var $tmp.3))\n (JmpIf CC_l (Label block_2))\n (Jmp (Label block_3)))))))))\n (Def\n (Label map_vec)\n Finfo1\n ((nparams 2)\n (locals\n ((f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))\n ($ea.2 Integer)\n ($ea.3 Integer)\n ($ea.4 (Vector (Integer Integer)))\n ($tmp.10 Integer)\n ($tmp.11 Integer)\n ($tmp.7 Integer)\n ($tmp.8 Integer)\n ($tmp.9 Integer)\n (_.4 Unit)\n (_.5 Unit)\n (_.6 Unit)\n (f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (body\n (((Label block_4)\n (Block\n (Binfo2\n ((initial\n ((VarL $ea.2) (VarL $ea.3) (RegL Rsp)))\n (afters\n (((VarL $ea.2) (VarL $ea.3) (RegL Rsp))\n ((VarL $ea.2) (VarL $ea.3) (RegL Rsp))\n ((VarL $ea.2)\n (VarL $ea.3)\n (RegL Rsp)\n (RegL R11))\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL $ea.4)\n (RegL Rsp))\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL $ea.4)\n (RegL Rsp))\n ((VarL $ea.3) (VarL $ea.4) (RegL Rsp))\n ((VarL $ea.3) (VarL $ea.4) (RegL Rsp))\n ((VarL $ea.3) (VarL $ea.4) (RegL Rsp))\n ((VarL $ea.4) (RegL Rsp))\n ((VarL $ea.4) (RegL Rsp))\n ((RegL Rsp) (RegL Rax))\n ()))))\n ((Movq\n (GlobalArg (Label free_ptr))\n (Reg R11))\n (Addq\n (Imm 24)\n (GlobalArg (Label free_ptr)))\n (Movq (Imm 5) (Deref R11 0))\n (Movq (Reg R11) (Var $ea.4))\n (Movq (Var $ea.4) (Reg R11))\n (Movq (Var $ea.2) (Deref R11 8))\n (Movq (Imm 0) (Var _.5))\n (Movq (Var $ea.4) (Reg R11))\n (Movq (Var $ea.3) (Deref R11 16))\n (Movq (Imm 0) (Var _.4))\n (Movq (Var $ea.4) (Reg Rax))\n (Jmp (Label map_vec_conclusion)))))\n ((Label block_5)\n (Block\n (Binfo2\n ((initial\n ((VarL $ea.2) (VarL $ea.3) (RegL Rsp)))\n (afters\n (((VarL $ea.2) (VarL $ea.3) (RegL Rsp))\n ()))))\n ((Movq (Imm 0) (Var _.6))\n (Jmp (Label block_4)))))\n ((Label block_6)\n (Block\n (Binfo2\n ((initial\n ((VarL $ea.2)\n (VarL $ea.3)\n (RegL Rsp)\n (RegL R15)))\n (afters\n (((VarL $ea.2)\n (VarL $ea.3)\n (RegL Rsp)\n (RegL Rdi))\n ((VarL $ea.2)\n (VarL $ea.3)\n (RegL Rsp)\n (RegL Rsi)\n (RegL Rdi))\n ((VarL $ea.2) (VarL $ea.3) (RegL Rsp))\n ()))))\n ((Movq (Reg R15) (Reg Rdi))\n (Movq (Imm 24) (Reg Rsi))\n (Callq (Label collect) 2)\n (Jmp (Label block_4)))))\n ((Label map_vec_start)\n (Block\n (Binfo2\n ((initial\n ((RegL Rsp)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R15)))\n (afters\n (((VarL f.1)\n (RegL Rsp)\n (RegL Rsi)\n (RegL R15))\n ((VarL f.1)\n (VarL v.1)\n (RegL Rsp)\n (RegL R15))\n ((VarL f.1)\n (VarL v.1)\n (RegL Rsp)\n (RegL R11)\n (RegL R15))\n ((VarL $tmp.7)\n (VarL f.1)\n (VarL v.1)\n (RegL Rsp)\n (RegL R15))\n ((VarL f.1)\n (VarL v.1)\n (RegL Rsp)\n (RegL Rdi)\n (RegL R15))\n ((VarL f.1)\n (VarL v.1)\n (RegL Rsp)\n (RegL Rax)\n (RegL R15))\n ((VarL $ea.2)\n (VarL f.1)\n (VarL v.1)\n (RegL Rsp)\n (RegL R15))\n ((VarL $ea.2)\n (VarL f.1)\n (RegL Rsp)\n (RegL R11)\n (RegL R15))\n ((VarL $ea.2)\n (VarL $tmp.8)\n (VarL f.1)\n (RegL Rsp)\n (RegL R15))\n ((VarL $ea.2)\n (VarL f.1)\n (RegL Rsp)\n (RegL Rdi)\n (RegL R15))\n ((VarL $ea.2)\n (RegL Rsp)\n (RegL Rax)\n (RegL R15))\n ((VarL $ea.2)\n (VarL $ea.3)\n (RegL Rsp)\n (RegL R15))\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL $tmp.9)\n (RegL Rsp)\n (RegL R15))\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL $tmp.10)\n (RegL Rsp)\n (RegL R15))\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL $tmp.10)\n (RegL Rsp)\n (RegL R15))\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL $tmp.10)\n (VarL $tmp.11)\n (RegL Rsp)\n (RegL R15))\n ((VarL $ea.2)\n (VarL $ea.3)\n (RegL Rsp)\n (RegL R15)\n (RegL Rflags))\n ((VarL $ea.2)\n (VarL $ea.3)\n (RegL Rsp)\n (RegL R15))\n ()))))\n ((Movq (Reg Rdi) (Var f.1))\n (Movq (Reg Rsi) (Var v.1))\n (Movq (Var v.1) (Reg R11))\n (Movq (Deref R11 8) (Var $tmp.7))\n (Movq (Var $tmp.7) (Reg Rdi))\n (IndirectCallq (Var f.1) 1)\n (Movq (Reg Rax) (Var $ea.2))\n (Movq (Var v.1) (Reg R11))\n (Movq (Deref R11 16) (Var $tmp.8))\n (Movq (Var $tmp.8) (Reg Rdi))\n (IndirectCallq (Var f.1) 1)\n (Movq (Reg Rax) (Var $ea.3))\n (Movq\n (GlobalArg (Label free_ptr))\n (Var $tmp.9))\n (Movq (Var $tmp.9) (Var $tmp.10))\n (Addq (Imm 24) (Var $tmp.10))\n (Movq\n (GlobalArg (Label fromspace_end))\n (Var $tmp.11))\n (Cmpq (Var $tmp.11) (Var $tmp.10))\n (JmpIf CC_l (Label block_5))\n (Jmp (Label block_6)))))))))\n (Def\n (Label add1)\n Finfo1\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label add1_start)\n (Block\n (Binfo2\n ((initial ((RegL Rsp) (RegL Rdi)))\n (afters\n (((VarL x.1) (RegL Rsp))\n ((RegL Rsp) (RegL Rax))\n ((RegL Rsp) (RegL Rax))\n ()))))\n ((Movq (Reg Rdi) (Var x.1))\n (Movq (Var x.1) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label add1_conclusion)))))))))))\n", + "bi": "(X86Program\n ((Def\n (Label main)\n (Finfo2\n (conflicts\n (((VarL $ea.1)\n ((VarL $tmp.1)\n (VarL $tmp.5)\n (VarL _.1)\n (VarL _.2)\n (RegL Rsp)\n (RegL Rdi)\n (RegL R11)))\n ((VarL $tmp.1)\n ((VarL $ea.1)\n (VarL $tmp.2)\n (VarL $tmp.3)\n (VarL $tmp.4)\n (VarL $tmp.5)\n (VarL _.1)\n (VarL _.2)\n (VarL _.3)\n (RegL Rsp)\n (RegL Rax)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)\n (RegL R15)\n (RegL Rflags)))\n ((VarL $tmp.2)\n ((VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL R15)))\n ((VarL $tmp.3)\n ((VarL $tmp.1)\n (VarL $tmp.4)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL R15)))\n ((VarL $tmp.4)\n ((VarL $tmp.1)\n (VarL $tmp.3)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL R15)))\n ((VarL $tmp.5)\n ((VarL $ea.1)\n (VarL $tmp.1)\n (VarL $tmp.2)\n (VarL $tmp.3)\n (VarL $tmp.4)\n (VarL _.1)\n (VarL _.2)\n (VarL _.3)\n (RegL Rsp)\n (RegL Rax)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)\n (RegL R15)\n (RegL Rflags)))\n ((VarL $tmp.6) ((RegL Rsp)))\n ((VarL _.1)\n ((VarL $ea.1)\n (VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)))\n ((VarL _.2)\n ((VarL $ea.1)\n (VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)))\n ((VarL _.3)\n ((VarL $tmp.1) (VarL $tmp.5) (RegL Rsp)))\n ((VarL add1) ((RegL Rsp)))\n ((VarL map_vec) ((RegL Rsp)))\n ((RegL Rsp)\n ((VarL $ea.1)\n (VarL $tmp.1)\n (VarL $tmp.2)\n (VarL $tmp.3)\n (VarL $tmp.4)\n (VarL $tmp.5)\n (VarL $tmp.6)\n (VarL _.1)\n (VarL _.2)\n (VarL _.3)\n (VarL add1)\n (VarL map_vec)\n (RegL Rax)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)\n (RegL Rflags)))\n ((RegL Rax)\n ((VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)))\n ((RegL Rcx)\n ((VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL Rax)))\n ((RegL Rdx)\n ((VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL Rax)))\n ((RegL Rsi)\n ((VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL Rax)\n (RegL Rdi)))\n ((RegL Rdi)\n ((VarL $ea.1)\n (VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL Rax)\n (RegL Rsi)))\n ((RegL R8)\n ((VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL Rax)))\n ((RegL R9)\n ((VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL Rax)))\n ((RegL R10)\n ((VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL Rax)))\n ((RegL R11)\n ((VarL $ea.1)\n (VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL Rax)))\n ((RegL R15)\n ((VarL $tmp.1)\n (VarL $tmp.2)\n (VarL $tmp.3)\n (VarL $tmp.4)\n (VarL $tmp.5)\n (RegL Rflags)))\n ((RegL Rflags)\n ((VarL $tmp.1)\n (VarL $tmp.5)\n (RegL Rsp)\n (RegL R15))))))\n ((nparams 0)\n (locals\n (($ea.1 (Vector (Integer Integer)))\n ($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5\n (Function\n ((Function (Integer) Integer)\n (Vector (Integer Integer)))\n (Vector (Integer Integer))))\n ($tmp.6 (Vector (Integer Integer)))\n (_.1 Unit)\n (_.2 Unit)\n (_.3 Unit)\n (add1 (Function (Integer) Integer))\n (map_vec\n (Function\n ((Function (Integer) Integer)\n (Vector (Integer Integer)))\n (Vector (Integer Integer))))))\n (body\n (((Label block_1)\n (Block\n Binfo1\n ((Movq\n (GlobalArg (Label free_ptr))\n (Reg R11))\n (Addq\n (Imm 24)\n (GlobalArg (Label free_ptr)))\n (Movq (Imm 5) (Deref R11 0))\n (Movq (Reg R11) (Var $ea.1))\n (Movq (Var $ea.1) (Reg R11))\n (Movq (Imm 0) (Deref R11 8))\n (Movq (Imm 0) (Var _.2))\n (Movq (Var $ea.1) (Reg R11))\n (Movq (Imm 41) (Deref R11 16))\n (Movq (Imm 0) (Var _.1))\n (Movq (Var $tmp.1) (Reg Rdi))\n (Movq (Var $ea.1) (Reg Rsi))\n (IndirectCallq (Var $tmp.5) 2)\n (Movq (Reg Rax) (Var $tmp.6))\n (Movq (Var $tmp.6) (Reg R11))\n (Movq (Deref R11 16) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n Binfo1\n ((Movq (Imm 0) (Var _.3))\n (Jmp (Label block_1)))))\n ((Label block_3)\n (Block\n Binfo1\n ((Movq (Reg R15) (Reg Rdi))\n (Movq (Imm 24) (Reg Rsi))\n (Callq (Label collect) 2)\n (Jmp (Label block_1)))))\n ((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label map_vec))\n (Var $tmp.5))\n (Leaq\n (GlobalArg (Label add1))\n (Var $tmp.1))\n (Movq\n (GlobalArg (Label free_ptr))\n (Var $tmp.2))\n (Movq (Var $tmp.2) (Var $tmp.3))\n (Addq (Imm 24) (Var $tmp.3))\n (Movq\n (GlobalArg (Label fromspace_end))\n (Var $tmp.4))\n (Cmpq (Var $tmp.4) (Var $tmp.3))\n (JmpIf CC_l (Label block_2))\n (Jmp (Label block_3)))))))))\n (Def\n (Label map_vec)\n (Finfo2\n (conflicts\n (((VarL $ea.2)\n ((VarL $ea.3)\n (VarL $ea.4)\n (VarL $tmp.10)\n (VarL $tmp.11)\n (VarL $tmp.8)\n (VarL $tmp.9)\n (VarL _.6)\n (VarL f.1)\n (VarL v.1)\n (RegL Rsp)\n (RegL Rax)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)\n (RegL R15)\n (RegL Rflags)))\n ((VarL $ea.3)\n ((VarL $ea.2)\n (VarL $ea.4)\n (VarL $tmp.10)\n (VarL $tmp.11)\n (VarL $tmp.9)\n (VarL _.5)\n (VarL _.6)\n (RegL Rsp)\n (RegL Rax)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)\n (RegL R15)\n (RegL Rflags)))\n ((VarL $ea.4)\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL _.4)\n (VarL _.5)\n (RegL Rsp)\n (RegL R11)))\n ((VarL $tmp.10)\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL $tmp.11)\n (RegL Rsp)\n (RegL R15)))\n ((VarL $tmp.11)\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL $tmp.10)\n (RegL Rsp)\n (RegL R15)))\n ((VarL $tmp.7)\n ((VarL f.1)\n (VarL v.1)\n (RegL Rsp)\n (RegL R15)))\n ((VarL $tmp.8)\n ((VarL $ea.2)\n (VarL f.1)\n (RegL Rsp)\n (RegL R15)))\n ((VarL $tmp.9)\n ((VarL $ea.2)\n (VarL $ea.3)\n (RegL Rsp)\n (RegL R15)))\n ((VarL _.4) ((VarL $ea.4) (RegL Rsp)))\n ((VarL _.5)\n ((VarL $ea.3) (VarL $ea.4) (RegL Rsp)))\n ((VarL _.6)\n ((VarL $ea.2) (VarL $ea.3) (RegL Rsp)))\n ((VarL f.1)\n ((VarL $ea.2)\n (VarL $tmp.7)\n (VarL $tmp.8)\n (VarL v.1)\n (RegL Rsp)\n (RegL Rax)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)\n (RegL R15)))\n ((VarL v.1)\n ((VarL $ea.2)\n (VarL $tmp.7)\n (VarL f.1)\n (RegL Rsp)\n (RegL Rax)\n (RegL Rbx)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)\n (RegL R12)\n (RegL R13)\n (RegL R14)\n (RegL R15)))\n ((RegL Rsp)\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL $ea.4)\n (VarL $tmp.10)\n (VarL $tmp.11)\n (VarL $tmp.7)\n (VarL $tmp.8)\n (VarL $tmp.9)\n (VarL _.4)\n (VarL _.5)\n (VarL _.6)\n (VarL f.1)\n (VarL v.1)\n (RegL Rax)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)\n (RegL Rflags)))\n ((RegL Rax)\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL f.1)\n (VarL v.1)\n (RegL Rsp)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)\n (RegL R15)))\n ((RegL Rbx) ((VarL v.1)))\n ((RegL Rcx)\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL f.1)\n (VarL v.1)\n (RegL Rsp)\n (RegL Rax)\n (RegL R15)))\n ((RegL Rdx)\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL f.1)\n (VarL v.1)\n (RegL Rsp)\n (RegL Rax)\n (RegL R15)))\n ((RegL Rsi)\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL f.1)\n (VarL v.1)\n (RegL Rsp)\n (RegL Rax)\n (RegL Rdi)\n (RegL R15)))\n ((RegL Rdi)\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL f.1)\n (VarL v.1)\n (RegL Rsp)\n (RegL Rax)\n (RegL Rsi)\n (RegL R15)))\n ((RegL R8)\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL f.1)\n (VarL v.1)\n (RegL Rsp)\n (RegL Rax)\n (RegL R15)))\n ((RegL R9)\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL f.1)\n (VarL v.1)\n (RegL Rsp)\n (RegL Rax)\n (RegL R15)))\n ((RegL R10)\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL f.1)\n (VarL v.1)\n (RegL Rsp)\n (RegL Rax)\n (RegL R15)))\n ((RegL R11)\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL $ea.4)\n (VarL f.1)\n (VarL v.1)\n (RegL Rsp)\n (RegL Rax)\n (RegL R15)))\n ((RegL R12) ((VarL v.1)))\n ((RegL R13) ((VarL v.1)))\n ((RegL R14) ((VarL v.1)))\n ((RegL R15)\n ((VarL $ea.2)\n (VarL $ea.3)\n (VarL $tmp.10)\n (VarL $tmp.11)\n (VarL $tmp.7)\n (VarL $tmp.8)\n (VarL $tmp.9)\n (VarL f.1)\n (VarL v.1)\n (RegL Rax)\n (RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)\n (RegL Rflags)))\n ((RegL Rflags)\n ((VarL $ea.2)\n (VarL $ea.3)\n (RegL Rsp)\n (RegL R15))))))\n ((nparams 2)\n (locals\n ((f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))\n ($ea.2 Integer)\n ($ea.3 Integer)\n ($ea.4 (Vector (Integer Integer)))\n ($tmp.10 Integer)\n ($tmp.11 Integer)\n ($tmp.7 Integer)\n ($tmp.8 Integer)\n ($tmp.9 Integer)\n (_.4 Unit)\n (_.5 Unit)\n (_.6 Unit)\n (f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (body\n (((Label block_4)\n (Block\n Binfo1\n ((Movq\n (GlobalArg (Label free_ptr))\n (Reg R11))\n (Addq\n (Imm 24)\n (GlobalArg (Label free_ptr)))\n (Movq (Imm 5) (Deref R11 0))\n (Movq (Reg R11) (Var $ea.4))\n (Movq (Var $ea.4) (Reg R11))\n (Movq (Var $ea.2) (Deref R11 8))\n (Movq (Imm 0) (Var _.5))\n (Movq (Var $ea.4) (Reg R11))\n (Movq (Var $ea.3) (Deref R11 16))\n (Movq (Imm 0) (Var _.4))\n (Movq (Var $ea.4) (Reg Rax))\n (Jmp (Label map_vec_conclusion)))))\n ((Label block_5)\n (Block\n Binfo1\n ((Movq (Imm 0) (Var _.6))\n (Jmp (Label block_4)))))\n ((Label block_6)\n (Block\n Binfo1\n ((Movq (Reg R15) (Reg Rdi))\n (Movq (Imm 24) (Reg Rsi))\n (Callq (Label collect) 2)\n (Jmp (Label block_4)))))\n ((Label map_vec_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var f.1))\n (Movq (Reg Rsi) (Var v.1))\n (Movq (Var v.1) (Reg R11))\n (Movq (Deref R11 8) (Var $tmp.7))\n (Movq (Var $tmp.7) (Reg Rdi))\n (IndirectCallq (Var f.1) 1)\n (Movq (Reg Rax) (Var $ea.2))\n (Movq (Var v.1) (Reg R11))\n (Movq (Deref R11 16) (Var $tmp.8))\n (Movq (Var $tmp.8) (Reg Rdi))\n (IndirectCallq (Var f.1) 1)\n (Movq (Reg Rax) (Var $ea.3))\n (Movq\n (GlobalArg (Label free_ptr))\n (Var $tmp.9))\n (Movq (Var $tmp.9) (Var $tmp.10))\n (Addq (Imm 24) (Var $tmp.10))\n (Movq\n (GlobalArg (Label fromspace_end))\n (Var $tmp.11))\n (Cmpq (Var $tmp.11) (Var $tmp.10))\n (JmpIf CC_l (Label block_5))\n (Jmp (Label block_6)))))))))\n (Def\n (Label add1)\n (Finfo2\n (conflicts\n (((VarL x.1) ((RegL Rsp)))\n ((RegL Rsp) ((VarL x.1) (RegL Rax)))\n ((RegL Rax) ((RegL Rsp))))))\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label add1_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var x.1))\n (Movq (Var x.1) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label add1_conclusion)))))))))))\n", + "ar": "(X86Program\n ((Def\n (Label main)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee (Rbx R12)))\n ((nparams 0)\n (locals\n (($ea.1 (Vector (Integer Integer)))\n ($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5\n (Function\n ((Function (Integer) Integer)\n (Vector (Integer Integer)))\n (Vector (Integer Integer))))\n ($tmp.6 (Vector (Integer Integer)))\n (_.1 Unit)\n (_.2 Unit)\n (_.3 Unit)\n (add1 (Function (Integer) Integer))\n (map_vec\n (Function\n ((Function (Integer) Integer)\n (Vector (Integer Integer)))\n (Vector (Integer Integer))))))\n (body\n (((Label block_1)\n (Block\n Binfo1\n ((Movq\n (GlobalArg (Label free_ptr))\n (Reg R11))\n (Addq\n (Imm 24)\n (GlobalArg (Label free_ptr)))\n (Movq (Imm 5) (Deref R11 0))\n (Movq (Reg R11) (Reg Rcx))\n (Movq (Reg Rcx) (Reg R11))\n (Movq (Imm 0) (Deref R11 8))\n (Movq (Imm 0) (Reg Rdx))\n (Movq (Reg Rcx) (Reg R11))\n (Movq (Imm 41) (Deref R11 16))\n (Movq (Imm 0) (Reg Rdx))\n (Movq (Reg Rbx) (Reg Rdi))\n (Movq (Reg Rcx) (Reg Rsi))\n (IndirectCallq (Reg R12) 2)\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Reg Rcx) (Reg R11))\n (Movq (Deref R11 16) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n Binfo1\n ((Movq (Imm 0) (Reg Rcx))\n (Jmp (Label block_1)))))\n ((Label block_3)\n (Block\n Binfo1\n ((Movq (Reg R15) (Reg Rdi))\n (Movq (Imm 24) (Reg Rsi))\n (Callq (Label collect) 2)\n (Jmp (Label block_1)))))\n ((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label map_vec))\n (Reg R12))\n (Leaq\n (GlobalArg (Label add1))\n (Reg Rbx))\n (Movq\n (GlobalArg (Label free_ptr))\n (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rcx))\n (Addq (Imm 24) (Reg Rcx))\n (Movq\n (GlobalArg (Label fromspace_end))\n (Reg Rsi))\n (Cmpq (Reg Rsi) (Reg Rcx))\n (JmpIf CC_l (Label block_2))\n (Jmp (Label block_3)))))))))\n (Def\n (Label map_vec)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 1)\n (used_callee (Rbx R12)))\n ((nparams 2)\n (locals\n ((f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))\n ($ea.2 Integer)\n ($ea.3 Integer)\n ($ea.4 (Vector (Integer Integer)))\n ($tmp.10 Integer)\n ($tmp.11 Integer)\n ($tmp.7 Integer)\n ($tmp.8 Integer)\n ($tmp.9 Integer)\n (_.4 Unit)\n (_.5 Unit)\n (_.6 Unit)\n (f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (body\n (((Label block_4)\n (Block\n Binfo1\n ((Movq\n (GlobalArg (Label free_ptr))\n (Reg R11))\n (Addq\n (Imm 24)\n (GlobalArg (Label free_ptr)))\n (Movq (Imm 5) (Deref R11 0))\n (Movq (Reg R11) (Reg Rdx))\n (Movq (Reg Rdx) (Reg R11))\n (Movq (Reg Rbx) (Deref R11 8))\n (Movq (Imm 0) (Reg Rcx))\n (Movq (Reg Rdx) (Reg R11))\n (Movq (Reg R12) (Deref R11 16))\n (Movq (Imm 0) (Reg Rcx))\n (Movq (Reg Rdx) (Reg Rax))\n (Jmp (Label map_vec_conclusion)))))\n ((Label block_5)\n (Block\n Binfo1\n ((Movq (Imm 0) (Reg Rcx))\n (Jmp (Label block_4)))))\n ((Label block_6)\n (Block\n Binfo1\n ((Movq (Reg R15) (Reg Rdi))\n (Movq (Imm 24) (Reg Rsi))\n (Callq (Label collect) 2)\n (Jmp (Label block_4)))))\n ((Label map_vec_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg R12))\n (Movq (Reg Rsi) (Deref R15 -8))\n (Movq (Deref R15 -8) (Reg R11))\n (Movq (Deref R11 8) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rdi))\n (IndirectCallq (Reg R12) 1)\n (Movq (Reg Rax) (Reg Rbx))\n (Movq (Deref R15 -8) (Reg R11))\n (Movq (Deref R11 16) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rdi))\n (IndirectCallq (Reg R12) 1)\n (Movq (Reg Rax) (Reg R12))\n (Movq\n (GlobalArg (Label free_ptr))\n (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rcx))\n (Addq (Imm 24) (Reg Rcx))\n (Movq\n (GlobalArg (Label fromspace_end))\n (Reg Rdx))\n (Cmpq (Reg Rdx) (Reg Rcx))\n (JmpIf CC_l (Label block_5))\n (Jmp (Label block_6)))))))))\n (Def\n (Label add1)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label add1_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label add1_conclusion)))))))))))\n", + "rj": "(X86Program\n ((Def\n (Label main)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee (Rbx R12)))\n ((nparams 0)\n (locals\n (($ea.1 (Vector (Integer Integer)))\n ($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5\n (Function\n ((Function (Integer) Integer)\n (Vector (Integer Integer)))\n (Vector (Integer Integer))))\n ($tmp.6 (Vector (Integer Integer)))\n (_.1 Unit)\n (_.2 Unit)\n (_.3 Unit)\n (add1 (Function (Integer) Integer))\n (map_vec\n (Function\n ((Function (Integer) Integer)\n (Vector (Integer Integer)))\n (Vector (Integer Integer))))))\n (body\n (((Label block_1)\n (Block\n Binfo1\n ((Movq\n (GlobalArg (Label free_ptr))\n (Reg R11))\n (Addq\n (Imm 24)\n (GlobalArg (Label free_ptr)))\n (Movq (Imm 5) (Deref R11 0))\n (Movq (Reg R11) (Reg Rcx))\n (Movq (Reg Rcx) (Reg R11))\n (Movq (Imm 0) (Deref R11 8))\n (Movq (Imm 0) (Reg Rdx))\n (Movq (Reg Rcx) (Reg R11))\n (Movq (Imm 41) (Deref R11 16))\n (Movq (Imm 0) (Reg Rdx))\n (Movq (Reg Rbx) (Reg Rdi))\n (Movq (Reg Rcx) (Reg Rsi))\n (IndirectCallq (Reg R12) 2)\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Reg Rcx) (Reg R11))\n (Movq (Deref R11 16) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n Binfo1\n ((Movq (Imm 0) (Reg Rcx))\n (Jmp (Label block_1)))))\n ((Label block_3)\n (Block\n Binfo1\n ((Movq (Reg R15) (Reg Rdi))\n (Movq (Imm 24) (Reg Rsi))\n (Callq (Label collect) 2)\n (Jmp (Label block_1)))))\n ((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label map_vec))\n (Reg R12))\n (Leaq\n (GlobalArg (Label add1))\n (Reg Rbx))\n (Movq\n (GlobalArg (Label free_ptr))\n (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rcx))\n (Addq (Imm 24) (Reg Rcx))\n (Movq\n (GlobalArg (Label fromspace_end))\n (Reg Rsi))\n (Cmpq (Reg Rsi) (Reg Rcx))\n (JmpIf CC_l (Label block_2))\n (Jmp (Label block_3)))))))))\n (Def\n (Label map_vec)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 1)\n (used_callee (Rbx R12)))\n ((nparams 2)\n (locals\n ((f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))\n ($ea.2 Integer)\n ($ea.3 Integer)\n ($ea.4 (Vector (Integer Integer)))\n ($tmp.10 Integer)\n ($tmp.11 Integer)\n ($tmp.7 Integer)\n ($tmp.8 Integer)\n ($tmp.9 Integer)\n (_.4 Unit)\n (_.5 Unit)\n (_.6 Unit)\n (f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (body\n (((Label block_4)\n (Block\n Binfo1\n ((Movq\n (GlobalArg (Label free_ptr))\n (Reg R11))\n (Addq\n (Imm 24)\n (GlobalArg (Label free_ptr)))\n (Movq (Imm 5) (Deref R11 0))\n (Movq (Reg R11) (Reg Rdx))\n (Movq (Reg Rdx) (Reg R11))\n (Movq (Reg Rbx) (Deref R11 8))\n (Movq (Imm 0) (Reg Rcx))\n (Movq (Reg Rdx) (Reg R11))\n (Movq (Reg R12) (Deref R11 16))\n (Movq (Imm 0) (Reg Rcx))\n (Movq (Reg Rdx) (Reg Rax))\n (Jmp (Label map_vec_conclusion)))))\n ((Label block_5)\n (Block\n Binfo1\n ((Movq (Imm 0) (Reg Rcx))\n (Jmp (Label block_4)))))\n ((Label block_6)\n (Block\n Binfo1\n ((Movq (Reg R15) (Reg Rdi))\n (Movq (Imm 24) (Reg Rsi))\n (Callq (Label collect) 2)\n (Jmp (Label block_4)))))\n ((Label map_vec_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg R12))\n (Movq (Reg Rsi) (Deref R15 -8))\n (Movq (Deref R15 -8) (Reg R11))\n (Movq (Deref R11 8) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rdi))\n (IndirectCallq (Reg R12) 1)\n (Movq (Reg Rax) (Reg Rbx))\n (Movq (Deref R15 -8) (Reg R11))\n (Movq (Deref R11 16) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rdi))\n (IndirectCallq (Reg R12) 1)\n (Movq (Reg Rax) (Reg R12))\n (Movq\n (GlobalArg (Label free_ptr))\n (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rcx))\n (Addq (Imm 24) (Reg Rcx))\n (Movq\n (GlobalArg (Label fromspace_end))\n (Reg Rdx))\n (Cmpq (Reg Rdx) (Reg Rcx))\n (JmpIf CC_l (Label block_5))\n (Jmp (Label block_6)))))))))\n (Def\n (Label add1)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label add1_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label add1_conclusion)))))))))))\n", + "pi": "(X86Program\n ((Def\n (Label main)\n (Finfo\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee (Rbx R12)))\n ((nparams 0)\n (locals\n (($ea.1 (Vector (Integer Integer)))\n ($tmp.1 (Function (Integer) Integer))\n ($tmp.2 Integer)\n ($tmp.3 Integer)\n ($tmp.4 Integer)\n ($tmp.5\n (Function\n ((Function (Integer) Integer)\n (Vector (Integer Integer)))\n (Vector (Integer Integer))))\n ($tmp.6 (Vector (Integer Integer)))\n (_.1 Unit)\n (_.2 Unit)\n (_.3 Unit)\n (add1 (Function (Integer) Integer))\n (map_vec\n (Function\n ((Function (Integer) Integer)\n (Vector (Integer Integer)))\n (Vector (Integer Integer))))))\n (body\n (((Label block_1)\n (Block\n ((Movq\n (GlobalArg (Label free_ptr))\n (Reg R11))\n (Addq\n (Imm 24)\n (GlobalArg (Label free_ptr)))\n (Movq (Imm 5) (Deref R11 0))\n (Movq (Reg R11) (Reg Rcx))\n (Movq (Reg Rcx) (Reg R11))\n (Movq (Imm 0) (Deref R11 8))\n (Movq (Imm 0) (Reg Rdx))\n (Movq (Reg Rcx) (Reg R11))\n (Movq (Imm 41) (Deref R11 16))\n (Movq (Imm 0) (Reg Rdx))\n (Movq (Reg Rbx) (Reg Rdi))\n (Movq (Reg Rcx) (Reg Rsi))\n (IndirectCallq (Reg R12) 2)\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Reg Rcx) (Reg R11))\n (Movq (Deref R11 16) (Reg Rax))\n (Jmp (Label main_conclusion)))))\n ((Label block_2)\n (Block\n ((Movq (Imm 0) (Reg Rcx))\n (Jmp (Label block_1)))))\n ((Label block_3)\n (Block\n ((Movq (Reg R15) (Reg Rdi))\n (Movq (Imm 24) (Reg Rsi))\n (Callq (Label collect) 2)\n (Jmp (Label block_1)))))\n ((Label main_start)\n (Block\n ((Leaq\n (GlobalArg (Label map_vec))\n (Reg R12))\n (Leaq\n (GlobalArg (Label add1))\n (Reg Rbx))\n (Movq\n (GlobalArg (Label free_ptr))\n (Reg Rcx))\n (Addq (Imm 24) (Reg Rcx))\n (Movq\n (GlobalArg (Label fromspace_end))\n (Reg Rsi))\n (Cmpq (Reg Rsi) (Reg Rcx))\n (JmpIf CC_l (Label block_2))\n (Jmp (Label block_3)))))))))\n (Def\n (Label map_vec)\n (Finfo\n (num_spilled 0)\n (num_spilled_root 1)\n (used_callee (Rbx R12)))\n ((nparams 2)\n (locals\n ((f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))\n ($ea.2 Integer)\n ($ea.3 Integer)\n ($ea.4 (Vector (Integer Integer)))\n ($tmp.10 Integer)\n ($tmp.11 Integer)\n ($tmp.7 Integer)\n ($tmp.8 Integer)\n ($tmp.9 Integer)\n (_.4 Unit)\n (_.5 Unit)\n (_.6 Unit)\n (f.1 (Function (Integer) Integer))\n (v.1 (Vector (Integer Integer)))))\n (body\n (((Label block_4)\n (Block\n ((Movq\n (GlobalArg (Label free_ptr))\n (Reg R11))\n (Addq\n (Imm 24)\n (GlobalArg (Label free_ptr)))\n (Movq (Imm 5) (Deref R11 0))\n (Movq (Reg R11) (Reg Rdx))\n (Movq (Reg Rdx) (Reg R11))\n (Movq (Reg Rbx) (Deref R11 8))\n (Movq (Imm 0) (Reg Rcx))\n (Movq (Reg Rdx) (Reg R11))\n (Movq (Reg R12) (Deref R11 16))\n (Movq (Imm 0) (Reg Rcx))\n (Movq (Reg Rdx) (Reg Rax))\n (Jmp (Label map_vec_conclusion)))))\n ((Label block_5)\n (Block\n ((Movq (Imm 0) (Reg Rcx))\n (Jmp (Label block_4)))))\n ((Label block_6)\n (Block\n ((Movq (Reg R15) (Reg Rdi))\n (Movq (Imm 24) (Reg Rsi))\n (Callq (Label collect) 2)\n (Jmp (Label block_4)))))\n ((Label map_vec_start)\n (Block\n ((Movq (Reg Rdi) (Reg R12))\n (Movq (Reg Rsi) (Deref R15 -8))\n (Movq (Deref R15 -8) (Reg R11))\n (Movq (Deref R11 8) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rdi))\n (IndirectCallq (Reg R12) 1)\n (Movq (Reg Rax) (Reg Rbx))\n (Movq (Deref R15 -8) (Reg R11))\n (Movq (Deref R11 16) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rdi))\n (IndirectCallq (Reg R12) 1)\n (Movq (Reg Rax) (Reg R12))\n (Movq\n (GlobalArg (Label free_ptr))\n (Reg Rcx))\n (Addq (Imm 24) (Reg Rcx))\n (Movq\n (GlobalArg (Label fromspace_end))\n (Reg Rdx))\n (Cmpq (Reg Rdx) (Reg Rcx))\n (JmpIf CC_l (Label block_5))\n (Jmp (Label block_6)))))))))\n (Def\n (Label add1)\n (Finfo\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label add1_start)\n (Block\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label add1_conclusion)))))))))))\n", + "pc": "(X86Program\n ((Label block_1)\n (Movq\n (GlobalArg Rip (Label free_ptr))\n (Reg R11))\n (Addq\n (Imm 24)\n (GlobalArg Rip (Label free_ptr)))\n (Movq (Imm 5) (Deref R11 0))\n (Movq (Reg R11) (Reg Rcx))\n (Movq (Reg Rcx) (Reg R11))\n (Movq (Imm 0) (Deref R11 8))\n (Movq (Imm 0) (Reg Rdx))\n (Movq (Reg Rcx) (Reg R11))\n (Movq (Imm 41) (Deref R11 16))\n (Movq (Imm 0) (Reg Rdx))\n (Movq (Reg Rbx) (Reg Rdi))\n (Movq (Reg Rcx) (Reg Rsi))\n (IndirectCallq (Reg R12))\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Reg Rcx) (Reg R11))\n (Movq (Deref R11 16) (Reg Rax))\n (Jmp (Label main_conclusion))\n (Label block_2)\n (Movq (Imm 0) (Reg Rcx))\n (Jmp (Label block_1))\n (Label block_3)\n (Movq (Reg R15) (Reg Rdi))\n (Movq (Imm 24) (Reg Rsi))\n (Callq (Label collect))\n (Jmp (Label block_1))\n (Label main_start)\n (Leaq\n (GlobalArg Rip (Label map_vec))\n (Reg R12))\n (Leaq\n (GlobalArg Rip (Label add1))\n (Reg Rbx))\n (Movq\n (GlobalArg Rip (Label free_ptr))\n (Reg Rcx))\n (Addq (Imm 24) (Reg Rcx))\n (Movq\n (GlobalArg Rip (Label fromspace_end))\n (Reg Rsi))\n (Cmpq (Reg Rsi) (Reg Rcx))\n (JmpIf CC_l (Label block_2))\n (Jmp (Label block_3))\n (Global (Label main))\n (Align 8)\n (Label main)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Pushq (Reg Rbx))\n (Pushq (Reg R12))\n (Subq (Imm 0) (Reg Rsp))\n (Movq (Imm 65536) (Reg Rdi))\n (Movq (Imm 65536) (Reg Rsi))\n (Callq (Label initialize))\n (Movq\n (GlobalArg Rip (Label rootstack_begin))\n (Reg R15))\n (Addq (Imm 0) (Reg R15))\n (Jmp (Label main_start))\n (Label main_conclusion)\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg R12))\n (Popq (Reg Rbx))\n (Popq (Reg Rbp))\n Retq\n (Label block_4)\n (Movq\n (GlobalArg Rip (Label free_ptr))\n (Reg R11))\n (Addq\n (Imm 24)\n (GlobalArg Rip (Label free_ptr)))\n (Movq (Imm 5) (Deref R11 0))\n (Movq (Reg R11) (Reg Rdx))\n (Movq (Reg Rdx) (Reg R11))\n (Movq (Reg Rbx) (Deref R11 8))\n (Movq (Imm 0) (Reg Rcx))\n (Movq (Reg Rdx) (Reg R11))\n (Movq (Reg R12) (Deref R11 16))\n (Movq (Imm 0) (Reg Rcx))\n (Movq (Reg Rdx) (Reg Rax))\n (Jmp (Label map_vec_conclusion))\n (Label block_5)\n (Movq (Imm 0) (Reg Rcx))\n (Jmp (Label block_4))\n (Label block_6)\n (Movq (Reg R15) (Reg Rdi))\n (Movq (Imm 24) (Reg Rsi))\n (Callq (Label collect))\n (Jmp (Label block_4))\n (Label map_vec_start)\n (Movq (Reg Rdi) (Reg R12))\n (Movq (Reg Rsi) (Deref R15 -8))\n (Movq (Deref R15 -8) (Reg R11))\n (Movq (Deref R11 8) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rdi))\n (IndirectCallq (Reg R12))\n (Movq (Reg Rax) (Reg Rbx))\n (Movq (Deref R15 -8) (Reg R11))\n (Movq (Deref R11 16) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rdi))\n (IndirectCallq (Reg R12))\n (Movq (Reg Rax) (Reg R12))\n (Movq\n (GlobalArg Rip (Label free_ptr))\n (Reg Rcx))\n (Addq (Imm 24) (Reg Rcx))\n (Movq\n (GlobalArg Rip (Label fromspace_end))\n (Reg Rdx))\n (Cmpq (Reg Rdx) (Reg Rcx))\n (JmpIf CC_l (Label block_5))\n (Jmp (Label block_6))\n (Global (Label map_vec))\n (Align 8)\n (Label map_vec)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Pushq (Reg Rbx))\n (Pushq (Reg R12))\n (Subq (Imm 0) (Reg Rsp))\n (Movq (Imm 0) (Deref R15 0))\n (Addq (Imm 8) (Reg R15))\n (Jmp (Label map_vec_start))\n (Label map_vec_conclusion)\n (Subq (Imm 8) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg R12))\n (Popq (Reg Rbx))\n (Popq (Reg Rbp))\n Retq\n (Label add1_start)\n (Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label add1_conclusion))\n (Global (Label add1))\n (Align 8)\n (Label add1)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Subq (Imm 0) (Reg Rsp))\n (Addq (Imm 0) (Reg R15))\n (Jmp (Label add1_start))\n (Label add1_conclusion)\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n Retq))\n", + "opt": "(X86Program\n ((Label block_1)\n (Movq\n (GlobalArg Rip (Label free_ptr))\n (Reg R11))\n (Addq\n (Imm 24)\n (GlobalArg Rip (Label free_ptr)))\n (Movq (Imm 5) (Deref R11 0))\n (Movq (Reg R11) (Reg Rcx))\n (Movq (Imm 0) (Deref R11 8))\n (Movq (Imm 0) (Reg Rdx))\n (Movq (Reg Rcx) (Reg R11))\n (Movq (Imm 41) (Deref R11 16))\n (Movq (Imm 0) (Reg Rdx))\n (Movq (Reg Rbx) (Reg Rdi))\n (Movq (Reg Rcx) (Reg Rsi))\n (IndirectCallq (Reg R12))\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Reg Rcx) (Reg R11))\n (Movq (Deref R11 16) (Reg Rax))\n (Jmp (Label main_conclusion))\n (Label block_2)\n (Movq (Imm 0) (Reg Rcx))\n (Jmp (Label block_1))\n (Label block_3)\n (Movq (Reg R15) (Reg Rdi))\n (Movq (Imm 24) (Reg Rsi))\n (Callq (Label collect))\n (Jmp (Label block_1))\n (Label main_start)\n (Leaq\n (GlobalArg Rip (Label map_vec))\n (Reg R12))\n (Leaq\n (GlobalArg Rip (Label add1))\n (Reg Rbx))\n (Movq\n (GlobalArg Rip (Label free_ptr))\n (Reg Rcx))\n (Addq (Imm 24) (Reg Rcx))\n (Movq\n (GlobalArg Rip (Label fromspace_end))\n (Reg Rsi))\n (Cmpq (Reg Rsi) (Reg Rcx))\n (JmpIf CC_l (Label block_2))\n (Jmp (Label block_3))\n (Global (Label main))\n (Align 8)\n (Label main)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Pushq (Reg Rbx))\n (Pushq (Reg R12))\n (Movq (Imm 65536) (Reg Rdi))\n (Movq (Imm 65536) (Reg Rsi))\n (Callq (Label initialize))\n (Movq\n (GlobalArg Rip (Label rootstack_begin))\n (Reg R15))\n (Jmp (Label main_start))\n (Label main_conclusion)\n (Popq (Reg R12))\n (Popq (Reg Rbx))\n (Popq (Reg Rbp))\n Retq\n (Label block_4)\n (Movq\n (GlobalArg Rip (Label free_ptr))\n (Reg R11))\n (Addq\n (Imm 24)\n (GlobalArg Rip (Label free_ptr)))\n (Movq (Imm 5) (Deref R11 0))\n (Movq (Reg R11) (Reg Rdx))\n (Movq (Reg Rbx) (Deref R11 8))\n (Movq (Imm 0) (Reg Rcx))\n (Movq (Reg Rdx) (Reg R11))\n (Movq (Reg R12) (Deref R11 16))\n (Movq (Imm 0) (Reg Rcx))\n (Movq (Reg Rdx) (Reg Rax))\n (Jmp (Label map_vec_conclusion))\n (Label block_5)\n (Movq (Imm 0) (Reg Rcx))\n (Jmp (Label block_4))\n (Label block_6)\n (Movq (Reg R15) (Reg Rdi))\n (Movq (Imm 24) (Reg Rsi))\n (Callq (Label collect))\n (Jmp (Label block_4))\n (Label map_vec_start)\n (Movq (Reg Rdi) (Reg R12))\n (Movq (Reg Rsi) (Deref R15 -8))\n (Movq (Deref R15 -8) (Reg R11))\n (Movq (Deref R11 8) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rdi))\n (IndirectCallq (Reg R12))\n (Movq (Reg Rax) (Reg Rbx))\n (Movq (Deref R15 -8) (Reg R11))\n (Movq (Deref R11 16) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rdi))\n (IndirectCallq (Reg R12))\n (Movq (Reg Rax) (Reg R12))\n (Movq\n (GlobalArg Rip (Label free_ptr))\n (Reg Rcx))\n (Addq (Imm 24) (Reg Rcx))\n (Movq\n (GlobalArg Rip (Label fromspace_end))\n (Reg Rdx))\n (Cmpq (Reg Rdx) (Reg Rcx))\n (JmpIf CC_l (Label block_5))\n (Jmp (Label block_6))\n (Global (Label map_vec))\n (Align 8)\n (Label map_vec)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Pushq (Reg Rbx))\n (Pushq (Reg R12))\n (Movq (Imm 0) (Deref R15 0))\n (Addq (Imm 8) (Reg R15))\n (Jmp (Label map_vec_start))\n (Label map_vec_conclusion)\n (Subq (Imm 8) (Reg R15))\n (Popq (Reg R12))\n (Popq (Reg Rbx))\n (Popq (Reg Rbp))\n Retq\n (Label add1_start)\n (Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label add1_conclusion))\n (Global (Label add1))\n (Align 8)\n (Label add1)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Jmp (Label add1_start))\n (Label add1_conclusion)\n (Popq (Reg Rbp))\n Retq))\n", + "pa": "block_1:\n movq free_ptr(%rip), %r11\n addq $24, free_ptr(%rip)\n movq $5, 0(%r11)\n movq %r11, %rcx\n movq $0, 8(%r11)\n movq $0, %rdx\n movq %rcx, %r11\n movq $41, 16(%r11)\n movq $0, %rdx\n movq %rbx, %rdi\n movq %rcx, %rsi\n callq *%r12\n movq %rax, %rcx\n movq %rcx, %r11\n movq 16(%r11), %rax\n jmp main_conclusion\n\nblock_2:\n movq $0, %rcx\n jmp block_1\n\nblock_3:\n movq %r15, %rdi\n movq $24, %rsi\n callq collect\n jmp block_1\n\nmain_start:\n leaq map_vec(%rip), %r12\n leaq add1(%rip), %rbx\n movq free_ptr(%rip), %rcx\n addq $24, %rcx\n movq fromspace_end(%rip), %rsi\n cmpq %rsi, %rcx\n jl block_2\n jmp block_3\n\n .globl main\n .align 8\n\nmain:\n pushq %rbp\n movq %rsp, %rbp\n pushq %rbx\n pushq %r12\n movq $65536, %rdi\n movq $65536, %rsi\n callq initialize\n movq rootstack_begin(%rip), %r15\n jmp main_start\n\nmain_conclusion:\n popq %r12\n popq %rbx\n popq %rbp\n retq\n\nblock_4:\n movq free_ptr(%rip), %r11\n addq $24, free_ptr(%rip)\n movq $5, 0(%r11)\n movq %r11, %rdx\n movq %rbx, 8(%r11)\n movq $0, %rcx\n movq %rdx, %r11\n movq %r12, 16(%r11)\n movq $0, %rcx\n movq %rdx, %rax\n jmp map_vec_conclusion\n\nblock_5:\n movq $0, %rcx\n jmp block_4\n\nblock_6:\n movq %r15, %rdi\n movq $24, %rsi\n callq collect\n jmp block_4\n\nmap_vec_start:\n movq %rdi, %r12\n movq %rsi, -8(%r15)\n movq -8(%r15), %r11\n movq 8(%r11), %rcx\n movq %rcx, %rdi\n callq *%r12\n movq %rax, %rbx\n movq -8(%r15), %r11\n movq 16(%r11), %rcx\n movq %rcx, %rdi\n callq *%r12\n movq %rax, %r12\n movq free_ptr(%rip), %rcx\n addq $24, %rcx\n movq fromspace_end(%rip), %rdx\n cmpq %rdx, %rcx\n jl block_5\n jmp block_6\n\n .globl map_vec\n .align 8\n\nmap_vec:\n pushq %rbp\n movq %rsp, %rbp\n pushq %rbx\n pushq %r12\n movq $0, 0(%r15)\n addq $8, %r15\n jmp map_vec_start\n\nmap_vec_conclusion:\n subq $8, %r15\n popq %r12\n popq %rbx\n popq %rbp\n retq\n\nadd1_start:\n movq %rdi, %rcx\n movq %rcx, %rax\n addq $1, %rax\n jmp add1_conclusion\n\n .globl add1\n .align 8\n\nadd1:\n pushq %rbp\n movq %rsp, %rbp\n jmp add1_start\n\nadd1_conclusion:\n popq %rbp\n retq\n" + } + }, + { + "id": "functions_test_40", + "title": "Return Function", + "description": "Function that returns another function", + "source": ";; OUTPUT: 42\n\n(define (add1 (x : Integer)) : Integer\n (+ x 1))\n\n(define (give_me_add1) : (Integer -> Integer)\n add1)\n\n((give_me_add1) 41)\n", + "passOutputs": { + "lfun": "(Program\n ((Def\n add1\n ((args ((x Integer)))\n (ret Integer)\n (body (Prim Add ((Var x) (Int 1))))))\n (Def\n give_me_add1\n ((args ())\n (ret (Function (Integer) Integer))\n (body (Var add1)))))\n (Apply\n (Apply (Var give_me_add1) ())\n ((Int 41))))\n", + "tc1": "(Program\n ((Def\n add1\n ((args ((x Integer)))\n (ret Integer)\n (body (Prim Add ((Var x) (Int 1))))))\n (Def\n give_me_add1\n ((args ())\n (ret (Function (Integer) Integer))\n (body (Var add1)))))\n (Apply\n (Apply (Var give_me_add1) ())\n ((Int 41))))\n", + "sh": "(Program\n ((Def\n main\n ((args ())\n (ret Integer)\n (body\n (Apply\n (Apply (Var give_me_add1) ())\n ((Int 41))))))\n (Def\n add1\n ((args ((x Integer)))\n (ret Integer)\n (body (Prim Add ((Var x) (Int 1))))))\n (Def\n give_me_add1\n ((args ())\n (ret (Function (Integer) Integer))\n (body (Var add1))))))\n", + "un": "(Program\n ((Def\n main\n ((args ())\n (ret Integer)\n (body\n (Apply\n (Apply (Var give_me_add1) ())\n ((Int 41))))))\n (Def\n add1\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))\n (Def\n give_me_add1\n ((args ())\n (ret (Function (Integer) Integer))\n (body (Var add1))))))\n", + "rf": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Apply\n (Apply\n (FunRef (Label give_me_add1) 0)\n ())\n ((Int 41))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))\n (Def\n (Label give_me_add1)\n ((args ())\n (ret (Function (Integer) Integer))\n (body (FunRef (Label add1) 1))))))\n", + "lf": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Apply\n (Apply\n (FunRef (Label give_me_add1) 0)\n ())\n ((Int 41))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))\n (Def\n (Label give_me_add1)\n ((args ())\n (ret (Function (Integer) Integer))\n (body (FunRef (Label add1) 1))))))\n", + "tc1b": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Apply\n (Apply\n (FunRef (Label give_me_add1) 0)\n ())\n ((Int 41))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))\n (Def\n (Label give_me_add1)\n ((args ())\n (ret (Function (Integer) Integer))\n (body (FunRef (Label add1) 1))))))\n", + "ea": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Apply\n (Apply\n (FunRef (Label give_me_add1) 0)\n ())\n ((Int 41))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))\n (Def\n (Label give_me_add1)\n ((args ())\n (ret (Function (Integer) Integer))\n (body (FunRef (Label add1) 1))))))\n", + "ug": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Apply\n (Apply\n (FunRef (Label give_me_add1) 0)\n ())\n ((Int 41))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))\n (Def\n (Label give_me_add1)\n ((args ())\n (ret (Function (Integer) Integer))\n (body (FunRef (Label add1) 1))))))\n", + "rc": "(Program\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (body\n (Let\n $tmp.1\n (FunRef (Label give_me_add1) 0)\n (Let\n $tmp.2\n (Apply (Var $tmp.1) ())\n (Apply (Var $tmp.2) ((Int 41))))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (body (Prim Add ((Var x.1) (Int 1))))))\n (Def\n (Label give_me_add1)\n ((args ())\n (ret (Function (Integer) Integer))\n (body (FunRef (Label add1) 1))))))\n", + "ec": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals ())\n (body\n (((Label start)\n (Seq\n (Assign\n $tmp.1\n (FunRef (Label give_me_add1) 0))\n (Seq\n (Assign $tmp.2 (Call (Var $tmp.1) ()))\n (TailCall (Var $tmp.2) ((Int 41))))))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals ())\n (body\n (((Label start)\n (Return (Prim Add ((Var x.1) (Int 1)))))))))\n (Def\n (Label give_me_add1)\n ((args ())\n (ret (Function (Integer) Integer))\n (locals ())\n (body\n (((Label start)\n (Return (FunRef (Label add1) 1)))))))))\n", + "tc2": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals\n (($tmp.1\n (Function\n ()\n (Function (Integer) Integer)))\n ($tmp.2 (Function (Integer) Integer))\n (give_me_add1\n (Function\n ()\n (Function (Integer) Integer)))))\n (body\n (((Label start)\n (Seq\n (Assign\n $tmp.1\n (FunRef (Label give_me_add1) 0))\n (Seq\n (Assign $tmp.2 (Call (Var $tmp.1) ()))\n (TailCall (Var $tmp.2) ((Int 41))))))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals ((x.1 Integer)))\n (body\n (((Label start)\n (Return (Prim Add ((Var x.1) (Int 1)))))))))\n (Def\n (Label give_me_add1)\n ((args ())\n (ret (Function (Integer) Integer))\n (locals\n ((add1 (Function (Integer) Integer))))\n (body\n (((Label start)\n (Return (FunRef (Label add1) 1)))))))))\n", + "ru": "(CProgram\n ((Def\n (Label main)\n ((args ())\n (ret Integer)\n (locals\n (($tmp.1\n (Function\n ()\n (Function (Integer) Integer)))\n ($tmp.2 (Function (Integer) Integer))\n (give_me_add1\n (Function\n ()\n (Function (Integer) Integer)))))\n (body\n (((Label start)\n (Seq\n (Assign\n $tmp.1\n (FunRef (Label give_me_add1) 0))\n (Seq\n (Assign $tmp.2 (Call (Var $tmp.1) ()))\n (TailCall (Var $tmp.2) ((Int 41))))))))))\n (Def\n (Label add1)\n ((args ((x.1 Integer)))\n (ret Integer)\n (locals ((x.1 Integer)))\n (body\n (((Label start)\n (Return (Prim Add ((Var x.1) (Int 1)))))))))\n (Def\n (Label give_me_add1)\n ((args ())\n (ret (Function (Integer) Integer))\n (locals\n ((add1 (Function (Integer) Integer))))\n (body\n (((Label start)\n (Return (FunRef (Label add1) 1)))))))))\n", + "si": "(X86Program\n ((Def\n (Label main)\n Finfo1\n ((nparams 0)\n (locals\n (($tmp.1\n (Function\n ()\n (Function (Integer) Integer)))\n ($tmp.2 (Function (Integer) Integer))\n (give_me_add1\n (Function\n ()\n (Function (Integer) Integer)))))\n (body\n (((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label give_me_add1))\n (Var $tmp.1))\n (IndirectCallq (Var $tmp.1) 0)\n (Movq (Reg Rax) (Var $tmp.2))\n (Movq (Imm 41) (Reg Rdi))\n (TailJmp (Var $tmp.2) 1))))))))\n (Def\n (Label add1)\n Finfo1\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label add1_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var x.1))\n (Movq (Var x.1) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label add1_conclusion)))))))))\n (Def\n (Label give_me_add1)\n Finfo1\n ((nparams 0)\n (locals\n ((add1 (Function (Integer) Integer))))\n (body\n (((Label give_me_add1_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label add1))\n (Reg Rax))\n (Jmp (Label give_me_add1_conclusion)))))))))))\n", + "ul": "(X86Program\n ((Def\n (Label main)\n Finfo1\n ((nparams 0)\n (locals\n (($tmp.1\n (Function\n ()\n (Function (Integer) Integer)))\n ($tmp.2 (Function (Integer) Integer))\n (give_me_add1\n (Function\n ()\n (Function (Integer) Integer)))))\n (body\n (((Label main_start)\n (Block\n (Binfo2\n ((initial ())\n (afters\n (((VarL $tmp.1))\n ((RegL Rax))\n ((VarL $tmp.2))\n ((VarL $tmp.2) (RegL Rdi))\n ()))))\n ((Leaq\n (GlobalArg (Label give_me_add1))\n (Var $tmp.1))\n (IndirectCallq (Var $tmp.1) 0)\n (Movq (Reg Rax) (Var $tmp.2))\n (Movq (Imm 41) (Reg Rdi))\n (TailJmp (Var $tmp.2) 1))))))))\n (Def\n (Label add1)\n Finfo1\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label add1_start)\n (Block\n (Binfo2\n ((initial ((RegL Rsp) (RegL Rdi)))\n (afters\n (((VarL x.1) (RegL Rsp))\n ((RegL Rsp) (RegL Rax))\n ((RegL Rsp) (RegL Rax))\n ()))))\n ((Movq (Reg Rdi) (Var x.1))\n (Movq (Var x.1) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label add1_conclusion)))))))))\n (Def\n (Label give_me_add1)\n Finfo1\n ((nparams 0)\n (locals\n ((add1 (Function (Integer) Integer))))\n (body\n (((Label give_me_add1_start)\n (Block\n (Binfo2\n ((initial ((RegL Rsp)))\n (afters (((RegL Rsp) (RegL Rax)) ()))))\n ((Leaq\n (GlobalArg (Label add1))\n (Reg Rax))\n (Jmp (Label give_me_add1_conclusion)))))))))))\n", + "bi": "(X86Program\n ((Def\n (Label main)\n (Finfo2\n (conflicts\n (((VarL $tmp.1) ((RegL Rsp)))\n ((VarL $tmp.2) ((RegL Rdi)))\n ((VarL give_me_add1) ((RegL Rsp)))\n ((RegL Rsp)\n ((VarL $tmp.1) (VarL give_me_add1)))\n ((RegL Rax)\n ((RegL Rcx)\n (RegL Rdx)\n (RegL Rsi)\n (RegL Rdi)\n (RegL R8)\n (RegL R9)\n (RegL R10)\n (RegL R11)))\n ((RegL Rcx) ((RegL Rax)))\n ((RegL Rdx) ((RegL Rax)))\n ((RegL Rsi) ((RegL Rax)))\n ((RegL Rdi) ((VarL $tmp.2) (RegL Rax)))\n ((RegL R8) ((RegL Rax)))\n ((RegL R9) ((RegL Rax)))\n ((RegL R10) ((RegL Rax)))\n ((RegL R11) ((RegL Rax))))))\n ((nparams 0)\n (locals\n (($tmp.1\n (Function\n ()\n (Function (Integer) Integer)))\n ($tmp.2 (Function (Integer) Integer))\n (give_me_add1\n (Function\n ()\n (Function (Integer) Integer)))))\n (body\n (((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label give_me_add1))\n (Var $tmp.1))\n (IndirectCallq (Var $tmp.1) 0)\n (Movq (Reg Rax) (Var $tmp.2))\n (Movq (Imm 41) (Reg Rdi))\n (TailJmp (Var $tmp.2) 1))))))))\n (Def\n (Label add1)\n (Finfo2\n (conflicts\n (((VarL x.1) ((RegL Rsp)))\n ((RegL Rsp) ((VarL x.1) (RegL Rax)))\n ((RegL Rax) ((RegL Rsp))))))\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label add1_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Var x.1))\n (Movq (Var x.1) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label add1_conclusion)))))))))\n (Def\n (Label give_me_add1)\n (Finfo2\n (conflicts\n (((VarL add1) ((RegL Rsp)))\n ((RegL Rsp) ((VarL add1) (RegL Rax)))\n ((RegL Rax) ((RegL Rsp))))))\n ((nparams 0)\n (locals\n ((add1 (Function (Integer) Integer))))\n (body\n (((Label give_me_add1_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label add1))\n (Reg Rax))\n (Jmp (Label give_me_add1_conclusion)))))))))))\n", + "ar": "(X86Program\n ((Def\n (Label main)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1\n (Function\n ()\n (Function (Integer) Integer)))\n ($tmp.2 (Function (Integer) Integer))\n (give_me_add1\n (Function\n ()\n (Function (Integer) Integer)))))\n (body\n (((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label give_me_add1))\n (Reg Rcx))\n (IndirectCallq (Reg Rcx) 0)\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 41) (Reg Rdi))\n (TailJmp (Reg Rcx) 1))))))))\n (Def\n (Label add1)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label add1_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label add1_conclusion)))))))))\n (Def\n (Label give_me_add1)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n ((add1 (Function (Integer) Integer))))\n (body\n (((Label give_me_add1_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label add1))\n (Reg Rax))\n (Jmp (Label give_me_add1_conclusion)))))))))))\n", + "rj": "(X86Program\n ((Def\n (Label main)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1\n (Function\n ()\n (Function (Integer) Integer)))\n ($tmp.2 (Function (Integer) Integer))\n (give_me_add1\n (Function\n ()\n (Function (Integer) Integer)))))\n (body\n (((Label main_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label give_me_add1))\n (Reg Rcx))\n (IndirectCallq (Reg Rcx) 0)\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 41) (Reg Rdi))\n (TailJmp (Reg Rcx) 1))))))))\n (Def\n (Label add1)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label add1_start)\n (Block\n Binfo1\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label add1_conclusion)))))))))\n (Def\n (Label give_me_add1)\n (Finfo3\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n ((add1 (Function (Integer) Integer))))\n (body\n (((Label give_me_add1_start)\n (Block\n Binfo1\n ((Leaq\n (GlobalArg (Label add1))\n (Reg Rax))\n (Jmp (Label give_me_add1_conclusion)))))))))))\n", + "pi": "(X86Program\n ((Def\n (Label main)\n (Finfo\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n (($tmp.1\n (Function\n ()\n (Function (Integer) Integer)))\n ($tmp.2 (Function (Integer) Integer))\n (give_me_add1\n (Function\n ()\n (Function (Integer) Integer)))))\n (body\n (((Label main_start)\n (Block\n ((Leaq\n (GlobalArg (Label give_me_add1))\n (Reg Rcx))\n (IndirectCallq (Reg Rcx) 0)\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 41) (Reg Rdi))\n (Movq (Reg Rcx) (Reg Rax))\n (TailJmp (Reg Rax) 1))))))))\n (Def\n (Label add1)\n (Finfo\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 1)\n (locals ((x.1 Integer) (x.1 Integer)))\n (body\n (((Label add1_start)\n (Block\n ((Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label add1_conclusion)))))))))\n (Def\n (Label give_me_add1)\n (Finfo\n (num_spilled 0)\n (num_spilled_root 0)\n (used_callee ()))\n ((nparams 0)\n (locals\n ((add1 (Function (Integer) Integer))))\n (body\n (((Label give_me_add1_start)\n (Block\n ((Leaq\n (GlobalArg (Label add1))\n (Reg Rax))\n (Jmp (Label give_me_add1_conclusion)))))))))))\n", + "pc": "(X86Program\n ((Label main_start)\n (Leaq\n (GlobalArg Rip (Label give_me_add1))\n (Reg Rcx))\n (IndirectCallq (Reg Rcx))\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 41) (Reg Rdi))\n (Movq (Reg Rcx) (Reg Rax))\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n (TailJmp (Reg Rax))\n (Global (Label main))\n (Align 8)\n (Label main)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Subq (Imm 0) (Reg Rsp))\n (Movq (Imm 65536) (Reg Rdi))\n (Movq (Imm 65536) (Reg Rsi))\n (Callq (Label initialize))\n (Movq\n (GlobalArg Rip (Label rootstack_begin))\n (Reg R15))\n (Addq (Imm 0) (Reg R15))\n (Jmp (Label main_start))\n (Label main_conclusion)\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n Retq\n (Label add1_start)\n (Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label add1_conclusion))\n (Global (Label add1))\n (Align 8)\n (Label add1)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Subq (Imm 0) (Reg Rsp))\n (Addq (Imm 0) (Reg R15))\n (Jmp (Label add1_start))\n (Label add1_conclusion)\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n Retq\n (Label give_me_add1_start)\n (Leaq\n (GlobalArg Rip (Label add1))\n (Reg Rax))\n (Jmp (Label give_me_add1_conclusion))\n (Global (Label give_me_add1))\n (Align 8)\n (Label give_me_add1)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Subq (Imm 0) (Reg Rsp))\n (Addq (Imm 0) (Reg R15))\n (Jmp (Label give_me_add1_start))\n (Label give_me_add1_conclusion)\n (Subq (Imm 0) (Reg R15))\n (Addq (Imm 0) (Reg Rsp))\n (Popq (Reg Rbp))\n Retq))\n", + "opt": "(X86Program\n ((Label main_start)\n (Leaq\n (GlobalArg Rip (Label give_me_add1))\n (Reg Rcx))\n (IndirectCallq (Reg Rcx))\n (Movq (Reg Rax) (Reg Rcx))\n (Movq (Imm 41) (Reg Rdi))\n (Movq (Reg Rcx) (Reg Rax))\n (Popq (Reg Rbp))\n (TailJmp (Reg Rax))\n (Global (Label main))\n (Align 8)\n (Label main)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Movq (Imm 65536) (Reg Rdi))\n (Movq (Imm 65536) (Reg Rsi))\n (Callq (Label initialize))\n (Movq\n (GlobalArg Rip (Label rootstack_begin))\n (Reg R15))\n (Jmp (Label main_start))\n (Label main_conclusion)\n (Popq (Reg Rbp))\n Retq\n (Label add1_start)\n (Movq (Reg Rdi) (Reg Rcx))\n (Movq (Reg Rcx) (Reg Rax))\n (Addq (Imm 1) (Reg Rax))\n (Jmp (Label add1_conclusion))\n (Global (Label add1))\n (Align 8)\n (Label add1)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Jmp (Label add1_start))\n (Label add1_conclusion)\n (Popq (Reg Rbp))\n Retq\n (Label give_me_add1_start)\n (Leaq\n (GlobalArg Rip (Label add1))\n (Reg Rax))\n (Jmp (Label give_me_add1_conclusion))\n (Global (Label give_me_add1))\n (Align 8)\n (Label give_me_add1)\n (Pushq (Reg Rbp))\n (Movq (Reg Rsp) (Reg Rbp))\n (Jmp (Label give_me_add1_start))\n (Label give_me_add1_conclusion)\n (Popq (Reg Rbp))\n Retq))\n", + "pa": "main_start:\n leaq give_me_add1(%rip), %rcx\n callq *%rcx\n movq %rax, %rcx\n movq $41, %rdi\n movq %rcx, %rax\n popq %rbp\n jmp *%rax\n\n .globl main\n .align 8\n\nmain:\n pushq %rbp\n movq %rsp, %rbp\n movq $65536, %rdi\n movq $65536, %rsi\n callq initialize\n movq rootstack_begin(%rip), %r15\n jmp main_start\n\nmain_conclusion:\n popq %rbp\n retq\n\nadd1_start:\n movq %rdi, %rcx\n movq %rcx, %rax\n addq $1, %rax\n jmp add1_conclusion\n\n .globl add1\n .align 8\n\nadd1:\n pushq %rbp\n movq %rsp, %rbp\n jmp add1_start\n\nadd1_conclusion:\n popq %rbp\n retq\n\ngive_me_add1_start:\n leaq add1(%rip), %rax\n jmp give_me_add1_conclusion\n\n .globl give_me_add1\n .align 8\n\ngive_me_add1:\n pushq %rbp\n movq %rsp, %rbp\n jmp give_me_add1_start\n\ngive_me_add1_conclusion:\n popq %rbp\n retq\n" + } + } + ], + "passes": [ + { + "id": "lfun", + "name": "Parse", + "description": "Parse source into Lfun AST" + }, + { + "id": "tc1", + "name": "Type Check", + "description": "Type check the Lfun program" + }, + { + "id": "sh", + "name": "Shrink", + "description": "Remove And/Or sugar, wrap body in main def" + }, + { + "id": "un", + "name": "Uniquify", + "description": "Ensure all variables have unique names" + }, + { + "id": "rf", + "name": "Reveal Functions", + "description": "Replace function names with FunRef" + }, + { + "id": "lf", + "name": "Limit Functions", + "description": "Package excess args (>6) into tuples" + }, + { + "id": "tc1b", + "name": "Type Check (Ref)", + "description": "Type check after function transformations" + }, + { + "id": "ea", + "name": "Expose Allocation", + "description": "Lower vector to collect/allocate/global_value" + }, + { + "id": "ug", + "name": "Uncover Get", + "description": "Uncover get operations for vectors" + }, + { + "id": "rc", + "name": "Remove Complex", + "description": "Make all operands atomic (Int or Var)" + }, + { + "id": "ec", + "name": "Explicate Control", + "description": "Flatten into sequential assignments + jumps" + }, + { + "id": "tc2", + "name": "Type Check (C)", + "description": "Type check the C-like IR" + }, + { + "id": "ru", + "name": "Remove Unused", + "description": "Remove unreachable jump blocks" + }, + { + "id": "si", + "name": "Select Instructions", + "description": "Convert to x86 instruction IR" + }, + { + "id": "ul", + "name": "Uncover Live", + "description": "Liveness analysis on instructions" + }, + { + "id": "bi", + "name": "Build Interference", + "description": "Build interference graph from liveness" + }, + { + "id": "ar", + "name": "Allocate Registers", + "description": "Graph coloring register allocation" + }, + { + "id": "rj", + "name": "Remove Jumps", + "description": "Merge trivially-jumped blocks" + }, + { + "id": "pi", + "name": "Patch Instructions", + "description": "Fix x86 operand restrictions" + }, + { + "id": "pc", + "name": "Prelude/Conclusion", + "description": "Add function prologue/epilogue" + }, + { + "id": "opt", + "name": "Optimize", + "description": "Remove no-op instructions" + }, + { + "id": "pa", + "name": "Print Assembly", + "description": "Emit final x86-64 assembly" + } + ] +};