Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Side by Side Diff: src/compiler/machine-operator.cc

Issue 2739093002: [turbofan] BitcastWordToTagged must not be pure. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/compiler/machine-operator.h" 5 #include "src/compiler/machine-operator.h"
6 6
7 #include "src/base/lazy-instance.h" 7 #include "src/base/lazy-instance.h"
8 #include "src/compiler/opcodes.h" 8 #include "src/compiler/opcodes.h"
9 #include "src/compiler/operator.h" 9 #include "src/compiler/operator.h"
10 10
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 V(Uint64Mod, Operator::kNoProperties, 2, 1, 1) \ 128 V(Uint64Mod, Operator::kNoProperties, 2, 1, 1) \
129 V(Uint64LessThan, Operator::kNoProperties, 2, 0, 1) \ 129 V(Uint64LessThan, Operator::kNoProperties, 2, 0, 1) \
130 V(Uint64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) 130 V(Uint64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1)
131 131
132 #define PURE_OP_LIST(V) \ 132 #define PURE_OP_LIST(V) \
133 PURE_BINARY_OP_LIST_32(V) \ 133 PURE_BINARY_OP_LIST_32(V) \
134 PURE_BINARY_OP_LIST_64(V) \ 134 PURE_BINARY_OP_LIST_64(V) \
135 V(Word32Clz, Operator::kNoProperties, 1, 0, 1) \ 135 V(Word32Clz, Operator::kNoProperties, 1, 0, 1) \
136 V(Word64Clz, Operator::kNoProperties, 1, 0, 1) \ 136 V(Word64Clz, Operator::kNoProperties, 1, 0, 1) \
137 V(BitcastTaggedToWord, Operator::kNoProperties, 1, 0, 1) \ 137 V(BitcastTaggedToWord, Operator::kNoProperties, 1, 0, 1) \
138 V(BitcastWordToTagged, Operator::kNoProperties, 1, 0, 1) \
139 V(BitcastWordToTaggedSigned, Operator::kNoProperties, 1, 0, 1) \ 138 V(BitcastWordToTaggedSigned, Operator::kNoProperties, 1, 0, 1) \
140 V(TruncateFloat64ToWord32, Operator::kNoProperties, 1, 0, 1) \ 139 V(TruncateFloat64ToWord32, Operator::kNoProperties, 1, 0, 1) \
141 V(ChangeFloat32ToFloat64, Operator::kNoProperties, 1, 0, 1) \ 140 V(ChangeFloat32ToFloat64, Operator::kNoProperties, 1, 0, 1) \
142 V(ChangeFloat64ToInt32, Operator::kNoProperties, 1, 0, 1) \ 141 V(ChangeFloat64ToInt32, Operator::kNoProperties, 1, 0, 1) \
143 V(ChangeFloat64ToUint32, Operator::kNoProperties, 1, 0, 1) \ 142 V(ChangeFloat64ToUint32, Operator::kNoProperties, 1, 0, 1) \
144 V(TruncateFloat64ToUint32, Operator::kNoProperties, 1, 0, 1) \ 143 V(TruncateFloat64ToUint32, Operator::kNoProperties, 1, 0, 1) \
145 V(TruncateFloat32ToInt32, Operator::kNoProperties, 1, 0, 1) \ 144 V(TruncateFloat32ToInt32, Operator::kNoProperties, 1, 0, 1) \
146 V(TruncateFloat32ToUint32, Operator::kNoProperties, 1, 0, 1) \ 145 V(TruncateFloat32ToUint32, Operator::kNoProperties, 1, 0, 1) \
147 V(TryTruncateFloat32ToInt64, Operator::kNoProperties, 1, 0, 2) \ 146 V(TryTruncateFloat32ToInt64, Operator::kNoProperties, 1, 0, 2) \
148 V(TryTruncateFloat64ToInt64, Operator::kNoProperties, 1, 0, 2) \ 147 V(TryTruncateFloat64ToInt64, Operator::kNoProperties, 1, 0, 2) \
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
600 AtomicExchange##Type##Operator() \ 599 AtomicExchange##Type##Operator() \
601 : Operator1<MachineType>(IrOpcode::kAtomicExchange, \ 600 : Operator1<MachineType>(IrOpcode::kAtomicExchange, \
602 Operator::kNoDeopt | Operator::kNoThrow, \ 601 Operator::kNoDeopt | Operator::kNoThrow, \
603 "AtomicExchange", 3, 1, 1, 1, 1, 0, \ 602 "AtomicExchange", 3, 1, 1, 1, 1, 0, \
604 MachineType::Type()) {} \ 603 MachineType::Type()) {} \
605 }; \ 604 }; \
606 AtomicExchange##Type##Operator kAtomicExchange##Type; 605 AtomicExchange##Type##Operator kAtomicExchange##Type;
607 ATOMIC_TYPE_LIST(ATOMIC_EXCHANGE) 606 ATOMIC_TYPE_LIST(ATOMIC_EXCHANGE)
608 #undef ATOMIC_EXCHANGE 607 #undef ATOMIC_EXCHANGE
609 608
609 // The {BitcastWordToTagged} operator must not be marked as pure (especially
610 // not idempotent), because otherwise the splitting logic in the Scheduler
611 // might decide to split these operators, thus potentially creating live
612 // ranges of allocation top across calls or other things that might allocate.
613 // See https://bugs.chromium.org/p/v8/issues/detail?id=6059 for more details.
614 struct BitcastWordToTaggedOperator : public Operator {
615 BitcastWordToTaggedOperator()
616 : Operator(IrOpcode::kBitcastWordToTagged,
617 Operator::kEliminatable | Operator::kNoWrite,
618 "BitcastWordToTagged", 1, 0, 0, 1, 0, 0) {}
619 };
620 BitcastWordToTaggedOperator kBitcastWordToTagged;
621
610 struct DebugBreakOperator : public Operator { 622 struct DebugBreakOperator : public Operator {
611 DebugBreakOperator() 623 DebugBreakOperator()
612 : Operator(IrOpcode::kDebugBreak, Operator::kNoThrow, "DebugBreak", 0, 624 : Operator(IrOpcode::kDebugBreak, Operator::kNoThrow, "DebugBreak", 0,
613 0, 0, 0, 0, 0) {} 625 0, 0, 0, 0, 0) {}
614 }; 626 };
615 DebugBreakOperator kDebugBreak; 627 DebugBreakOperator kDebugBreak;
616 628
617 struct UnsafePointerAddOperator final : public Operator { 629 struct UnsafePointerAddOperator final : public Operator {
618 UnsafePointerAddOperator() 630 UnsafePointerAddOperator()
619 : Operator(IrOpcode::kUnsafePointerAdd, Operator::kKontrol, 631 : Operator(IrOpcode::kUnsafePointerAdd, Operator::kKontrol,
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
777 break; 789 break;
778 } 790 }
779 UNREACHABLE(); 791 UNREACHABLE();
780 return nullptr; 792 return nullptr;
781 } 793 }
782 794
783 const Operator* MachineOperatorBuilder::UnsafePointerAdd() { 795 const Operator* MachineOperatorBuilder::UnsafePointerAdd() {
784 return &cache_.kUnsafePointerAdd; 796 return &cache_.kUnsafePointerAdd;
785 } 797 }
786 798
799 const Operator* MachineOperatorBuilder::BitcastWordToTagged() {
800 return &cache_.kBitcastWordToTagged;
801 }
802
787 const Operator* MachineOperatorBuilder::DebugBreak() { 803 const Operator* MachineOperatorBuilder::DebugBreak() {
788 return &cache_.kDebugBreak; 804 return &cache_.kDebugBreak;
789 } 805 }
790 806
791 const Operator* MachineOperatorBuilder::Comment(const char* msg) { 807 const Operator* MachineOperatorBuilder::Comment(const char* msg) {
792 return new (zone_) CommentOperator(msg); 808 return new (zone_) CommentOperator(msg);
793 } 809 }
794 810
795 const Operator* MachineOperatorBuilder::CheckedLoad( 811 const Operator* MachineOperatorBuilder::CheckedLoad(
796 CheckedLoadRepresentation rep) { 812 CheckedLoadRepresentation rep) {
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
907 return new (zone_) \ 923 return new (zone_) \
908 Operator1<uint32_t>(IrOpcode::kSimd##format##Swizzle, Operator::kPure, \ 924 Operator1<uint32_t>(IrOpcode::kSimd##format##Swizzle, Operator::kPure, \
909 "Swizzle", 2, 0, 0, 1, 0, 0, swizzle); \ 925 "Swizzle", 2, 0, 0, 1, 0, 0, swizzle); \
910 } 926 }
911 SIMD_FORMAT_LIST(SIMD_PERMUTE_OPS) 927 SIMD_FORMAT_LIST(SIMD_PERMUTE_OPS)
912 #undef SIMD_PERMUTE_OPS 928 #undef SIMD_PERMUTE_OPS
913 929
914 } // namespace compiler 930 } // namespace compiler
915 } // namespace internal 931 } // namespace internal
916 } // namespace v8 932 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698