Skip to content

Commit f658cbc

Browse files
Fix bug in conditional-const-prop when targets of cbr are same (#6936)
Co-authored-by: Joshua Batty <joshpbatty@gmail.com>
1 parent d8854fa commit f658cbc

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

sway-ir/src/optimize/conditional_constprop.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,16 @@ pub fn ccp(
3636
if let InstOp::ConditionalBranch {
3737
cond_value,
3838
true_block,
39-
false_block: _,
39+
false_block,
4040
} = &term.op
4141
{
4242
if let Some(Instruction {
4343
parent: _,
4444
op: InstOp::Cmp(pred, v1, v2),
4545
}) = cond_value.get_instruction(context)
4646
{
47-
if matches!(pred, Predicate::Equal)
47+
if true_block.block != false_block.block
48+
&& matches!(pred, Predicate::Equal)
4849
&& (v1.is_constant(context) ^ v2.is_constant(context)
4950
&& true_block.block.num_predecessors(context) == 1)
5051
{

sway-ir/tests/ccp/ccp1.ir

+20
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,24 @@ script {
2626
v8 = add v7, p
2727
ret u64 v8
2828
}
29+
30+
// check: fn $ID($(param=$ID): u64) -> u64
31+
fn must_not_optimize(p: u64) -> u64 {
32+
// check: entry($(p=$ID): u64)
33+
entry(p: u64):
34+
// check: $(c=$ID) = const u64 100
35+
v0 = const u64 100
36+
// check: cmp eq $c $param
37+
v2 = cmp eq v0 p
38+
// check: $ID, $(true_block=$ID)(), $(false_block=$ID)()
39+
cbr v2, get_0_block0(), get_0_block0()
40+
41+
// check: $false_block():
42+
get_0_block0():
43+
// check: $(one=$ID) = const u64 1
44+
v5 = const u64 1
45+
// check: $(ID) = add $one, $p
46+
v6 = add v5, p
47+
ret u64 v6
48+
}
2949
}

0 commit comments

Comments
 (0)