void TypeAnalysis::genericRelational(CallInst * ci) { AType * lhs = state.get(ci->getOperand(0)); AType * rhs = state.get(ci->getOperand(1)); if (lhs->isDoubleScalar() and rhs->isDoubleScalar()) { state.update(ci, AType::D1); } else { state.update(ci, AType::DV); } }
void TypeAnalysis::genericGetElement(CallInst * ci) { AType * from = state.get(ci->getOperand(0)); AType * index = state.get(ci->getOperand(1)); if (from->isDouble()) { if (index->isDoubleScalar()) { state.update(ci, AType::D1); } else { state.update(ci, AType::DV); } } else if (from->isCharacter()) { state.update(ci, AType::CV); } else { state.update(ci, AType::T); } }
bool Unboxing::genericGetElement() { llvm::Value * src = ins->getOperand(0); llvm::Value * idx = ins->getOperand(1); AType * srcType = state().get(src); AType * idxType = state().get(idx); if (srcType->isDouble()) { src = CastInst::CreatePointerCast(src, type::ptrDoubleVector, "", ins); if (idxType->isDoubleScalar()) { llvm::Value * i = state().getMetadata(idx); if (i) { llvm::Value * res = RUNTIME_CALL(m->doubleGetSingleElement, src, i); updateDoubleScalar(res); return true; } } } return false; }