Skip to content

Commit 7611654

Browse files
modulovaluedart-scoped@luci-project-accounts.iam.gserviceaccount.com
authored andcommitted
[vm] Bound the Simd sign mask result range
TEST=lib/typed_data/int32x4_sign_mask_test lib/typed_data/float32x4_sign_mask_test lib/typed_data/float64x2_sign_mask_test Bug: #41950 Issue: #64170 Change-Id: Icf96d2b710b8518d2cedf5385d5e5966b30c68e5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/542363 Auto-Submit: Modestas Valauskas <valauskasmodestas@gmail.com> Commit-Queue: Slava Egorov <vegorov@google.com> Reviewed-by: Slava Egorov <vegorov@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com>
1 parent 6ee9ebc commit 7611654

2 files changed

Lines changed: 20 additions & 0 deletions

File tree

‎runtime/vm/compiler/backend/il.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11340,6 +11340,8 @@ class SimdOpInstr : public Definition {
1134011340

1134111341
virtual CompileType ComputeType() const;
1134211342

11343+
virtual void InferRange(RangeAnalysis* analysis, Range* range);
11344+
1134311345
virtual bool MayThrow() const { return false; }
1134411346
virtual bool ComputeCanDeoptimize() const { return false; }
1134511347

‎runtime/vm/compiler/backend/range_analysis.cc‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2985,6 +2985,24 @@ void Utf8ScanInstr::InferRange(RangeAnalysis* analysis, Range* range) {
29852985
*range = Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
29862986
}
29872987

2988+
void SimdOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
2989+
switch (kind()) {
2990+
// A sign mask has one bit per lane, so it is in [0, 2^lanes - 1].
2991+
case kInt32x4GetSignMask:
2992+
case kFloat32x4GetSignMask:
2993+
*range = Range(RangeBoundary::FromConstant(0),
2994+
RangeBoundary::FromConstant(15));
2995+
break;
2996+
case kFloat64x2GetSignMask:
2997+
*range =
2998+
Range(RangeBoundary::FromConstant(0), RangeBoundary::FromConstant(3));
2999+
break;
3000+
default:
3001+
Definition::InferRange(analysis, range);
3002+
break;
3003+
}
3004+
}
3005+
29883006
void IfThenElseInstr::InferRange(RangeAnalysis* analysis, Range* range) {
29893007
const intptr_t min = Utils::Minimum(if_true_, if_false_);
29903008
const intptr_t max = Utils::Maximum(if_true_, if_false_);

0 commit comments

Comments
 (0)