Skip to content

Commit b85e8b5

Browse files
committed
zero shifts are not sign-extends
1 parent 26b2f33 commit b85e8b5

3 files changed

Lines changed: 80 additions & 10 deletions

File tree

src/ast/properties.h

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,13 @@ struct Properties {
6060
if (auto* outer = curr->dynCast<Binary>()) {
6161
if (outer->op == ShrSInt32) {
6262
if (auto* outerConst = outer->right->dynCast<Const>()) {
63-
if (auto* inner = outer->left->dynCast<Binary>()) {
64-
if (inner->op == ShlInt32) {
65-
if (auto* innerConst = inner->right->dynCast<Const>()) {
66-
if (outerConst->value == innerConst->value) {
67-
return inner->left;
63+
if (outerConst->value.geti32() != 0) {
64+
if (auto* inner = outer->left->dynCast<Binary>()) {
65+
if (inner->op == ShlInt32) {
66+
if (auto* innerConst = inner->right->dynCast<Const>()) {
67+
if (outerConst->value == innerConst->value) {
68+
return inner->left;
69+
}
6870
}
6971
}
7072
}
@@ -87,11 +89,13 @@ struct Properties {
8789
if (auto* outer = curr->dynCast<Binary>()) {
8890
if (outer->op == ShrSInt32) {
8991
if (auto* outerConst = outer->right->dynCast<Const>()) {
90-
if (auto* inner = outer->left->dynCast<Binary>()) {
91-
if (inner->op == ShlInt32) {
92-
if (auto* innerConst = inner->right->dynCast<Const>()) {
93-
if (outerConst->value.leU(innerConst->value).geti32()) {
94-
return inner->left;
92+
if (outerConst->value.geti32() != 0) {
93+
if (auto* inner = outer->left->dynCast<Binary>()) {
94+
if (inner->op == ShlInt32) {
95+
if (auto* innerConst = inner->right->dynCast<Const>()) {
96+
if (outerConst->value.leU(innerConst->value).geti32()) {
97+
return inner->left;
98+
}
9599
}
96100
}
97101
}

test/passes/optimize-instructions.txt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1962,4 +1962,34 @@
19621962
)
19631963
)
19641964
)
1965+
(func $zero-shifts-is-not-sign-ext (type $1)
1966+
(drop
1967+
(i32.eq
1968+
(i32.shr_s
1969+
(i32.shl
1970+
(i32.load16_s align=1
1971+
(i32.const 790656516)
1972+
)
1973+
(i32.const 0)
1974+
)
1975+
(i32.const 0)
1976+
)
1977+
(i32.const -5431187)
1978+
)
1979+
)
1980+
(drop
1981+
(i32.eq
1982+
(i32.shr_s
1983+
(i32.shl
1984+
(i32.load16_s align=1
1985+
(i32.const 790656516)
1986+
)
1987+
(i32.const 1)
1988+
)
1989+
(i32.const 0)
1990+
)
1991+
(i32.const -5431187)
1992+
)
1993+
)
1994+
)
19651995
)

test/passes/optimize-instructions.wast

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2359,4 +2359,40 @@
23592359
)
23602360
)
23612361
)
2362+
(func $zero-shifts-is-not-sign-ext
2363+
(drop
2364+
(i32.eq
2365+
(i32.const -5431187)
2366+
(i32.add
2367+
(i32.const 0)
2368+
(i32.shr_s
2369+
(i32.shl
2370+
(i32.load16_s align=1
2371+
(i32.const 790656516)
2372+
)
2373+
(i32.const 0)
2374+
)
2375+
(i32.const 0)
2376+
)
2377+
)
2378+
)
2379+
)
2380+
(drop
2381+
(i32.eq
2382+
(i32.const -5431187)
2383+
(i32.add
2384+
(i32.const 0)
2385+
(i32.shr_s
2386+
(i32.shl
2387+
(i32.load16_s align=1
2388+
(i32.const 790656516)
2389+
)
2390+
(i32.const 1)
2391+
)
2392+
(i32.const 0)
2393+
)
2394+
)
2395+
)
2396+
)
2397+
)
23622398
)

0 commit comments

Comments
 (0)