【发布时间】:2022-10-06 03:07:53
【问题描述】:
我将保持简短和重点,但如果需要进一步澄清,请告诉我。
我有一个 i64 值,我想检查它们是否为零。如果它们是零,我会做一些事情,如果不是,我会做其他事情。如何检测 IR 以允许在运行时发生这种情况?
我发现的一件事是 LLVM 有一个内在的“llvm.ctlz”,它计算前导零并将它们放入 i64 值中,但我如何使用它的返回值进行检查?或者我如何检测以便在运行时进行检查?
任何帮助或建议将不胜感激。谢谢!
我将保持简短和重点,但如果需要进一步澄清,请告诉我。
我有一个 i64 值,我想检查它们是否为零。如果它们是零,我会做一些事情,如果不是,我会做其他事情。如何检测 IR 以允许在运行时发生这种情况?
我发现的一件事是 LLVM 有一个内在的“llvm.ctlz”,它计算前导零并将它们放入 i64 值中,但我如何使用它的返回值进行检查?或者我如何检测以便在运行时进行检查?
任何帮助或建议将不胜感激。谢谢!
你没有说有多少高位,所以我将举一个前 32 位的例子。给定i64 %x,我会用%result = icmp uge i64 %x, i64 4294967296 检查它,因为 4294967296 是 2^32,这是第一个在前 32 位中有 1 位的值。如果要检查前两位是否为零,请改用 2^62 (4611686018427387904)。
为了根据%result 的值做两件不同的事情,通常你会想要在它上面分支。 BasicBlock 有一个方法 splitBasicBlock 需要一条指令来拆分。使用它将您的块拆分为之前和之后。为真面和假面创建新块,将结果上的分支添加到新块br i1 %result, label %cond_true, label %cond_false。确保这两个新块分支回后块。
根据您想要做什么,您可能不需要整个块,例如,如果您只计算一个值而不进行任何副作用操作,您可能可以使用 select 指令而不是分支和单独的块。
【讨论】: