LLVM.是否可以使用SwitchInst设置范围标签?

kpd*_*dev 3 llvm

我知道如何用LLVM API(特别是SwitchInst)编译这样的代码:

switch (h)
{
case 11:
   .......
case 22:
   ........
}
Run Code Online (Sandbox Code Playgroud)

但我不知道,是否可以使用SwitchInst编译这样的代码:

  Select Case x
     Case 11 To 40
        ...........
     Case 41 To 70
        ...........
  End Select
Run Code Online (Sandbox Code Playgroud)

如何设置远程案例标签?

switchOperator->addCase(...What I need to put here?..)
Run Code Online (Sandbox Code Playgroud)

Eli*_*sky 6

不,这是不可能直接的,因为LLVM switch指令不支持:

'switch'指令使用三个参数:整数比较值'value',默认的'label'目的地,以及一对比较值常数和'label'的数组.该表不允许包含重复的常量条目.

例:

; Implement a jump table:
switch i32 %val, label %otherwise [ i32 0, label %onzero
                                    i32 1, label %onone
                                    i32 2, label %ontwo ]
Run Code Online (Sandbox Code Playgroud)

也就是说,如果您的范围不是太大,您可以生成映射到同一标签的许多比较值(11,12,13 ... 40).

  • @kpdev:这是一个很好的问题,答案是启发式的 - 这取决于有多少案例和你的范围有多大.如果只有一些非常大的案例,那么是的,if-else链可能会更好.但这取决于目标,所以最好是基准测试 (2认同)