Skip to content

Commit

Permalink
Add loop control flow tests with logical operators (#3456)
Browse files Browse the repository at this point in the history
* Test loop, for, and while loops with logical and and logical or
  conditions
  • Loading branch information
alan-baker authored Mar 21, 2024
1 parent 278383f commit 21d1000
Show file tree
Hide file tree
Showing 4 changed files with 170 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/webgpu/listing_meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -1694,13 +1694,17 @@
"webgpu:shader,execution,flow_control,for:for_continue:*": { "subcaseMS": 10.601 },
"webgpu:shader,execution,flow_control,for:for_continuing:*": { "subcaseMS": 5.000 },
"webgpu:shader,execution,flow_control,for:for_initalizer:*": { "subcaseMS": 7.751 },
"webgpu:shader,execution,flow_control,for:for_logical_and_condition:*": { "subcaseMS": 46.477 },
"webgpu:shader,execution,flow_control,for:for_logical_or_condition:*": { "subcaseMS": 48.615 },
"webgpu:shader,execution,flow_control,for:nested_for_break:*": { "subcaseMS": 5.901 },
"webgpu:shader,execution,flow_control,for:nested_for_continue:*": { "subcaseMS": 12.851 },
"webgpu:shader,execution,flow_control,if:else_if:*": { "subcaseMS": 7.950 },
"webgpu:shader,execution,flow_control,if:if_false:*": { "subcaseMS": 11.201 },
"webgpu:shader,execution,flow_control,if:if_true:*": { "subcaseMS": 4.850 },
"webgpu:shader,execution,flow_control,if:nested_if_else:*": { "subcaseMS": 11.650 },
"webgpu:shader,execution,flow_control,loop:loop_break:*": { "subcaseMS": 6.000 },
"webgpu:shader,execution,flow_control,loop:loop_break_if_logical_and_condition:*": { "subcaseMS": 6.827 },
"webgpu:shader,execution,flow_control,loop:loop_break_if_logical_or_condition:*": { "subcaseMS": 5.846 },
"webgpu:shader,execution,flow_control,loop:loop_continue:*": { "subcaseMS": 11.200 },
"webgpu:shader,execution,flow_control,loop:loop_continuing_basic:*": { "subcaseMS": 12.450 },
"webgpu:shader,execution,flow_control,loop:nested_loops:*": { "subcaseMS": 12.900 },
Expand All @@ -1721,6 +1725,8 @@
"webgpu:shader,execution,flow_control,while:while_basic:*": { "subcaseMS": 5.951 },
"webgpu:shader,execution,flow_control,while:while_break:*": { "subcaseMS": 12.450 },
"webgpu:shader,execution,flow_control,while:while_continue:*": { "subcaseMS": 5.650 },
"webgpu:shader,execution,flow_control,while:while_logical_and_condition:*": { "subcaseMS": 55.574 },
"webgpu:shader,execution,flow_control,while:while_logical_or_condition:*": { "subcaseMS": 49.961 },
"webgpu:shader,execution,flow_control,while:while_nested_break:*": { "subcaseMS": 12.701 },
"webgpu:shader,execution,flow_control,while:while_nested_continue:*": { "subcaseMS": 5.450 },
"webgpu:shader,execution,memory_layout:read_layout:*": { "subcaseMS": 0.000 },
Expand Down
50 changes: 50 additions & 0 deletions src/webgpu/shader/execution/flow_control/for.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -269,3 +269,53 @@ g.test('nested_for_continue')
`
);
});

g.test('for_logical_and_condition')
.desc('Test flow control for a for-loop with a logical and condition')
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(t, f => ({
entrypoint: `
${f.expect_order(0)}
for (var i = ${f.value(0)}; a(i) && b(i); i++) {
${f.expect_order(3, 6)}
}
${f.expect_order(8)}
`,
extra: `
fn a(i : i32) -> bool {
${f.expect_order(1, 4, 7)}
return i < ${f.value(2)};
}
fn b(i : i32) -> bool {
${f.expect_order(2, 5)}
return i < ${f.value(5)};
}
`,
}));
});

g.test('for_logical_or_condition')
.desc('Test flow control for a for-loop with a logical or condition')
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(t, f => ({
entrypoint: `
${f.expect_order(0)}
for (var i = ${f.value(0)}; a(i) || b(i); i++) {
${f.expect_order(2, 4, 7, 10)}
}
${f.expect_order(13)}
`,
extra: `
fn a(i : i32) -> bool {
${f.expect_order(1, 3, 5, 8, 11)}
return i < ${f.value(2)};
}
fn b(i : i32) -> bool {
${f.expect_order(6, 9, 12)}
return i < ${f.value(4)};
}
`,
}));
});
60 changes: 60 additions & 0 deletions src/webgpu/shader/execution/flow_control/loop.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,3 +123,63 @@ g.test('nested_loops')
`
);
});

g.test('loop_break_if_logical_and_condition')
.desc('Test flow control for a loop with a logical and break if')
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(t, f => ({
entrypoint: `
${f.expect_order(0)}
var i = ${f.value(0)};
loop {
${f.expect_order(1, 4, 7)}
continuing {
i++;
break if !(a(i) && b(i));
}
}
${f.expect_order(9)}
`,
extra: `
fn a(i : i32) -> bool {
${f.expect_order(2, 5, 8)}
return i < ${f.value(3)};
}
fn b(i : i32) -> bool {
${f.expect_order(3, 6)}
return i < ${f.value(5)};
}
`,
}));
});

g.test('loop_break_if_logical_or_condition')
.desc('Test flow control for a loop with a logical or break if')
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(t, f => ({
entrypoint: `
${f.expect_order(0)}
var i = ${f.value(0)};
loop {
${f.expect_order(1, 3, 6, 9)}
continuing {
i++;
break if !(a(i) || b(i));
}
}
${f.expect_order(12)}
`,
extra: `
fn a(i : i32) -> bool {
${f.expect_order(2, 4, 7, 10)}
return i < ${f.value(2)};
}
fn b(i : i32) -> bool {
${f.expect_order(5, 8, 11)}
return i < ${f.value(4)};
}
`,
}));
});
54 changes: 54 additions & 0 deletions src/webgpu/shader/execution/flow_control/while.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,3 +138,57 @@ g.test('while_nested_continue')
`
);
});

g.test('while_logical_and_condition')
.desc('Test flow control for a while-loop with a logical and condition')
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(t, f => ({
entrypoint: `
${f.expect_order(0)}
var i = ${f.value(0)};
while (a(i) && b(i)) {
${f.expect_order(3, 6)}
i++;
}
${f.expect_order(8)}
`,
extra: `
fn a(i : i32) -> bool {
${f.expect_order(1, 4, 7)}
return i < ${f.value(2)};
}
fn b(i : i32) -> bool {
${f.expect_order(2, 5)}
return i < ${f.value(5)};
}
`,
}));
});

g.test('while_logical_or_condition')
.desc('Test flow control for a while-loop with a logical or condition')
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(t, f => ({
entrypoint: `
${f.expect_order(0)}
var i = ${f.value(0)};
while (a(i) || b(i)) {
${f.expect_order(2, 4, 7, 10)}
i++;
}
${f.expect_order(13)}
`,
extra: `
fn a(i : i32) -> bool {
${f.expect_order(1, 3, 5, 8, 11)}
return i < ${f.value(2)};
}
fn b(i : i32) -> bool {
${f.expect_order(6, 9, 12)}
return i < ${f.value(4)};
}
`,
}));
});

0 comments on commit 21d1000

Please sign in to comment.