[turbofan] Lower NumberConstant nodes to IntPtrConstant.
If a NumberConstant can be represented as a Smi, then lower it to a
IntPtrConstant node during simplified lowering. Thanks to this, all backends can
match Smi values that can also be encoded as immediates in the instruction
selector. Additionally, we can apply the same lowering to the CodeAssembler for
the snapshot.
As a result, we can remove `mov` instructions generated because Int32Matcher and
Int64Matcher didn't not recognize Smis:
For 32-bit target, it's common for Smis also be immediates: "if (a < 100) {}"
~~~
mov r1, #200 -> cmp r0, #200
cmp r0, r1 -> blt <>
blt <> ->
~~~
On Arm64 particularly, we lose opportunites to use `cbz`: "if (a == 0) {}"
~~~
movz x0, #0x0 -> cbz x1 <>
cmp x1, x0 ->
b.eq <> ->
~~~
Overall, we do not see an impact on benchmarks such as webtooling. However, we
do see noteworthy code size reduction, from 0.5% to 1.5%.
Bug:
Change-Id: I7fbb718ad51b9036c3514fa31c1326bdd6f2b0e6
Reviewed-on: https://chromium-review.googlesource.com/848814
Reviewed-by: Jaroslav Sevcik <jarin@chromium.org>
Reviewed-by: Benedikt Meurer <bmeurer@chromium.org>
Commit-Queue: Pierre Langlois <pierre.langlois@arm.com>
Cr-Commit-Position: refs/heads/master@{#50569}
2018-01-03 18:30:45 +00:00
|
|
|
// Copyright 2017 the V8 project authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
// found in the LICENSE file.
|
|
|
|
|
|
|
|
#include "src/compiler/simplified-lowering.h"
|
|
|
|
|
2019-07-16 21:46:08 +00:00
|
|
|
#include "src/codegen/tick-counter.h"
|
[turbofan] Lower NumberConstant nodes to IntPtrConstant.
If a NumberConstant can be represented as a Smi, then lower it to a
IntPtrConstant node during simplified lowering. Thanks to this, all backends can
match Smi values that can also be encoded as immediates in the instruction
selector. Additionally, we can apply the same lowering to the CodeAssembler for
the snapshot.
As a result, we can remove `mov` instructions generated because Int32Matcher and
Int64Matcher didn't not recognize Smis:
For 32-bit target, it's common for Smis also be immediates: "if (a < 100) {}"
~~~
mov r1, #200 -> cmp r0, #200
cmp r0, r1 -> blt <>
blt <> ->
~~~
On Arm64 particularly, we lose opportunites to use `cbz`: "if (a == 0) {}"
~~~
movz x0, #0x0 -> cbz x1 <>
cmp x1, x0 ->
b.eq <> ->
~~~
Overall, we do not see an impact on benchmarks such as webtooling. However, we
do see noteworthy code size reduction, from 0.5% to 1.5%.
Bug:
Change-Id: I7fbb718ad51b9036c3514fa31c1326bdd6f2b0e6
Reviewed-on: https://chromium-review.googlesource.com/848814
Reviewed-by: Jaroslav Sevcik <jarin@chromium.org>
Reviewed-by: Benedikt Meurer <bmeurer@chromium.org>
Commit-Queue: Pierre Langlois <pierre.langlois@arm.com>
Cr-Commit-Position: refs/heads/master@{#50569}
2018-01-03 18:30:45 +00:00
|
|
|
#include "src/compiler/compiler-source-position-table.h"
|
|
|
|
#include "src/compiler/machine-operator.h"
|
|
|
|
#include "src/compiler/simplified-operator.h"
|
|
|
|
|
|
|
|
#include "test/unittests/compiler/graph-unittest.h"
|
|
|
|
#include "test/unittests/compiler/node-test-utils.h"
|
|
|
|
|
|
|
|
namespace v8 {
|
|
|
|
namespace internal {
|
|
|
|
namespace compiler {
|
|
|
|
|
|
|
|
class SimplifiedLoweringTest : public GraphTest {
|
|
|
|
public:
|
|
|
|
explicit SimplifiedLoweringTest(int num_parameters = 1)
|
|
|
|
: GraphTest(num_parameters),
|
|
|
|
num_parameters_(num_parameters),
|
|
|
|
machine_(zone()),
|
|
|
|
javascript_(zone()),
|
|
|
|
simplified_(zone()),
|
|
|
|
jsgraph_(isolate(), graph(), common(), &javascript_, &simplified_,
|
|
|
|
&machine_) {}
|
2018-09-17 11:30:48 +00:00
|
|
|
~SimplifiedLoweringTest() override = default;
|
[turbofan] Lower NumberConstant nodes to IntPtrConstant.
If a NumberConstant can be represented as a Smi, then lower it to a
IntPtrConstant node during simplified lowering. Thanks to this, all backends can
match Smi values that can also be encoded as immediates in the instruction
selector. Additionally, we can apply the same lowering to the CodeAssembler for
the snapshot.
As a result, we can remove `mov` instructions generated because Int32Matcher and
Int64Matcher didn't not recognize Smis:
For 32-bit target, it's common for Smis also be immediates: "if (a < 100) {}"
~~~
mov r1, #200 -> cmp r0, #200
cmp r0, r1 -> blt <>
blt <> ->
~~~
On Arm64 particularly, we lose opportunites to use `cbz`: "if (a == 0) {}"
~~~
movz x0, #0x0 -> cbz x1 <>
cmp x1, x0 ->
b.eq <> ->
~~~
Overall, we do not see an impact on benchmarks such as webtooling. However, we
do see noteworthy code size reduction, from 0.5% to 1.5%.
Bug:
Change-Id: I7fbb718ad51b9036c3514fa31c1326bdd6f2b0e6
Reviewed-on: https://chromium-review.googlesource.com/848814
Reviewed-by: Jaroslav Sevcik <jarin@chromium.org>
Reviewed-by: Benedikt Meurer <bmeurer@chromium.org>
Commit-Queue: Pierre Langlois <pierre.langlois@arm.com>
Cr-Commit-Position: refs/heads/master@{#50569}
2018-01-03 18:30:45 +00:00
|
|
|
|
|
|
|
void LowerGraph(Node* node) {
|
|
|
|
// Make sure we always start with an empty graph.
|
|
|
|
graph()->SetStart(graph()->NewNode(common()->Start(num_parameters())));
|
|
|
|
graph()->SetEnd(graph()->NewNode(common()->End(1), graph()->start()));
|
|
|
|
|
|
|
|
// Return {node} directly, so that we can match it with
|
|
|
|
// "IsReturn(expected)".
|
|
|
|
Node* zero = graph()->NewNode(common()->NumberConstant(0));
|
|
|
|
Node* ret = graph()->NewNode(common()->Return(), zero, node,
|
|
|
|
graph()->start(), graph()->start());
|
|
|
|
NodeProperties::MergeControlToEnd(graph(), common(), ret);
|
|
|
|
|
|
|
|
{
|
|
|
|
// Simplified lowering needs to run w/o the typer decorator so make sure
|
|
|
|
// the object is not live at the same time.
|
2019-07-16 21:46:08 +00:00
|
|
|
Typer typer(broker(), Typer::kNoFlags, graph(), tick_counter());
|
[turbofan] Lower NumberConstant nodes to IntPtrConstant.
If a NumberConstant can be represented as a Smi, then lower it to a
IntPtrConstant node during simplified lowering. Thanks to this, all backends can
match Smi values that can also be encoded as immediates in the instruction
selector. Additionally, we can apply the same lowering to the CodeAssembler for
the snapshot.
As a result, we can remove `mov` instructions generated because Int32Matcher and
Int64Matcher didn't not recognize Smis:
For 32-bit target, it's common for Smis also be immediates: "if (a < 100) {}"
~~~
mov r1, #200 -> cmp r0, #200
cmp r0, r1 -> blt <>
blt <> ->
~~~
On Arm64 particularly, we lose opportunites to use `cbz`: "if (a == 0) {}"
~~~
movz x0, #0x0 -> cbz x1 <>
cmp x1, x0 ->
b.eq <> ->
~~~
Overall, we do not see an impact on benchmarks such as webtooling. However, we
do see noteworthy code size reduction, from 0.5% to 1.5%.
Bug:
Change-Id: I7fbb718ad51b9036c3514fa31c1326bdd6f2b0e6
Reviewed-on: https://chromium-review.googlesource.com/848814
Reviewed-by: Jaroslav Sevcik <jarin@chromium.org>
Reviewed-by: Benedikt Meurer <bmeurer@chromium.org>
Commit-Queue: Pierre Langlois <pierre.langlois@arm.com>
Cr-Commit-Position: refs/heads/master@{#50569}
2018-01-03 18:30:45 +00:00
|
|
|
typer.Run();
|
|
|
|
}
|
|
|
|
|
2020-10-28 14:20:22 +00:00
|
|
|
Linkage* linkage = zone()->New<Linkage>(Linkage::GetJSCallDescriptor(
|
|
|
|
zone(), false, num_parameters_ + 1, CallDescriptor::kCanUseRoots));
|
2019-07-16 21:46:08 +00:00
|
|
|
SimplifiedLowering lowering(
|
|
|
|
jsgraph(), broker(), zone(), source_positions(), node_origins(),
|
2020-10-28 14:20:22 +00:00
|
|
|
PoisoningMitigationLevel::kDontPoison, tick_counter(), linkage);
|
[turbofan] Lower NumberConstant nodes to IntPtrConstant.
If a NumberConstant can be represented as a Smi, then lower it to a
IntPtrConstant node during simplified lowering. Thanks to this, all backends can
match Smi values that can also be encoded as immediates in the instruction
selector. Additionally, we can apply the same lowering to the CodeAssembler for
the snapshot.
As a result, we can remove `mov` instructions generated because Int32Matcher and
Int64Matcher didn't not recognize Smis:
For 32-bit target, it's common for Smis also be immediates: "if (a < 100) {}"
~~~
mov r1, #200 -> cmp r0, #200
cmp r0, r1 -> blt <>
blt <> ->
~~~
On Arm64 particularly, we lose opportunites to use `cbz`: "if (a == 0) {}"
~~~
movz x0, #0x0 -> cbz x1 <>
cmp x1, x0 ->
b.eq <> ->
~~~
Overall, we do not see an impact on benchmarks such as webtooling. However, we
do see noteworthy code size reduction, from 0.5% to 1.5%.
Bug:
Change-Id: I7fbb718ad51b9036c3514fa31c1326bdd6f2b0e6
Reviewed-on: https://chromium-review.googlesource.com/848814
Reviewed-by: Jaroslav Sevcik <jarin@chromium.org>
Reviewed-by: Benedikt Meurer <bmeurer@chromium.org>
Commit-Queue: Pierre Langlois <pierre.langlois@arm.com>
Cr-Commit-Position: refs/heads/master@{#50569}
2018-01-03 18:30:45 +00:00
|
|
|
lowering.LowerAllNodes();
|
|
|
|
}
|
|
|
|
|
|
|
|
int num_parameters() const { return num_parameters_; }
|
|
|
|
JSGraph* jsgraph() { return &jsgraph_; }
|
|
|
|
|
|
|
|
private:
|
|
|
|
const int num_parameters_;
|
|
|
|
MachineOperatorBuilder machine_;
|
|
|
|
JSOperatorBuilder javascript_;
|
|
|
|
SimplifiedOperatorBuilder simplified_;
|
|
|
|
JSGraph jsgraph_;
|
|
|
|
};
|
|
|
|
|
|
|
|
const int kSmiValues[] = {Smi::kMinValue,
|
|
|
|
Smi::kMinValue + 1,
|
|
|
|
Smi::kMinValue + 2,
|
|
|
|
3,
|
|
|
|
2,
|
|
|
|
1,
|
|
|
|
0,
|
|
|
|
-1,
|
|
|
|
-2,
|
|
|
|
-3,
|
|
|
|
Smi::kMaxValue - 2,
|
|
|
|
Smi::kMaxValue - 1,
|
|
|
|
Smi::kMaxValue};
|
|
|
|
|
|
|
|
TEST_F(SimplifiedLoweringTest, SmiConstantToIntPtrConstant) {
|
|
|
|
TRACED_FOREACH(int, x, kSmiValues) {
|
|
|
|
LowerGraph(jsgraph()->Constant(x));
|
|
|
|
intptr_t smi = bit_cast<intptr_t>(Smi::FromInt(x));
|
|
|
|
EXPECT_THAT(graph()->end()->InputAt(1),
|
|
|
|
IsReturn(IsIntPtrConstant(smi), start(), start()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace compiler
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace v8
|