c++ - 如何使用 llvm::IRBuilder 创建 Add/Sub/Mul/Div?
问题描述
我正在尝试使用 llvm::IRBuilder 创建 Add/Sub/Mul/Div 操作。但是https://llvm.org/doxygen/classllvm_1_1IRBuilder.html#a4ef70bab263e38c5e0b8c1bf95a5d814中有很多 api :
Value * CreateAdd (Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false);
Value * CreateNSWAdd (Value *LHS, Value *RHS, const Twine &Name="");
Value * CreateNUWAdd (Value *LHS, Value *RHS, const Twine &Name="");
Value * CreateSub (Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false);
Value * CreateNSWSub (Value *LHS, Value *RHS, const Twine &Name="");
Value * CreateNUWSub (Value *LHS, Value *RHS, const Twine &Name="");
Value * CreateMul (Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false);
Value * CreateNSWMul (Value *LHS, Value *RHS, const Twine &Name="");
Value * CreateNUWMul (Value *LHS, Value *RHS, const Twine &Name="");
Value * CreateUDiv (Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false);
Value * CreateExactUDiv (Value *LHS, Value *RHS, const Twine &Name="");
Value * CreateSDiv (Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false);
Value * CreateExactSDiv (Value *LHS, Value *RHS, const Twine &Name="");
当我想生成 Add/Sub/Mul/Div 操作时,我应该使用哪一个?
解决方案
NSW (No Signed Wrap)
和NUS(No Unsigned Wrap)
当运算结果超出有符号整数类型的可表示范围时,会发生有符号整数溢出。对于 say 和 Add 操作,CreateAdd
如果您希望操作的结果环绕该整数类型的 MAX_INT(即 $(2)^(32)$ - 1 用于 unsigned i32),以防它超过该最大值。
通过环绕,我们的意思是如果它的值超过 MAX_INT(overflow),那么它被设置为 MIN_INT。CreateNSWAdd
将允许包装无符号整数,但会为有符号整数生成毒值(未定义行为)。CreateNUSAdd
将生成一个加法运算,允许包装有符号整数,但不允许包装它们的无符号配对。
推荐阅读
- javascript - 使用 React 动态创建表格行
- java - 如何使用 selenium webdriver 执行复制/粘贴
- python - Python间距2048板
- r - 获取脚本以返回对闪亮应用程序的输入值的计算
- html - Pure CSS Bulb - Two shapes change color on click
- javascript - Wordpress/TinyMCE - 挂钩/过滤器以在 url 中添加 Target =“_blank”
- r - 使用 ggplot2 在雷达图中关闭和着色区域
- java - 基于从 Excel 表格中提取的变量运行代码。
- c++ - 将 csv 文件加载到 MySQL C++
- python - 如何动态创建包含 N 个元素的字典?