C# 如何防止编译器生成比较指令而不是分支指令?

C# 如何防止编译器生成比较指令而不是分支指令?,c#,bytecode,cil,opcode,C#,Bytecode,Cil,Opcode,给定分支指令(来自)的以下相同属性: blt:执行clt指令,然后执行指向特定目标指令的brtrue分支的效果相同 bgt:执行cgt指令,然后执行指向特定目标指令的brtrue分支的效果相同 bge:执行clt指令(clt.un用于浮动)后执行brfalse分支到特定目标指令的效果是相同的 beq:其效果与执行ceq指令,然后执行指向特定目标指令的brtrue分支相同 事实证明,编译器通常会通过转换布尔运算符(如“)来优化控制流。我编写了一个生成器,它能够确保方法定义包含分支变量而不是比较变量

给定分支指令(来自)的以下相同属性:

  • blt:执行clt指令,然后执行指向特定目标指令的brtrue分支的效果相同
  • bgt:执行cgt指令,然后执行指向特定目标指令的brtrue分支的效果相同
  • bge:执行clt指令(clt.un用于浮动)后执行brfalse分支到特定目标指令的效果是相同的
  • beq:其效果与执行ceq指令,然后执行指向特定目标指令的brtrue分支相同

  • 事实证明,编译器通常会通过转换布尔运算符(如“)来优化控制流。我编写了一个生成器,它能够确保方法定义包含分支变量而不是比较变量。它通过为分支变量构建一个完整的方法体来实现这一点。此生成器仅适用于文档中所示的方法。我在测试中使用的这种方法

    //
    ///条件分支语句的生成器。
    ///此生成器仅适用于以下方法结构:
    ///*如果满足条件,则返回true
    ///*如果不满足条件,则返回false
    ///*两个int参数。
    ///*如果检查条件,则为一个。
    ///     ```
    ///公共布尔条件检查(内部左侧、内部右侧)
    ///     {
    ///如果(左侧(任何条件)右侧)
    ///         {
    ///返回true;
    ///         }
    ///返回false;
    ///     }
    ///     ```
    ///在某些情况下,编译器可以生成类似clt/cgt的“比较”,而不是分支变量blt/bgt。
    ///当与分支变量进行比较时,此生成器能够重写方法体。
    /// 
    内部类条件分支生成器
    {
    专用只读列表\u指令;
    /// 
    ///通过传入将在生成过程中使用的分支运算符生成新实例。
    ///只接受bgt/blt/beq等分支运算符。。
    /// 
    /// 
    公共条件分支生成器(操作码比较)
    {
    var ia=指令.Create(操作码.Ldloc_1);
    var ib=指令.Create(操作码.Ret);
    var i7=指令.Create(操作码.Ldc_I4_1);
    //加载两个参数布尔值
    var i1=指令.Create(操作码.Ldarg_1);
    var i2=指令.Create(操作码.Ldarg_2);
    //如果比较结果为真,则分支为i7。
    var i3=指令.Create(比较,i7);
    //如果比较为false,则加载“0”(false)并返回分支。
    var i4=指令.Create(操作码.Ldc_i4_0);
    var i5=指令.Create(操作码.Stloc_1);
    var i6=指令.Create(操作码.Br_S,ia);
    var i8=指令.Create(操作码.Stloc_1);
    var i9=指令.Create(操作码.Br_S,ia);
    i1.下一个=i2;
    i2.Next=i3;
    i3.Next=i4;
    i4.下一个=i5;
    i5.下一个=i6;
    i6.下一个=i7;
    i7.Next=i8;
    i8.Next=i9;
    i9.Next=ia;
    ia.Next=ib;
    i2.先前=i1;
    i3.先前=i2;
    i4.先前=i3;
    i5.先前=i4;
    i6.先前=i5;
    i7.先前=i6;
    i8.先前=i7;
    i9.先前=i8;
    ia.Previous=i9;
    ib.先前=ia;
    i1.偏移量=0;
    i2.偏移量=1;
    i3.偏移量=2;
    i4.偏移量=3;
    i5.偏移量=4;
    i6.偏移量=5;
    i7.偏移量=6;
    i8.偏移量=7;
    i9.偏移量=8;
    ia.偏移量=9;
    ib.偏移量=10;
    _说明=新列表
    {
    i1,i2,i3,i4,i5,i6,i7,i8,i9,ia,ib
    };
    }
    /// 
    ///替换方法体时,正在与分支变量进行比较。
    ///请注意,方法定义必须符合类级注释中注明的严格规则。
    /// 
    /// 
    公共无效替换方法说明(方法定义方法)
    {
    方法.Body.Instructions.Clear();
    foreach(var指令在_指令中)
    方法.正文.说明.添加(说明);
    }
    }
    
    我编写了一个生成器,它能够确保方法定义包含分支变量而不是比较变量。它通过为分支变量构建一个完整的方法体来实现这一点。此生成器仅适用于文档中所示的方法。我在测试中使用的这种方法

    //
    ///条件分支语句的生成器。
    ///此生成器仅适用于以下方法结构:
    ///*如果满足条件,则返回true
    ///*如果不满足条件,则返回false
    ///*两个int参数。
    ///*如果检查条件,则为一个。
    ///     ```
    ///公共布尔条件检查(内部左侧、内部右侧)
    ///     {
    ///如果(左侧(任何条件)右侧)
    ///         {
    ///返回true;
    ///         }
    ///返回false;
    ///     }
    ///     ```
    ///在某些情况下,编译器可以生成类似clt/cgt的“比较”,而不是分支变量blt/bgt。
    ///此生成器能够重写方法