summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/Precompute.cpp18
-rw-r--r--test/passes/precompute_all-features.txt9
-rw-r--r--test/passes/precompute_all-features.wast7
3 files changed, 10 insertions, 24 deletions
diff --git a/src/passes/Precompute.cpp b/src/passes/Precompute.cpp
index fa6e8e9ed..a832c9e85 100644
--- a/src/passes/Precompute.cpp
+++ b/src/passes/Precompute.cpp
@@ -172,8 +172,17 @@ struct Precompute
if (Properties::isConstantExpression(curr) || curr->is<Nop>()) {
return;
}
+ // Until engines implement v128.const and we have SIMD-aware optimizations
+ // that can break large v128.const instructions into smaller consts and
+ // splats, do not try to precompute v128 expressions.
+ if (curr->type.isVector()) {
+ return;
+ }
// try to evaluate this into a const
Flow flow = precomputeExpression(curr);
+ if (flow.getType().hasVector()) {
+ return;
+ }
if (!canEmitConstantFor(flow.values)) {
return;
}
@@ -227,12 +236,6 @@ private:
// Precompute an expression, returning a flow, which may be a constant
// (that we can replace the expression with if replaceExpression is set).
Flow precomputeExpression(Expression* curr, bool replaceExpression = true) {
- // Until engines implement v128.const and we have SIMD-aware optimizations
- // that can break large v128.const instructions into smaller consts and
- // splats, do not try to precompute v128 expressions.
- if (curr->type.isVector()) {
- return Flow(NONCONSTANT_FLOW);
- }
Flow flow;
try {
flow =
@@ -247,9 +250,6 @@ private:
!canEmitConstantFor(flow.values)) {
return Flow(NONCONSTANT_FLOW);
}
- if (flow.getType().hasVector()) {
- return Flow(NONCONSTANT_FLOW);
- }
return flow;
}
diff --git a/test/passes/precompute_all-features.txt b/test/passes/precompute_all-features.txt
index dc93f90e4..b707f4248 100644
--- a/test/passes/precompute_all-features.txt
+++ b/test/passes/precompute_all-features.txt
@@ -1,8 +1,8 @@
(module
(type $none_=>_none (func))
(type $none_=>_i32 (func (result i32)))
- (type $none_=>_v128 (func (result v128)))
(type $none_=>_f64 (func (result f64)))
+ (type $none_=>_v128 (func (result v128)))
(type $0 (func (param i32)))
(type $none_=>_i32_i64 (func (result i32 i64)))
(type $none_=>_externref (func (result externref)))
@@ -222,13 +222,6 @@
(i32.const 0)
)
)
- (func $no-simd-precompute_2 (result v128)
- (i32x4.extadd_pairwise_i16x8_s
- (i32x4.splat
- (i32.const 0)
- )
- )
- )
(func $no-simd-precompute-if (result v128)
(return
(i32x4.splat
diff --git a/test/passes/precompute_all-features.wast b/test/passes/precompute_all-features.wast
index e306be495..1275524e0 100644
--- a/test/passes/precompute_all-features.wast
+++ b/test/passes/precompute_all-features.wast
@@ -329,13 +329,6 @@
(i32.const 0)
)
)
- (func $no-simd-precompute_2 (result v128)
- (i32x4.extadd_pairwise_i16x8_s
- (i32x4.splat
- (i32.const 0)
- )
- )
- )
(func $no-simd-precompute-if (result v128)
(return
(i32x4.splat