Log Message
[JSC] Add lowering for B3's Sub operation with integers https://bugs.webkit.org/show_bug.cgi?id=150749
Patch by Benjamin Poulain <[email protected]> on 2015-10-30 Reviewed by Filip Pizlo. * b3/B3LowerToAir.cpp: (JSC::B3::Air::LowerToAir::trySub): (JSC::B3::Air::LowerToAir::tryStoreSubLoad): * b3/B3LoweringMatcher.patterns: Identical to Add but obviously NotCommutative. * b3/B3ReduceStrength.cpp: Turn Add/Sub with zero into an identity. I only added for Add since Sub with a constant is always turned into an Add. Also switched the Sub optimizations to put the strongest first. * b3/air/AirOpcode.opcodes: * b3/testb3.cpp: (JSC::B3::testAddArgImm): (JSC::B3::testAddImmArg): (JSC::B3::testSubArgs): (JSC::B3::testSubArgImm): (JSC::B3::testSubImmArg): (JSC::B3::testSubArgs32): (JSC::B3::testSubArgImm32): (JSC::B3::testSubImmArg32): (JSC::B3::testStoreSubLoad): (JSC::B3::run):
Modified Paths
- trunk/Source/_javascript_Core/ChangeLog
- trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp
- trunk/Source/_javascript_Core/b3/B3LoweringMatcher.patterns
- trunk/Source/_javascript_Core/b3/B3ReduceStrength.cpp
- trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes
- trunk/Source/_javascript_Core/b3/testb3.cpp
Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (191837 => 191838)
--- trunk/Source/_javascript_Core/ChangeLog 2015-10-31 04:02:19 UTC (rev 191837)
+++ trunk/Source/_javascript_Core/ChangeLog 2015-10-31 04:03:58 UTC (rev 191838)
@@ -1,5 +1,37 @@
2015-10-30 Benjamin Poulain <[email protected]>
+ [JSC] Add lowering for B3's Sub operation with integers
+ https://bugs.webkit.org/show_bug.cgi?id=150749
+
+ Reviewed by Filip Pizlo.
+
+ * b3/B3LowerToAir.cpp:
+ (JSC::B3::Air::LowerToAir::trySub):
+ (JSC::B3::Air::LowerToAir::tryStoreSubLoad):
+ * b3/B3LoweringMatcher.patterns:
+ Identical to Add but obviously NotCommutative.
+
+ * b3/B3ReduceStrength.cpp:
+ Turn Add/Sub with zero into an identity. I only added for
+ Add since Sub with a constant is always turned into an Add.
+
+ Also switched the Sub optimizations to put the strongest first.
+
+ * b3/air/AirOpcode.opcodes:
+ * b3/testb3.cpp:
+ (JSC::B3::testAddArgImm):
+ (JSC::B3::testAddImmArg):
+ (JSC::B3::testSubArgs):
+ (JSC::B3::testSubArgImm):
+ (JSC::B3::testSubImmArg):
+ (JSC::B3::testSubArgs32):
+ (JSC::B3::testSubArgImm32):
+ (JSC::B3::testSubImmArg32):
+ (JSC::B3::testStoreSubLoad):
+ (JSC::B3::run):
+
+2015-10-30 Benjamin Poulain <[email protected]>
+
[JSC] Add the Air Opcode definitions to the Xcode project file
https://bugs.webkit.org/show_bug.cgi?id=150701
Modified: trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp (191837 => 191838)
--- trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp 2015-10-31 04:02:19 UTC (rev 191837)
+++ trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp 2015-10-31 04:03:58 UTC (rev 191838)
@@ -547,6 +547,21 @@
return false;
}
}
+
+ bool trySub(Value* left, Value* right)
+ {
+ switch (left->type()) {
+ case Int32:
+ appendBinOp<Sub32>(left, right);
+ return true;
+ case Int64:
+ appendBinOp<Sub64>(left, right);
+ return true;
+ default:
+ // FIXME: Implement more types!
+ return false;
+ }
+ }
bool tryAnd(Value* left, Value* right)
{
@@ -573,7 +588,18 @@
return false;
}
}
-
+
+ bool tryStoreSubLoad(Value* left, Value* right, Value*)
+ {
+ switch (left->type()) {
+ case Int32:
+ return tryAppendStoreBinOp<Sub32, NotCommutative>(left, right);
+ default:
+ // FIXME: Implement more types!
+ return false;
+ }
+ }
+
bool tryStoreAndLoad(Value* left, Value* right, Value*)
{
switch (left->type()) {
Modified: trunk/Source/_javascript_Core/b3/B3LoweringMatcher.patterns (191837 => 191838)
--- trunk/Source/_javascript_Core/b3/B3LoweringMatcher.patterns 2015-10-31 04:02:19 UTC (rev 191837)
+++ trunk/Source/_javascript_Core/b3/B3LoweringMatcher.patterns 2015-10-31 04:03:58 UTC (rev 191838)
@@ -31,9 +31,11 @@
Load = Load(address)
Add = Add(left, right)
+Sub = Sub(left, right)
And = BitAnd(left, right)
StoreAddLoad = Store(Add(left, right), address)
+StoreSubLoad = Store(Add(left, right), address)
StoreAndLoad = Store(BitAnd(left, right), address)
Store = Store(value, address)
Modified: trunk/Source/_javascript_Core/b3/B3ReduceStrength.cpp (191837 => 191838)
--- trunk/Source/_javascript_Core/b3/B3ReduceStrength.cpp 2015-10-31 04:02:19 UTC (rev 191837)
+++ trunk/Source/_javascript_Core/b3/B3ReduceStrength.cpp 2015-10-31 04:03:58 UTC (rev 191838)
@@ -107,10 +107,28 @@
// Turn this: Add(constant1, constant2)
// Into this: constant1 + constant2
- replaceWithNewValue(m_value->child(0)->addConstant(m_proc, m_value->child(1)));
+ if (Value* constantAdd = m_value->child(0)->addConstant(m_proc, m_value->child(1))) {
+ replaceWithNewValue(constantAdd);
+ break;
+ }
+
+ // Turn this: Add(value, zero)
+ // Into an Identity.
+ if (m_value->child(1)->isInt(0)) {
+ m_value->replaceWithIdentity(m_value->child(0));
+ m_changed = true;
+ break;
+ }
break;
case Sub:
+ // Turn this: Sub(constant1, constant2)
+ // Into this: constant1 - constant2
+ if (Value* constantSub = m_value->child(0)->subConstant(m_proc, m_value->child(1))) {
+ replaceWithNewValue(constantSub);
+ break;
+ }
+
// Turn this: Sub(value, constant)
// Into this: Add(value, -constant)
if (isInt(m_value->type())) {
@@ -122,9 +140,6 @@
}
}
- // Turn this: Sub(constant1, constant2)
- // Into this: constant1 - constant2
- replaceWithNewValue(m_value->child(0)->subConstant(m_proc, m_value->child(1)));
break;
case Load8Z:
Modified: trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes (191837 => 191838)
--- trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes 2015-10-31 04:02:19 UTC (rev 191837)
+++ trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes 2015-10-31 04:03:58 UTC (rev 191838)
@@ -78,6 +78,17 @@
Add64 U:G, U:G, D:G
Imm, Tmp, Tmp
+Sub32 U:G, UD:G
+ Tmp, Tmp
+ Imm, Addr
+ Imm, Tmp
+ Addr, Tmp
+ Tmp, Addr
+
+Sub64 U:G, UD:G
+ Tmp, Tmp
+ Imm, Tmp
+
Lea UA:G, D:G
Addr, Tmp
Modified: trunk/Source/_javascript_Core/b3/testb3.cpp (191837 => 191838)
--- trunk/Source/_javascript_Core/b3/testb3.cpp 2015-10-31 04:02:19 UTC (rev 191837)
+++ trunk/Source/_javascript_Core/b3/testb3.cpp 2015-10-31 04:03:58 UTC (rev 191838)
@@ -134,6 +134,34 @@
CHECK(compileAndRun<int>(proc, a, b) == a + b);
}
+void testAddArgImm(int a, int b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, Add, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0),
+ root->appendNew<Const64Value>(proc, Origin(), b)));
+
+ CHECK(compileAndRun<int>(proc, a) == a + b);
+}
+
+void testAddImmArg(int a, int b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, Add, Origin(),
+ root->appendNew<Const64Value>(proc, Origin(), a),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0)));
+
+ CHECK(compileAndRun<int>(proc, b) == a + b);
+}
+
void testAddArgs32(int a, int b)
{
Procedure proc;
@@ -152,6 +180,98 @@
CHECK(compileAndRun<int>(proc, a, b) == a + b);
}
+void testSubArgs(int a, int b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, Sub, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1)));
+
+ CHECK(compileAndRun<int>(proc, a, b) == a - b);
+}
+
+void testSubArgImm(int64_t a, int64_t b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, Sub, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0),
+ root->appendNew<Const64Value>(proc, Origin(), b)));
+
+ CHECK(compileAndRun<int64_t>(proc, a) == a - b);
+}
+
+void testSubImmArg(int a, int b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, Sub, Origin(),
+ root->appendNew<Const64Value>(proc, Origin(), a),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0)));
+
+ CHECK(compileAndRun<int>(proc, b) == a - b);
+}
+
+void testSubArgs32(int a, int b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, Sub, Origin(),
+ root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0)),
+ root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1))));
+
+ CHECK(compileAndRun<int>(proc, a, b) == a - b);
+}
+
+void testSubArgImm32(int a, int b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, Sub, Origin(),
+ root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0)),
+ root->appendNew<Const32Value>(proc, Origin(), b)));
+
+ CHECK(compileAndRun<int>(proc, a) == a - b);
+}
+
+void testSubImmArg32(int a, int b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, Sub, Origin(),
+ root->appendNew<Const32Value>(proc, Origin(), a),
+ root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0))));
+
+ CHECK(compileAndRun<int>(proc, b) == a - b);
+}
+
void testStore(int value)
{
Procedure proc;
@@ -270,6 +390,30 @@
CHECK(slot == 37 + amount);
}
+void testStoreSubLoad(int amount)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ int32_t startValue = std::numeric_limits<int32_t>::min();
+ int32_t slot = startValue;
+ ConstPtrValue* slotPtr = root->appendNew<ConstPtrValue>(proc, Origin(), &slot);
+ root->appendNew<MemoryValue>(
+ proc, Store, Origin(),
+ root->appendNew<Value>(
+ proc, Sub, Origin(),
+ root->appendNew<MemoryValue>(proc, Load, Int32, Origin(), slotPtr),
+ root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0))),
+ slotPtr);
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Const32Value>(proc, Origin(), 0));
+
+ CHECK(!compileAndRun<int>(proc, amount));
+ CHECK(slot == startValue - amount);
+}
+
void testStoreAddLoadInterference(int amount)
{
Procedure proc;
@@ -944,10 +1088,45 @@
RUN(test42());
RUN(testLoad42());
RUN(testArg(43));
+
RUN(testAddArgs(1, 1));
RUN(testAddArgs(1, 2));
+ RUN(testAddArgImm(1, 2));
+ RUN(testAddArgImm(0, 2));
+ RUN(testAddArgImm(1, 0));
+ RUN(testAddImmArg(1, 2));
+ RUN(testAddImmArg(0, 2));
+ RUN(testAddImmArg(1, 0));
RUN(testAddArgs32(1, 1));
RUN(testAddArgs32(1, 2));
+
+ RUN(testSubArgs(1, 1));
+ RUN(testSubArgs(1, 2));
+ RUN(testSubArgs(13, -42));
+ RUN(testSubArgs(-13, 42));
+ RUN(testSubArgImm(1, 1));
+ RUN(testSubArgImm(1, 2));
+ RUN(testSubArgImm(13, -42));
+ RUN(testSubArgImm(-13, 42));
+ RUN(testSubArgImm(42, 0));
+ RUN(testSubImmArg(1, 1));
+ RUN(testSubImmArg(1, 2));
+ RUN(testSubImmArg(13, -42));
+ RUN(testSubImmArg(-13, 42));
+
+ RUN(testSubArgs32(1, 1));
+ RUN(testSubArgs32(1, 2));
+ RUN(testSubArgs32(13, -42));
+ RUN(testSubArgs32(-13, 42));
+ RUN(testSubArgImm32(1, 1));
+ RUN(testSubArgImm32(1, 2));
+ RUN(testSubArgImm32(13, -42));
+ RUN(testSubArgImm32(-13, 42));
+ RUN(testSubImmArg32(1, 1));
+ RUN(testSubImmArg32(1, 2));
+ RUN(testSubImmArg32(13, -42));
+ RUN(testSubImmArg32(-13, 42));
+
RUN(testStore(44));
RUN(testStoreConstant(49));
RUN(testStoreConstantPtr(49));
@@ -956,6 +1135,7 @@
RUN(testAdd1Ptr(51));
RUN(testAdd1Ptr(bitwise_cast<intptr_t>(vm)));
RUN(testStoreAddLoad(46));
+ RUN(testStoreSubLoad(46));
RUN(testStoreAddLoadInterference(52));
RUN(testStoreAddAndLoad(47, 0xffff));
RUN(testStoreAddAndLoad(470000, 0xffff));
_______________________________________________ webkit-changes mailing list [email protected] https://lists.webkit.org/mailman/listinfo/webkit-changes
