Index: runtime/vm/flow_graph.h |
diff --git a/runtime/vm/flow_graph.h b/runtime/vm/flow_graph.h |
index 0c7aa526cd60c97caf23d9b82f3c6a36fe7d5575..7da7ac012dabc58194248129b7ecc7603a48f452 100644 |
--- a/runtime/vm/flow_graph.h |
+++ b/runtime/vm/flow_graph.h |
@@ -305,6 +305,11 @@ class FlowGraph : public ZoneAllocated { |
bool IsReceiver(Definition* def) const; |
+ // Optimize (a << b) & c pattern: if c is a positive Smi or zero, then the |
+ // shift can be a truncating Smi shift-left and result is always Smi. |
+ // Merge instructions (only per basic-block). |
+ void TryOptimizePatterns(); |
+ |
private: |
friend class IfConverter; |
friend class BranchSimplifier; |
@@ -361,6 +366,18 @@ class FlowGraph : public ZoneAllocated { |
void ComputeIsReceiverRecursive(PhiInstr* phi, |
GrowableArray<PhiInstr*>* unmark) const; |
+ void OptimizeLeftShiftBitAndSmiOp( |
+ ForwardInstructionIterator* current_iterator, |
+ Definition* bit_and_instr, |
+ Definition* left_instr, |
+ Definition* right_instr); |
+ |
+ void TryMergeTruncDivMod(GrowableArray<BinarySmiOpInstr*>* merge_candidates); |
+ void TryMergeMathUnary(GrowableArray<MathUnaryInstr*>* merge_candidates); |
+ |
+ void AppendExtractNthOutputForMerged(Definition* instr, intptr_t ix, |
+ Representation rep, intptr_t cid); |
+ |
Thread* thread_; |
// DiscoverBlocks computes parent_ and assigned_vars_ which are then used |