Skip to content

Commit 456e573

Browse files
OptimizeInstructions: Use fallthrough for (unsigned)x < 0 ==> i32(0) (#7480)
Fixes: #7455
1 parent bba8a10 commit 456e573

File tree

2 files changed

+72
-4
lines changed

2 files changed

+72
-4
lines changed

src/passes/OptimizeInstructions.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -570,11 +570,13 @@ struct OptimizeInstructions
570570
return replaceCurrent(getDroppedChildrenAndAppend(curr, c));
571571
}
572572
// unsigned(x) < 0 => i32(0)
573-
if (matches(curr, binary(LtU, any(&x), ival(&c))) &&
573+
if (curr->op == Abstract::getBinary(curr->left->type, Abstract::LtU) &&
574+
(c = getFallthrough(curr->right)->dynCast<Const>()) &&
574575
c->value.isZero()) {
575-
c->value = Literal::makeZero(Type::i32);
576-
c->type = Type::i32;
577-
return replaceCurrent(getDroppedChildrenAndAppend(curr, c));
576+
// We could reuse c here, if we checked it had no more uses
577+
auto zero =
578+
Builder(*getModule()).makeConst(Literal::makeZero(Type::i32));
579+
return replaceCurrent(getDroppedChildrenAndAppend(curr, zero));
578580
}
579581
}
580582
}

test/lit/passes/optimize-instructions-mvp.wast

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@
175175
)
176176
)
177177
)
178+
178179
;; CHECK: (func $eqz-gt_s (result i32)
179180
;; CHECK-NEXT: (i32.eqz
180181
;; CHECK-NEXT: (i32.const 0)
@@ -11575,6 +11576,44 @@
1157511576
;; CHECK-NEXT: )
1157611577
;; CHECK-NEXT: )
1157711578
;; CHECK-NEXT: (drop
11579+
;; CHECK-NEXT: (block (result i32)
11580+
;; CHECK-NEXT: (drop
11581+
;; CHECK-NEXT: (i32.load
11582+
;; CHECK-NEXT: (i32.const 0)
11583+
;; CHECK-NEXT: )
11584+
;; CHECK-NEXT: )
11585+
;; CHECK-NEXT: (drop
11586+
;; CHECK-NEXT: (block (result i32)
11587+
;; CHECK-NEXT: (i32.store
11588+
;; CHECK-NEXT: (i32.const 0)
11589+
;; CHECK-NEXT: (i32.const 0)
11590+
;; CHECK-NEXT: )
11591+
;; CHECK-NEXT: (i32.const 0)
11592+
;; CHECK-NEXT: )
11593+
;; CHECK-NEXT: )
11594+
;; CHECK-NEXT: (i32.const 0)
11595+
;; CHECK-NEXT: )
11596+
;; CHECK-NEXT: )
11597+
;; CHECK-NEXT: (drop
11598+
;; CHECK-NEXT: (block (result i32)
11599+
;; CHECK-NEXT: (drop
11600+
;; CHECK-NEXT: (i64.load
11601+
;; CHECK-NEXT: (i32.const 0)
11602+
;; CHECK-NEXT: )
11603+
;; CHECK-NEXT: )
11604+
;; CHECK-NEXT: (drop
11605+
;; CHECK-NEXT: (block (result i64)
11606+
;; CHECK-NEXT: (i64.store
11607+
;; CHECK-NEXT: (i32.const 0)
11608+
;; CHECK-NEXT: (i64.const 0)
11609+
;; CHECK-NEXT: )
11610+
;; CHECK-NEXT: (i64.const 0)
11611+
;; CHECK-NEXT: )
11612+
;; CHECK-NEXT: )
11613+
;; CHECK-NEXT: (i32.const 0)
11614+
;; CHECK-NEXT: )
11615+
;; CHECK-NEXT: )
11616+
;; CHECK-NEXT: (drop
1157811617
;; CHECK-NEXT: (i32.ne
1157911618
;; CHECK-NEXT: (local.get $x)
1158011619
;; CHECK-NEXT: (i32.const 0)
@@ -11867,6 +11906,33 @@
1186711906
)
1186811907
(i64.const 0)
1186911908
))
11909+
(drop (i32.lt_u
11910+
(i32.load
11911+
(i32.const 0)
11912+
)
11913+
(block (result i32)
11914+
(i32.store
11915+
(i32.const 0)
11916+
(i32.const 0)
11917+
)
11918+
(i32.const 0)
11919+
)
11920+
)
11921+
)
11922+
(drop (i64.lt_u
11923+
(i64.load
11924+
(i32.const 0)
11925+
)
11926+
(block (result i64)
11927+
(i64.store
11928+
(i32.const 0)
11929+
(i64.const 0)
11930+
)
11931+
(i64.const 0)
11932+
)
11933+
)
11934+
)
11935+
1187011936

1187111937
;; (unsigned)x > 0 => x != 0
1187211938
(drop (i32.gt_u

0 commit comments

Comments
 (0)