1114 const std::vector<const Variable *> &
arguments,
1115 ::llvm::IRBuilder<> & builder)
1117 if (is<IntegerAddOperation>(op))
1121 if (is<IntegerAndOperation>(op))
1125 if (is<IntegerAShrOperation>(op))
1129 if (is<IntegerSubOperation>(op))
1133 if (is<IntegerUDivOperation>(op))
1137 if (is<IntegerSDivOperation>(op))
1141 if (is<IntegerURemOperation>(op))
1145 if (is<IntegerSRemOperation>(op))
1149 if (is<IntegerShlOperation>(op))
1153 if (is<IntegerLShrOperation>(op))
1157 if (is<IntegerOrOperation>(op))
1161 if (is<IntegerXorOperation>(op))
1165 if (is<IntegerMulOperation>(op))
1169 if (is<IntegerEqOperation>(op))
1173 if (is<IntegerNeOperation>(op))
1177 if (is<IntegerUgtOperation>(op))
1181 if (is<IntegerUgeOperation>(op))
1185 if (is<IntegerUltOperation>(op))
1189 if (is<IntegerUleOperation>(op))
1193 if (is<IntegerSgtOperation>(op))
1197 if (is<IntegerSgeOperation>(op))
1201 if (is<IntegerSltOperation>(op))
1205 if (is<IntegerSleOperation>(op))
1209 if (is<IOBarrierOperation>(op))
1213 if (is<IntegerConstantOperation>(op))
1217 if (is<rvsdg::ControlConstantOperation>(op))
1221 if (is<ConstantFP>(op))
1223 return convert<ConstantFP>(op,
arguments, builder);
1225 if (is<UndefValueOperation>(op))
1229 if (is<PoisonValueOperation>(op))
1231 return convert<PoisonValueOperation>(op,
arguments, builder);
1233 if (is<FreezeOperation>(op))
1235 return convert<FreezeOperation>(op,
arguments, builder);
1237 if (is<rvsdg::MatchOperation>(op))
1241 if (is<AssignmentOperation>(op))
1245 if (is<BranchOperation>(op))
1249 if (is<SsaPhiOperation>(op))
1253 if (is<LoadNonVolatileOperation>(op))
1255 return convert<LoadNonVolatileOperation>(op,
arguments, builder);
1257 if (is<LoadVolatileOperation>(op))
1259 return convert<LoadVolatileOperation>(op,
arguments, builder);
1261 if (is<StoreNonVolatileOperation>(op))
1265 if (is<StoreVolatileOperation>(op))
1267 return convert<StoreVolatileOperation>(op,
arguments, builder);
1269 if (is<AllocaOperation>(op))
1273 if (is<GetElementPtrOperation>(op))
1277 if (is<ConstantDataArrayOperation>(op))
1279 return convert<ConstantDataArrayOperation>(op,
arguments, builder);
1281 if (is<PtrCmpOperation>(op))
1285 if (is<FCmpOperation>(op))
1289 if (is<FBinaryOperation>(op))
1293 if (is<VariadicArgumentListOperation>(op))
1297 if (is<ConstantStructOperation>(op))
1299 return convert<ConstantStructOperation>(op,
arguments, builder);
1301 if (is<ConstantPointerNullOperation>(op))
1303 return convert<ConstantPointerNullOperation>(op,
arguments, builder);
1305 if (is<SelectOperation>(op))
1309 if (is<ConstantArrayOperation>(op))
1311 return convert<ConstantArrayOperation>(op,
arguments, builder);
1313 if (is<ConstantAggregateZeroOperation>(op))
1315 return convert<ConstantAggregateZeroOperation>(op,
arguments, builder);
1317 if (is<ControlToIntOperation>(op))
1321 if (is<ConstantVectorOperation>(op))
1325 if (is<ConstantDataVectorOperation>(op))
1329 if (is<ExtractElementOperation>(op))
1333 if (is<ShuffleVectorOperation>(op))
1335 return convert<ShuffleVectorOperation>(op,
arguments, builder);
1337 if (is<InsertElementOperation>(op))
1341 if (is<VectorUnaryOperation>(op))
1345 if (is<VectorBinaryOperation>(op))
1349 if (is<VectorSelectOperation>(op))
1351 return convert<VectorSelectOperation>(op,
arguments, builder);
1353 if (is<ExtractValueOperation>(op))
1355 return convert<ExtractValueOperation>(op,
arguments, builder);
1361 if (is<CallOperation>(op))
1363 return convert<CallOperation>(op,
arguments, builder);
1365 if (is<MallocOperation>(op))
1367 return convert<MallocOperation>(op,
arguments, builder);
1369 if (is<FreeOperation>(op))
1371 return convert<FreeOperation>(op,
arguments, builder);
1373 if (is<MemCpyNonVolatileOperation>(op))
1375 return convert<MemCpyNonVolatileOperation>(op,
arguments, builder);
1377 if (is<MemCpyVolatileOperation>(op))
1379 return convert<MemCpyVolatileOperation>(op,
arguments, builder);
1381 if (is<MemSetNonVolatileOperation>(op))
1385 if (is<MemMoveNonVolatileOperation>(op))
1391 return builder.CreateMemMove(
1393 ::llvm::MaybeAlign(),
1395 ::llvm::MaybeAlign(),
1398 if (is<FNegOperation>(op))
1402 if (is<BitCastOperation>(op))
1404 return convert_cast<::llvm::Instruction::BitCast>(op, originalOp,
arguments, builder);
1406 if (is<FPExtOperation>(op))
1408 return convert_cast<::llvm::Instruction::FPExt>(op, originalOp,
arguments, builder);
1410 if (is<FPToSIOperation>(op))
1412 return convert_cast<::llvm::Instruction::FPToSI>(op, originalOp,
arguments, builder);
1414 if (is<FPToUIOperation>(op))
1416 return convert_cast<::llvm::Instruction::FPToUI>(op, originalOp,
arguments, builder);
1418 if (is<FPTruncOperation>(op))
1420 return convert_cast<::llvm::Instruction::FPTrunc>(op, originalOp,
arguments, builder);
1422 if (is<IntToPtrOperation>(op))
1424 return convert_cast<::llvm::Instruction::IntToPtr>(op, originalOp,
arguments, builder);
1426 if (is<PtrToIntOperation>(op))
1428 return convert_cast<::llvm::Instruction::PtrToInt>(op, originalOp,
arguments, builder);
1430 if (is<SExtOperation>(op))
1432 return convert_cast<::llvm::Instruction::SExt>(op, originalOp,
arguments, builder);
1434 if (is<SIToFPOperation>(op))
1436 return convert_cast<::llvm::Instruction::SIToFP>(op, originalOp,
arguments, builder);
1438 if (is<TruncOperation>(op))
1440 return convert_cast<::llvm::Instruction::Trunc>(op, originalOp,
arguments, builder);
1442 if (is<UIToFPOperation>(op))
1444 return convert_cast<::llvm::Instruction::UIToFP>(op, originalOp,
arguments, builder);
1446 if (is<ZExtOperation>(op))
1448 return convert_cast<::llvm::Instruction::ZExt>(op, originalOp,
arguments, builder);
1450 if (is<MemoryStateMergeOperation>(op))
1452 return convert<MemoryStateMergeOperation>(op,
arguments, builder);
1454 if (is<MemoryStateJoinOperation>(op))
1460 if (is<MemoryStateSplitOperation>(op))
1462 return convert<MemoryStateSplitOperation>(op,
arguments, builder);
1464 if (is<LambdaEntryMemoryStateSplitOperation>(op))
1466 return convert<LambdaEntryMemoryStateSplitOperation>(op,
arguments, builder);
1468 if (is<LambdaExitMemoryStateMergeOperation>(op))
1470 return convert<LambdaExitMemoryStateMergeOperation>(op,
arguments, builder);
1472 if (is<CallEntryMemoryStateMergeOperation>(op))
1474 return convert<CallEntryMemoryStateMergeOperation>(op,
arguments, builder);
1476 if (is<CallExitMemoryStateSplitOperation>(op))
1478 return convert<CallExitMemoryStateSplitOperation>(op,
arguments, builder);
1480 if (is<PointerToFunctionOperation>(op))
1482 return convert<PointerToFunctionOperation>(op,
arguments, builder);
1484 if (is<FunctionToPointerOperation>(op))
1486 return convert<FunctionToPointerOperation>(op,
arguments, builder);
1488 if (is<FMulAddIntrinsicOperation>(op))
1495 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1496 return builder.CreateIntrinsic(
1497 ::llvm::Intrinsic::fmuladd,
1499 { multiplier, multiplicand, summand });
1501 if (is<SMaxOperation>(op))
1507 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1508 return builder.CreateIntrinsic(::llvm::Intrinsic::smax, { type }, { operand1, operand2 });
1510 if (is<UMaxOperation>(op))
1516 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1517 return builder.CreateIntrinsic(::llvm::Intrinsic::umax, { type }, { operand1, operand2 });
1519 if (is<SMinOperation>(op))
1525 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1526 return builder.CreateIntrinsic(::llvm::Intrinsic::smin, { type }, { operand1, operand2 });
1528 if (is<UMinOperation>(op))
1534 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1535 return builder.CreateIntrinsic(::llvm::Intrinsic::umin, { type }, { operand1, operand2 });
1537 if (is<FAbsOperation>(op))
1542 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1543 return builder.CreateIntrinsic(::llvm::Intrinsic::fabs, { type }, { operand });
1545 if (is<FShlOperation>(op))
1552 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1553 return builder.CreateIntrinsic(
1554 ::llvm::Intrinsic::fshl,
1556 { operand1, operand2, operand3 });
1558 if (is<FloorOperation>(op))
1563 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1564 return builder.CreateIntrinsic(::llvm::Intrinsic::floor, { type }, { operand });
1566 if (is<AbsOperation>(op))
1572 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1573 return builder.CreateIntrinsic(::llvm::Intrinsic::abs, { type }, { operand1, operand2 });
1575 if (is<CeilOperation>(op))
1580 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1581 return builder.CreateIntrinsic(::llvm::Intrinsic::ceil, { type }, { operand });
1583 if (is<RIntOperation>(op))
1588 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1589 return builder.CreateIntrinsic(::llvm::Intrinsic::rint, { type }, { operand });
1591 if (is<TruncIntrinsicOperation>(op))
1596 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1597 return builder.CreateIntrinsic(::llvm::Intrinsic::trunc, { type }, { operand });
1599 if (is<BSwapOperation>(op))
1604 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1605 return builder.CreateIntrinsic(::llvm::Intrinsic::bswap, { type }, { operand });
1607 if (is<CtlzOperation>(op))
1613 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1614 return builder.CreateIntrinsic(::llvm::Intrinsic::ctlz, { type }, { operand, isZeroPoison });
1616 if (is<CttzOperation>(op))
1622 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1623 return builder.CreateIntrinsic(::llvm::Intrinsic::cttz, { type }, { operand, isZeroPoison });
1625 if (is<CtpopOperation>(op))
1630 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1631 return builder.CreateIntrinsic(::llvm::Intrinsic::ctpop, { type }, { operand });
1633 if (is<IsConstantOperation>(op))
1638 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1639 return builder.CreateIntrinsic(::llvm::Intrinsic::is_constant, { type }, { operand });
1641 if (is<IsFPClassOperation>(op))
1647 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1648 return builder.CreateIntrinsic(::llvm::Intrinsic::is_fpclass, { type }, { operand1, operand2 });
1650 if (is<SAddWithOverflowOperation>(op))
1656 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1657 return builder.CreateIntrinsic(
1658 ::llvm::Intrinsic::sadd_with_overflow,
1660 { operand1, operand2 });
1662 if (is<UAddWithOverflowOperation>(op))
1668 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1669 return builder.CreateIntrinsic(
1670 ::llvm::Intrinsic::uadd_with_overflow,
1672 { operand1, operand2 });
1674 if (is<SSubWithOverflowOperation>(op))
1680 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1681 return builder.CreateIntrinsic(
1682 ::llvm::Intrinsic::ssub_with_overflow,
1684 { operand1, operand2 });
1686 if (is<SMulWithOverflowOperation>(op))
1692 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1693 return builder.CreateIntrinsic(
1694 ::llvm::Intrinsic::smul_with_overflow,
1696 { operand1, operand2 });
1698 if (is<RoundOperation>(op))
1703 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1704 return builder.CreateIntrinsic(::llvm::Intrinsic::round, { type }, { operand });
1706 if (is<UMulWithOverflowOperation>(op))
1712 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1713 return builder.CreateIntrinsic(
1714 ::llvm::Intrinsic::umul_with_overflow,
1716 { operand1, operand2 });
1718 if (is<CopysignOperation>(op))
1724 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1725 return builder.CreateIntrinsic(::llvm::Intrinsic::copysign, { type }, { operand1, operand2 });
1727 if (is<PtrMaskOperation>(op))
1732 return builder.CreateIntrinsic(
1733 ::llvm::Intrinsic::ptrmask,
1734 { ptrOperand->getType(), maskOperand->getType() },
1735 { ptrOperand, maskOperand });