我想用两个整数进行小于或等于比较运算:op1 <= -op2。但是两个操作数都可以是最小值(0x80 ... 0),因此'neg'可以产生有毒值。如果我使用x86 asm,我会写:
add r8,r9
jle SOME_LABEL
但是在LLVM IR中,我只能编写以下结构:
%neg_op2 = sub i64 0, %op2
%cmp_sle = icmp sle i64 %op1, %neg_op2
如果op2 = MIN_VALUE将不起作用。当然,我可以添加其他比较,但是生成的x86代码比add + jle差得多。宝贵的性能将会丢失。
是否有任何方法可以通过add + jle的代价使LLVM执行相同的操作?我的目标平台是x86,所以我可以牺牲与平台无关的功能。