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

LLVM。是否可以使用SwitchInst设置范围标签?,llvm,Llvm,我知道如何使用LLVM API(特别是使用SwitchInst)编译这段代码: 但我不知道,是否可以用SwitchInst编译这样的代码: Select Case x Case 11 To 40 ........... Case 41 To 70 ........... End Select 如何设置范围大小写标签 switchOperator->addCase(...What I need to put here?..) 不

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

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

  Select Case x
     Case 11 To 40
        ...........
     Case 41 To 70
        ...........
  End Select
如何设置范围大小写标签

switchOperator->addCase(...What I need to put here?..)
不可能,因为LLVM
开关
指令:

“switch”指令使用三个参数:整数比较 值'value',默认的'label'目的地,以及成对的 比较值常量和“标签”。这张桌子不允许移动 包含重复的常量条目

例如:

; Implement a jump table:
switch i32 %val, label %otherwise [ i32 0, label %onzero
                                    i32 1, label %onone
                                    i32 2, label %ontwo ]

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

谢谢。因此,如果我的范围可能很大,我是否需要使用ICmpInst而不是SwitchInst?这是正确的变体吗?@kpdev:这是一个好问题,答案是启发性的——这取决于有多少案例以及您的范围有多大。如果只有几个非常大的案例,那么是的,一个If-else链可能会更好。但这取决于目标,所以最好的办法是基准测试
; Implement a jump table:
switch i32 %val, label %otherwise [ i32 0, label %onzero
                                    i32 1, label %onone
                                    i32 2, label %ontwo ]