From b899bf077f21187a39a5afb584c7dd65ee0d1044 Mon Sep 17 00:00:00 2001 From: Yingchi Long Date: Fri, 21 Jun 2024 18:35:56 +0800 Subject: [PATCH] mix-object: auto bisect ref miscompilation --- src/mix-object.ts | 65 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/src/mix-object.ts b/src/mix-object.ts index 6c7edd7..c485377 100644 --- a/src/mix-object.ts +++ b/src/mix-object.ts @@ -6,7 +6,7 @@ * 3. Link the set to an executable -> SPEC path, invoke "runcpu" */ -import { binSearch } from "./algorithm"; +import { autoBisect, binSearch } from "./algorithm"; import { pop2, SPEC, Bench, mkBench, mkSPEC, defaultSPEC, watchSPEC, parseSPECCSVResultsTable } from "./spec"; import path from "path"; import { FLANG, LLVM_EXTRACT, PREFIX, SW_AUTOVEC, SYSROOT_PREFIX, projectRoot } from "./environment"; @@ -274,7 +274,7 @@ async function verifyGridFunction() { }; -(async () => { +async function checkBaro() { // It is known that object index == 207 is also wrong for pop2. const spec = defaultSPEC; @@ -479,4 +479,65 @@ async function verifyGridFunction() { console.log("SPEC does not produce CSV output!"); } } +}; + + +async function bisectRef() { + const spec = defaultSPEC; + + const [vector, scalar] = buildDirs.map(dir => buildPathObj(spec.buildpath(pop2))(dir)); + + const pop2Bench = mkPop2Bench(spec); + + + return await autoBisect(0, pop2.objectNames.length, async (begin, end) => { + console.log(`Checking range [${begin}, ${end})`); + + console.log("Linking pop2 executable"); + await pop2Bench.link(names => + names.map((name, index) => { + // These two objects are known to have miscompilation. + if (name === "grid.fppized.o" || index == 207) { + return scalar(name); + } + + // If index is in range [begin, end), use the vector version. + return begin <= index && index < end ? vector(name) : scalar(name); + })); + + console.log("Running SPEC2017 benchmark."); + + const specProcess = spawn("runcpu", + [ + ...runcpuOptions({ + benchmarks: [pop2Bench.benchData().num.toString()], + config: "clang-O2.cfg", + workload: "ref", + buildType: "nobuild", + outputFormat: ["csv", "config"] + }), + ], { env: spec.getEnvironment() }); + + const result = await watchSPEC(specProcess); + + if ("CSV" in result.outputFiles) { + assert(result.outputFiles.CSV.length > 0); + const Results = parseSPECCSVResultsTable((await fs.readFile(result.outputFiles.CSV[0])) + .toString("utf-8")); + const benchResult = Results[`${pop2.num}.${pop2.name}`]; + if (benchResult) { + const status = benchResult.baseStatus; + console.log(`status of this run: ${status}`); + return status !== "S"; + } + assert(false, "Result should have pop2 field!"); + } else { + console.log("SPEC does not produce CSV output!"); + return true; + } + }); +} + +(async () => { + console.log(await bisectRef()); })();