[llvm-commits] SETCC Patches #2
Chris Lattner
clattner at apple.com
Mon Dec 18 23:20:42 PST 2006
>> It would be better to split up the "EqualTo" predicate here so that
>> there was one for FP and one for integers. When the FP part of this
>> lands, you'll want "Unordered" "Equal" and "LessThan" instead of just
>> LessThan + Equal.
>
> Okay, good idea. Could you please review the CF.patch file which is
> attached. I think this is what you had in mind.
It looks great. However, if possible, it sure would be nice to just
nuke the templates :).
>> Further, 'lessthan' drops the sign, so the code is apparently wrong.
>
> I'm not following this. I thought you weren't allowed to do relational
> operators on packed type? Are you talking about the ConstantInt case?
> This:
> static Constant *LessThan(const ConstantInt *V1, const ConstantInt
> *V2) {
> bool R = (BuiltinType)V1->getZExtValue() <
> (BuiltinType)V2->getZExtValue();
> return ConstantBool::get(R);
> }
Right, but that LessThan predicate (which always evaluates the
predicate as unsigned) is also called for slt. This is a bug.
>>
>> +Constant *llvm::ConstantFoldCompareInstruction(
>> + unsigned opcode, Constant *C1, Constant *C2, unsigned short
>> predicate) {
>> ...
>> + case ICmpInst::ICMP_ULT:
>> + case ICmpInst::ICMP_SLT: C = ConstRules::get(C1, C2).lessthan
>> (C1,
>> C2);break;
>> + case ICmpInst::ICMP_UGT:
>> + case ICmpInst::ICMP_SGT: C = ConstRules::get(C1, C2).lessthan
>> (C2,
>> C1);break;
>> + case ICmpInst::ICMP_ULE:
>> + case ICmpInst::ICMP_SLE: // C1 <= C2 === !(C2 < C1)
>> + C = ConstRules::get(C1, C2).lessthan(C2, C1);
>> + if (C) return ConstantExpr::getNot(C);
>> + break;
>> + case ICmpInst::ICMP_UGE:
>> + case ICmpInst::ICMP_SGE: // C1 >= C2 === !(C1 < C2)
>> + C = ConstRules::get(C1, C2).lessthan(C1, C2);
>> + if (C) return ConstantExpr::getNot(C);
>> + break;
>>
>>
>> These drop the sign of the comparison, which is a serious bug. I'd
>> expect this to miscompile things like:
>>
>>
>> %X = iset slt ubyte 0, ubyte 128
>>
>>
>> ... or whatever the syntax is.
>
> The LessThan code above for ConstantInt works fine. It extracts the
> canonical ZExt form then casts each operand to the correct type before
> doing the compare:
> bool R = (BuiltinType)V1->getZExtValue() <
> (BuiltinType)V2->getZExtValue();
>
> I don't see the problem.
The code is trying to do a signed less than comparison, you're always
doing an unsigned comparison.
I will look into 'SETCC InstructionCombining.cpp' next, but not tonight.
-Chris
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20061218/457a4a4a/attachment.html>
More information about the llvm-commits
mailing list