【问题标题】:Checking the top bits of an i64 Value in LLVM IR检查 LLVM IR 中 i64 值的最高位
【发布时间】:2022-10-06 03:07:53
【问题描述】:

我将保持简短和重点,但如果需要进一步澄清,请告诉我。

我有一个 i64 值,我想检查它们是否为零。如果它们是零,我会做一些事情,如果不是,我会做其他事情。如何检测 IR 以允许在运行时发生这种情况?

我发现的一件事是 LLVM 有一个内在的“llvm.ctlz”,它计算前导零并将它们放入 i64 值中,但我如何使用它的返回值进行检查?或者我如何检测以便在运行时进行检查?

任何帮助或建议将不胜感激。谢谢!

    标签: llvm llvm-ir


    【解决方案1】:

    你没有说有多少高位,所以我将举一个前 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 指令而不是分支和单独的块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多