Как использовать llvm :: IRBuilder Создать Add / Sub / Mul / Div? - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь использовать llvm :: IRBuilder Create Add / Sub / Mul / Div. Но есть много apis в https://llvm.org/doxygen/classllvm_1_1IRBuilder.html#a4ef70bab263e38c5e0b8c1bf95a5d814:

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?

1 Ответ

1 голос
/ 14 апреля 2020

NSW (No Signed Wrap) и NUS(No Unsigned Wrap)

Переполнение целого числа со знаком происходит, когда результат операции выходит за пределы представимого диапазона для целочисленного типа со знаком. Для операций say и Add, используйте CreateAdd, если вы хотите, чтобы результат операции обернулся вокруг MAX_INT (т. Е. $ (2) ^ (32) $ - 1 для беззнакового i32) для этого целочисленного типа в случае, если он превышает этот максимум value.

Обтеканием мы подразумеваем, что если его значение превышает MAX_INT (переполнение), тогда оно установлено в MIN_INT. CreateNSWAdd разрешит перенос для целых чисел без знака, но сгенерирует ошибочное значение (неопределенное поведение) для целых чисел со знаком. CreateNUSAdd сгенерирует операцию сложения, разрешающую перенос для целых чисел со знаком, но не для их беззнаковых сопряжений.

...