Skip to content

Commit 45786b5

Browse files
Dominik KlembaV8-internal LUCI CQ
authored andcommitted
Fix DestructArray simplification logic
Change the loop condition to compare the iteration index against 'indices.count - 1' instead of 'indices.last!'. Also added regression test testDestructuringSimplificationWithRest, which reproduces the original bug using sparse indices with 'lastIsRest' set to true, ensuring that DestructArray is simplified into GetElement and a residual DestructArray for the rest elements. Change-Id: Ic630615bb85231d703046be4dc669e4314927db2 Reviewed-on: https://chrome-internal-review.googlesource.com/c/v8/fuzzilli/+/9027276 Reviewed-by: Matthias Liedtke <mliedtke@google.com> Auto-Submit: Dominik Klemba <tacet@google.com> Commit-Queue: Matthias Liedtke <mliedtke@google.com> Reviewed-by: Michael Achenbach <machenbach@google.com>
1 parent 98e2354 commit 45786b5

2 files changed

Lines changed: 34 additions & 1 deletion

File tree

Sources/Fuzzilli/Minimization/InstructionSimplifier.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ struct InstructionSimplifier: Reducer {
143143

144144
let outputs = Array(instr.outputs)
145145
for (i, idx) in op.indices.enumerated() {
146-
if i == op.indices.last! && op.lastIsRest {
146+
if i == op.indices.count - 1 && op.lastIsRest {
147147
newCode.append(Instruction(DestructArray(indices: [idx], lastIsRest: true), output: outputs.last!, inputs: [instr.input(0)]))
148148
} else {
149149
newCode.append(Instruction(GetElement(index: idx, isGuarded: false), output: outputs[i], inputs: [instr.input(0)]))

Tests/FuzzilliTests/MinimizerTest.swift

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1434,6 +1434,39 @@ class MinimizerTests: XCTestCase {
14341434
XCTAssertEqual(expectedProgram, actualProgram)
14351435
}
14361436

1437+
func testDestructuringSimplificationWithRest() {
1438+
let evaluator = EvaluatorForMinimizationTests()
1439+
let fuzzer = makeMockFuzzer(evaluator: evaluator)
1440+
let b = fuzzer.makeBuilder()
1441+
1442+
// Build input program to be minimized.
1443+
var o = b.createNamedVariable(forBuiltin: "TheArray")
1444+
let vars = b.destruct(o, selecting: [0, 2], lastIsRest: true)
1445+
1446+
var print = b.createNamedVariable(forBuiltin: "print")
1447+
evaluator.nextInstructionIsImportant(in: b)
1448+
b.callFunction(print, withArgs: [vars[0], vars[1]])
1449+
1450+
let originalProgram = b.finalize()
1451+
1452+
// Build expected output program.
1453+
o = b.createNamedVariable(forBuiltin: "TheArray")
1454+
let e0 = b.getElement(0, of: o)
1455+
let restVars = b.destruct(o, selecting: [2], lastIsRest: true)
1456+
1457+
print = b.createNamedVariable(forBuiltin: "print")
1458+
b.callFunction(print, withArgs: [e0, restVars[0]])
1459+
1460+
let expectedProgram = b.finalize()
1461+
1462+
// See testDestructuringSimplification2 for why these are marked important.
1463+
evaluator.operationIsImportant(DestructArray.self)
1464+
evaluator.operationIsImportant(GetElement.self)
1465+
1466+
let actualProgram = minimize(originalProgram, with: fuzzer)
1467+
XCTAssertEqual(actualProgram, expectedProgram)
1468+
}
1469+
14371470
func testVariableDeduplication() {
14381471
let evaluator = EvaluatorForMinimizationTests()
14391472
let fuzzer = makeMockFuzzer(evaluator: evaluator)

0 commit comments

Comments
 (0)