Title: [191742] trunk/Source/_javascript_Core
Revision
191742
Author
fpi...@apple.com
Date
2015-10-29 12:01:04 -0700 (Thu, 29 Oct 2015)

Log Message

Air::spillEverything() should try to replace tmps with spill slots without using registers whenever possible
https://bugs.webkit.org/show_bug.cgi?id=150657

Reviewed by Geoffrey Garen.

Also added the ability to store an immediate to memory.

* assembler/MacroAssembler.h:
(JSC::MacroAssembler::storePtr):
* assembler/MacroAssemblerARM64.h:
(JSC::MacroAssemblerARM64::store64):
* assembler/MacroAssemblerX86_64.h:
(JSC::MacroAssemblerX86_64::store64):
* b3/B3LowerToAir.cpp:
(JSC::B3::Air::LowerToAir::imm):
(JSC::B3::Air::LowerToAir::immAnyInt):
(JSC::B3::Air::LowerToAir::immOrTmp):
(JSC::B3::Air::LowerToAir::tryStore):
* b3/air/AirOpcode.opcodes:
* b3/air/AirSpillEverything.cpp:
(JSC::B3::Air::spillEverything):
* b3/testb3.cpp:
(JSC::B3::testStore):
(JSC::B3::testStoreConstant):
(JSC::B3::testStoreConstantPtr):
(JSC::B3::testTrunc):
(JSC::B3::run):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (191741 => 191742)


--- trunk/Source/_javascript_Core/ChangeLog	2015-10-29 18:45:11 UTC (rev 191741)
+++ trunk/Source/_javascript_Core/ChangeLog	2015-10-29 19:01:04 UTC (rev 191742)
@@ -1,3 +1,33 @@
+2015-10-28  Filip Pizlo  <fpi...@apple.com>
+
+        Air::spillEverything() should try to replace tmps with spill slots without using registers whenever possible
+        https://bugs.webkit.org/show_bug.cgi?id=150657
+
+        Reviewed by Geoffrey Garen.
+
+        Also added the ability to store an immediate to memory.
+
+        * assembler/MacroAssembler.h:
+        (JSC::MacroAssembler::storePtr):
+        * assembler/MacroAssemblerARM64.h:
+        (JSC::MacroAssemblerARM64::store64):
+        * assembler/MacroAssemblerX86_64.h:
+        (JSC::MacroAssemblerX86_64::store64):
+        * b3/B3LowerToAir.cpp:
+        (JSC::B3::Air::LowerToAir::imm):
+        (JSC::B3::Air::LowerToAir::immAnyInt):
+        (JSC::B3::Air::LowerToAir::immOrTmp):
+        (JSC::B3::Air::LowerToAir::tryStore):
+        * b3/air/AirOpcode.opcodes:
+        * b3/air/AirSpillEverything.cpp:
+        (JSC::B3::Air::spillEverything):
+        * b3/testb3.cpp:
+        (JSC::B3::testStore):
+        (JSC::B3::testStoreConstant):
+        (JSC::B3::testStoreConstantPtr):
+        (JSC::B3::testTrunc):
+        (JSC::B3::run):
+
 2015-10-28  Joseph Pecoraro  <pecor...@apple.com>
 
         Web Inspector: Rename InspectorResourceAgent to InspectorNetworkAgent

Modified: trunk/Source/_javascript_Core/assembler/MacroAssembler.h (191741 => 191742)


--- trunk/Source/_javascript_Core/assembler/MacroAssembler.h	2015-10-29 18:45:11 UTC (rev 191741)
+++ trunk/Source/_javascript_Core/assembler/MacroAssembler.h	2015-10-29 19:01:04 UTC (rev 191742)
@@ -880,6 +880,11 @@
         store64(TrustedImm64(imm), address);
     }
 
+    void storePtr(TrustedImm32 imm, ImplicitAddress address)
+    {
+        store64(imm, address);
+    }
+
     void storePtr(TrustedImmPtr imm, BaseIndex address)
     {
         store64(TrustedImm64(imm), address);

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h (191741 => 191742)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h	2015-10-29 18:45:11 UTC (rev 191741)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h	2015-10-29 19:01:04 UTC (rev 191742)
@@ -1000,6 +1000,11 @@
         store<64>(src, address);
     }
 
+    void store64(TrustedImm32 imm, ImplicitAddress address)
+    {
+        store64(TrustedImm64(imm), address);
+    }
+
     void store64(TrustedImm64 imm, ImplicitAddress address)
     {
         if (!imm.m_value) {

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h (191741 => 191742)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h	2015-10-29 18:45:11 UTC (rev 191741)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h	2015-10-29 19:01:04 UTC (rev 191742)
@@ -480,14 +480,20 @@
         }
     }
 
+    void store64(TrustedImm32 imm, ImplicitAddress address)
+    {
+        m_assembler.movq_i32m(imm.m_value, address.offset, address.base);
+    }
+
     void store64(TrustedImm64 imm, ImplicitAddress address)
     {
-        if (CAN_SIGN_EXTEND_32_64(imm.m_value))
-            m_assembler.movq_i32m(static_cast<int>(imm.m_value), address.offset, address.base);
-        else {
-            move(imm, scratchRegister);
-            store64(scratchRegister, address);
+        if (CAN_SIGN_EXTEND_32_64(imm.m_value)) {
+            store64(TrustedImm32(static_cast<int32_t>(imm.m_value)), address);
+            return;
         }
+
+        move(imm, scratchRegister);
+        store64(scratchRegister, address);
     }
 
     void store64(TrustedImm64 imm, BaseIndex address)

Modified: trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp (191741 => 191742)


--- trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp	2015-10-29 18:45:11 UTC (rev 191741)
+++ trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp	2015-10-29 19:01:04 UTC (rev 191742)
@@ -187,6 +187,17 @@
         return Arg();
     }
 
+    Arg immAnyInt(Value* value)
+    {
+        if (value->hasInt()) {
+            int64_t fullValue = value->asInt();
+            int32_t immediateValue = static_cast<int32_t>(fullValue);
+            if (fullValue == immediateValue)
+                return Arg::imm(immediateValue);
+        }
+        return Arg();
+    }
+
     Arg immOrTmp(Value* value)
     {
         if (Arg result = imm(value))
@@ -541,6 +552,15 @@
     
     bool tryStore(Value* value, Value* address)
     {
+        Air::Opcode move = moveForType(value->type());
+        Arg destination = effectiveAddr(address);
+
+        Arg imm = immAnyInt(value);
+        if (imm && isValidForm(move, Arg::Imm, destination.kind())) {
+            append(moveForType(value->type()), imm, effectiveAddr(address, currentValue));
+            return true;
+        }
+        
         append(moveForType(value->type()), tmp(value), effectiveAddr(address, currentValue));
         return true;
     }

Modified: trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes (191741 => 191742)


--- trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes	2015-10-29 18:45:11 UTC (rev 191741)
+++ trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes	2015-10-29 19:01:04 UTC (rev 191742)
@@ -108,6 +108,7 @@
     Index, Tmp as loadPtr
     Tmp, Addr as storePtr
     Tmp, Index as storePtr
+    Imm, Addr as storePtr
 
 Move32 U:G, D:G
     Tmp, Tmp as zeroExtend32ToPtr

Modified: trunk/Source/_javascript_Core/b3/air/AirSpillEverything.cpp (191741 => 191742)


--- trunk/Source/_javascript_Core/b3/air/AirSpillEverything.cpp	2015-10-29 18:45:11 UTC (rev 191741)
+++ trunk/Source/_javascript_Core/b3/air/AirSpillEverything.cpp	2015-10-29 19:01:04 UTC (rev 191742)
@@ -91,11 +91,29 @@
             RegisterSet& setBefore = usedRegisters[block][instIndex];
             RegisterSet& setAfter = usedRegisters[block][instIndex + 1];
             Inst& inst = block->at(instIndex);
+
+            // First try to spill directly.
+            for (unsigned i = 0; i < inst.args.size(); ++i) {
+                Arg& arg = inst.args[i];
+
+                if (arg.isTmp()) {
+                    if (arg.isReg())
+                        continue;
+
+                    if (inst.admitsStack(i)) { 
+                        StackSlot* stackSlot = allStackSlots[arg.type()][arg.tmpIndex()];
+                        arg = Arg::stack(stackSlot);
+                        continue;
+                    }
+                }
+            }
+
+            // Now fall back on spilling using separate Move's to load/store the tmp.
             inst.forEachTmp(
                 [&] (Tmp& tmp, Arg::Role role, Arg::Type type) {
                     if (tmp.isReg())
                         return;
-
+                    
                     StackSlot* stackSlot = allStackSlots[type][tmp.tmpIndex()];
                     Arg arg = Arg::stack(stackSlot);
 

Modified: trunk/Source/_javascript_Core/b3/testb3.cpp (191741 => 191742)


--- trunk/Source/_javascript_Core/b3/testb3.cpp	2015-10-29 18:45:11 UTC (rev 191741)
+++ trunk/Source/_javascript_Core/b3/testb3.cpp	2015-10-29 19:01:04 UTC (rev 191742)
@@ -148,6 +148,42 @@
     CHECK(slot == value);
 }
 
+void testStoreConstant(int value)
+{
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    int slot = 0xbaadbeef;
+    root->appendNew<MemoryValue>(
+        proc, Store, Origin(),
+        root->appendNew<Const32Value>(proc, Origin(), value),
+        root->appendNew<ConstPtrValue>(proc, Origin(), &slot));
+    root->appendNew<ControlValue>(
+        proc, Return, Origin(), root->appendNew<Const32Value>(proc, Origin(), 0));
+
+    CHECK(!compileAndRun<int>(proc));
+    CHECK(slot == value);
+}
+
+void testStoreConstantPtr(intptr_t value)
+{
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    intptr_t slot;
+    if (is64Bit())
+        slot = (static_cast<intptr_t>(0xbaadbeef) << 32) + static_cast<intptr_t>(0xbaadbeef);
+    else
+        slot = 0xbaadbeef;
+    root->appendNew<MemoryValue>(
+        proc, Store, Origin(),
+        root->appendNew<ConstPtrValue>(proc, Origin(), value),
+        root->appendNew<ConstPtrValue>(proc, Origin(), &slot));
+    root->appendNew<ControlValue>(
+        proc, Return, Origin(), root->appendNew<Const32Value>(proc, Origin(), 0));
+
+    CHECK(!compileAndRun<int>(proc));
+    CHECK(slot == value);
+}
+
 void testTrunc(int64_t value)
 {
     Procedure proc;
@@ -337,6 +373,8 @@
     RUN(testAddArgs32(1, 1));
     RUN(testAddArgs32(1, 2));
     RUN(testStore(44));
+    RUN(testStoreConstant(49));
+    RUN(testStoreConstantPtr(49));
     RUN(testTrunc((static_cast<int64_t>(1) << 40) + 42));
     RUN(testAdd1(45));
     RUN(testStoreAddLoad(46));
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to