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<MemoryHoistBarrierOperation>(op))
1217 if (is<IntegerConstantOperation>(op))
1221 if (is<rvsdg::ControlConstantOperation>(op))
1225 if (is<ConstantFP>(op))
1227 return convert<ConstantFP>(op,
arguments, builder);
1229 if (is<UndefValueOperation>(op))
1233 if (is<PoisonValueOperation>(op))
1235 return convert<PoisonValueOperation>(op,
arguments, builder);
1237 if (is<FreezeOperation>(op))
1239 return convert<FreezeOperation>(op,
arguments, builder);
1241 if (is<rvsdg::MatchOperation>(op))
1245 if (is<AssignmentOperation>(op))
1249 if (is<BranchOperation>(op))
1253 if (is<SsaPhiOperation>(op))
1257 if (is<LoadNonVolatileOperation>(op))
1259 return convert<LoadNonVolatileOperation>(op,
arguments, builder);
1261 if (is<LoadVolatileOperation>(op))
1263 return convert<LoadVolatileOperation>(op,
arguments, builder);
1265 if (is<StoreNonVolatileOperation>(op))
1269 if (is<StoreVolatileOperation>(op))
1271 return convert<StoreVolatileOperation>(op,
arguments, builder);
1273 if (is<AllocaOperation>(op))
1277 if (is<GetElementPtrOperation>(op))
1281 if (is<ConstantDataArrayOperation>(op))
1283 return convert<ConstantDataArrayOperation>(op,
arguments, builder);
1285 if (is<PtrCmpOperation>(op))
1289 if (is<FCmpOperation>(op))
1293 if (is<FBinaryOperation>(op))
1297 if (is<VariadicArgumentListOperation>(op))
1301 if (is<ConstantStructOperation>(op))
1303 return convert<ConstantStructOperation>(op,
arguments, builder);
1305 if (is<ConstantPointerNullOperation>(op))
1307 return convert<ConstantPointerNullOperation>(op,
arguments, builder);
1309 if (is<SelectOperation>(op))
1313 if (is<ConstantArrayOperation>(op))
1315 return convert<ConstantArrayOperation>(op,
arguments, builder);
1317 if (is<ConstantAggregateZeroOperation>(op))
1319 return convert<ConstantAggregateZeroOperation>(op,
arguments, builder);
1321 if (is<ControlToIntOperation>(op))
1325 if (is<ConstantVectorOperation>(op))
1329 if (is<ConstantDataVectorOperation>(op))
1333 if (is<ExtractElementOperation>(op))
1337 if (is<ShuffleVectorOperation>(op))
1339 return convert<ShuffleVectorOperation>(op,
arguments, builder);
1341 if (is<InsertElementOperation>(op))
1345 if (is<VectorUnaryOperation>(op))
1349 if (is<VectorBinaryOperation>(op))
1353 if (is<VectorSelectOperation>(op))
1355 return convert<VectorSelectOperation>(op,
arguments, builder);
1357 if (is<ExtractValueOperation>(op))
1359 return convert<ExtractValueOperation>(op,
arguments, builder);
1365 if (is<CallOperation>(op))
1367 return convert<CallOperation>(op,
arguments, builder);
1369 if (is<MallocOperation>(op))
1371 return convert<MallocOperation>(op,
arguments, builder);
1373 if (is<FreeOperation>(op))
1375 return convert<FreeOperation>(op,
arguments, builder);
1377 if (is<MemCpyNonVolatileOperation>(op))
1379 return convert<MemCpyNonVolatileOperation>(op,
arguments, builder);
1381 if (is<MemCpyVolatileOperation>(op))
1383 return convert<MemCpyVolatileOperation>(op,
arguments, builder);
1385 if (is<MemSetNonVolatileOperation>(op))
1389 if (is<MemMoveNonVolatileOperation>(op))
1395 return builder.CreateMemMove(
1397 ::llvm::MaybeAlign(),
1399 ::llvm::MaybeAlign(),
1402 if (is<FNegOperation>(op))
1406 if (is<BitCastOperation>(op))
1408 return convert_cast<::llvm::Instruction::BitCast>(op, originalOp,
arguments, builder);
1410 if (is<FPExtOperation>(op))
1412 return convert_cast<::llvm::Instruction::FPExt>(op, originalOp,
arguments, builder);
1414 if (is<FPToSIOperation>(op))
1416 return convert_cast<::llvm::Instruction::FPToSI>(op, originalOp,
arguments, builder);
1418 if (is<FPToUIOperation>(op))
1420 return convert_cast<::llvm::Instruction::FPToUI>(op, originalOp,
arguments, builder);
1422 if (is<FPTruncOperation>(op))
1424 return convert_cast<::llvm::Instruction::FPTrunc>(op, originalOp,
arguments, builder);
1426 if (is<IntToPtrOperation>(op))
1428 return convert_cast<::llvm::Instruction::IntToPtr>(op, originalOp,
arguments, builder);
1430 if (is<PtrToIntOperation>(op))
1432 return convert_cast<::llvm::Instruction::PtrToInt>(op, originalOp,
arguments, builder);
1434 if (is<SExtOperation>(op))
1436 return convert_cast<::llvm::Instruction::SExt>(op, originalOp,
arguments, builder);
1438 if (is<SIToFPOperation>(op))
1440 return convert_cast<::llvm::Instruction::SIToFP>(op, originalOp,
arguments, builder);
1442 if (is<TruncOperation>(op))
1444 return convert_cast<::llvm::Instruction::Trunc>(op, originalOp,
arguments, builder);
1446 if (is<UIToFPOperation>(op))
1448 return convert_cast<::llvm::Instruction::UIToFP>(op, originalOp,
arguments, builder);
1450 if (is<ZExtOperation>(op))
1452 return convert_cast<::llvm::Instruction::ZExt>(op, originalOp,
arguments, builder);
1454 if (is<MemoryStateMergeOperation>(op))
1456 return convert<MemoryStateMergeOperation>(op,
arguments, builder);
1458 if (is<MemoryStateJoinOperation>(op))
1464 if (is<MemoryStateSplitOperation>(op))
1466 return convert<MemoryStateSplitOperation>(op,
arguments, builder);
1468 if (is<LambdaEntryMemoryStateSplitOperation>(op))
1470 return convert<LambdaEntryMemoryStateSplitOperation>(op,
arguments, builder);
1472 if (is<LambdaExitMemoryStateMergeOperation>(op))
1474 return convert<LambdaExitMemoryStateMergeOperation>(op,
arguments, builder);
1476 if (is<CallEntryMemoryStateMergeOperation>(op))
1478 return convert<CallEntryMemoryStateMergeOperation>(op,
arguments, builder);
1480 if (is<CallExitMemoryStateSplitOperation>(op))
1482 return convert<CallExitMemoryStateSplitOperation>(op,
arguments, builder);
1484 if (is<PointerToFunctionOperation>(op))
1486 return convert<PointerToFunctionOperation>(op,
arguments, builder);
1488 if (is<FunctionToPointerOperation>(op))
1490 return convert<FunctionToPointerOperation>(op,
arguments, builder);
1492 if (is<FMulAddIntrinsicOperation>(op))
1499 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1500 return builder.CreateIntrinsic(
1501 ::llvm::Intrinsic::fmuladd,
1503 { multiplier, multiplicand, summand });
1505 if (is<SMaxOperation>(op))
1511 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1512 return builder.CreateIntrinsic(::llvm::Intrinsic::smax, { type }, { operand1, operand2 });
1514 if (is<UMaxOperation>(op))
1520 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1521 return builder.CreateIntrinsic(::llvm::Intrinsic::umax, { type }, { operand1, operand2 });
1523 if (is<SMinOperation>(op))
1529 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1530 return builder.CreateIntrinsic(::llvm::Intrinsic::smin, { type }, { operand1, operand2 });
1532 if (is<UMinOperation>(op))
1538 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1539 return builder.CreateIntrinsic(::llvm::Intrinsic::umin, { type }, { operand1, operand2 });
1541 if (is<FAbsOperation>(op))
1546 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1547 return builder.CreateIntrinsic(::llvm::Intrinsic::fabs, { type }, { operand });
1549 if (is<FShlOperation>(op))
1556 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1557 return builder.CreateIntrinsic(
1558 ::llvm::Intrinsic::fshl,
1560 { operand1, operand2, operand3 });
1562 if (is<FloorOperation>(op))
1567 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1568 return builder.CreateIntrinsic(::llvm::Intrinsic::floor, { type }, { operand });
1570 if (is<AbsOperation>(op))
1576 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1577 return builder.CreateIntrinsic(::llvm::Intrinsic::abs, { type }, { operand1, operand2 });
1579 if (is<CeilOperation>(op))
1584 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1585 return builder.CreateIntrinsic(::llvm::Intrinsic::ceil, { type }, { operand });
1587 if (is<RIntOperation>(op))
1592 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1593 return builder.CreateIntrinsic(::llvm::Intrinsic::rint, { type }, { operand });
1595 if (is<TruncIntrinsicOperation>(op))
1600 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1601 return builder.CreateIntrinsic(::llvm::Intrinsic::trunc, { type }, { operand });
1603 if (is<BSwapOperation>(op))
1608 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1609 return builder.CreateIntrinsic(::llvm::Intrinsic::bswap, { type }, { operand });
1611 if (is<CtlzOperation>(op))
1617 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1618 return builder.CreateIntrinsic(::llvm::Intrinsic::ctlz, { type }, { operand, isZeroPoison });
1620 if (is<CttzOperation>(op))
1626 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1627 return builder.CreateIntrinsic(::llvm::Intrinsic::cttz, { type }, { operand, isZeroPoison });
1629 if (is<CtpopOperation>(op))
1634 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1635 return builder.CreateIntrinsic(::llvm::Intrinsic::ctpop, { type }, { operand });
1637 if (is<IsConstantOperation>(op))
1642 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1643 return builder.CreateIntrinsic(::llvm::Intrinsic::is_constant, { type }, { operand });
1645 if (is<IsFPClassOperation>(op))
1651 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1652 return builder.CreateIntrinsic(::llvm::Intrinsic::is_fpclass, { type }, { operand1, operand2 });
1654 if (is<SAddWithOverflowOperation>(op))
1660 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1661 return builder.CreateIntrinsic(
1662 ::llvm::Intrinsic::sadd_with_overflow,
1664 { operand1, operand2 });
1666 if (is<UAddWithOverflowOperation>(op))
1672 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1673 return builder.CreateIntrinsic(
1674 ::llvm::Intrinsic::uadd_with_overflow,
1676 { operand1, operand2 });
1678 if (is<SSubWithOverflowOperation>(op))
1684 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1685 return builder.CreateIntrinsic(
1686 ::llvm::Intrinsic::ssub_with_overflow,
1688 { operand1, operand2 });
1690 if (is<SMulWithOverflowOperation>(op))
1696 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1697 return builder.CreateIntrinsic(
1698 ::llvm::Intrinsic::smul_with_overflow,
1700 { operand1, operand2 });
1702 if (is<RoundOperation>(op))
1707 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1708 return builder.CreateIntrinsic(::llvm::Intrinsic::round, { type }, { operand });
1710 if (is<UMulWithOverflowOperation>(op))
1716 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1717 return builder.CreateIntrinsic(
1718 ::llvm::Intrinsic::umul_with_overflow,
1720 { operand1, operand2 });
1722 if (is<CopysignOperation>(op))
1728 Context_->GetTypeConverter().ConvertJlmType(
arguments[0]->type(), builder.getContext());
1729 return builder.CreateIntrinsic(::llvm::Intrinsic::copysign, { type }, { operand1, operand2 });
1731 if (is<PtrMaskOperation>(op))
1736 return builder.CreateIntrinsic(
1737 ::llvm::Intrinsic::ptrmask,
1738 { ptrOperand->getType(), maskOperand->getType() },
1739 { ptrOperand, maskOperand });