【问题标题】:How to use llvm::IRBuilder Create Add/Sub/Mul/Div?如何使用 llvm::IRBuilder 创建 Add/Sub/Mul/Div?
【发布时间】:2020-04-14 12:26:53
【问题描述】:

我正在尝试使用 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++ llvm llvm-clang


    【解决方案1】:

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

    当运算结果超出有符号整数类型的可表示范围时,会发生有符号整数溢出。对于 say 和 Add 操作,如果您希望操作的结果环绕该整数类型的 MAX_INT (即 $(2)^(32)$ - 1 对于无符号 i32),请使用 CreateAdd,以防它超过该最大值价值。

    通过环绕我们的意思是如果它的值超过 MAX_INT(overflow) 那么它被设置为 MIN_INT。 CreateNSWAdd 将允许包装无符号整数,但会为有符号整数生成毒值(未定义行为)。 CreateNUSAdd 将生成一个加法运算,允许包装有符号整数,但不允许包装它们的无符号配对。

    【讨论】:

    • 能否举一些例子来解释一下?
    【解决方案2】:

    using System;
    namespace ConsoleApp1
    {
        class Program
        {
    
            public static int Addition(int value1, int value2)
            {
                return value1 + value2;
            }
            public static int Subtraction(int value1, int value2)
            {
                return value1 - value2;
            }
            public static int Multiplication(int value1, int value2)
            {
                return value1 * value2;
            }
            public static double Division(double value1, double value2)
            {
                return value1 / value2;
            }
    
            static void Main(string[] args)
            {
                while (true)
                {
                    Console.Write("\nEnter Value 1 : ");
                    int a = Convert.ToInt32(Console.ReadLine());
                    Console.Write("Enter Value 2 : ");
                    int b = Convert.ToInt32(Console.ReadLine());
    
                    Console.WriteLine("Please Enter action to be performed :");
                    Console.WriteLine("1. Addition");
                    Console.WriteLine("2. Subtraction");
                    Console.WriteLine("3. Multiplication");
                    Console.WriteLine("4. Division");
    
                    int action = Convert.ToInt32(Console.ReadLine());
                    string _operation = "";
                    double result = 0;
                    switch (action)
                    {
                        case 1:
                            {
                                result = Addition(a, b);
                                _operation = "+";
                                break;
                            }
                        case 2:
                            {
                                result = Subtraction(a, b);
                                _operation = "-";
                                break;
                            }
                        case 3:
                            {
                                result = Multiplication(a, b);
                                _operation = "*";
                                break;
                            }
                        case 4:
                            {
                                result = Division(a, b);
                                _operation = "/";
                                break;
                            }
                    }
                    Console.WriteLine("Result A {0} B = {1}", _operation, result);
    
                    char theKey = Console.ReadKey().KeyChar;
    
                    if (theKey == 'y' || theKey == 'Y')
                    {
                        Console.Clear();
                        continue;
                    }
                    else
                    {
                        break;
                    }
                }
    
    
            } 
        }
    }
    

    【讨论】:

    • 图片中的文字很难阅读。您应该将输出示例发布为格式正确的文本。
    猜你喜欢
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多