首页 > 解决方案 > 如何使用 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 操作时,我应该使用哪一个?

标签: c++llvmllvm-clang

解决方案


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将生成一个加法运算,允许包装有符号整数,但不允许包装它们的无符号配对。


推荐阅读