bool IRInstruction::cseEquals(IRInstruction* inst) const { assert(canCSE()); if (m_op != inst->m_op || m_typeParam != inst->m_typeParam || m_numSrcs != inst->m_numSrcs) { return false; } for (uint32_t i = 0; i < numSrcs(); i++) { if (src(i) != inst->src(i)) { return false; } } if (hasExtra() && !cseEqualsExtra(op(), m_extra, inst->m_extra)) { return false; } /* * Don't CSE on the edges--it's ok to use the destination of some * earlier guarded load even though the instruction we may have * generated here would've exited to a different trace. * * For example, we use this to cse LdThis regardless of its label. */ return true; }
size_t IRInstruction::cseHash() const { assert(canCSE()); size_t srcHash = 0; for (unsigned i = 0; i < numSrcs(); ++i) { srcHash = CSEHash::hashCombine(srcHash, src(i)); } if (hasExtra()) { srcHash = CSEHash::hashCombine(srcHash, cseHashExtra(op(), m_extra)); } return CSEHash::hashCombine(srcHash, m_op, m_typeParam); }