diff options
| author | _ov4 <ov4@ov4.org> | 2026-10-22 15:04:13 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-10-22 15:21:14 +0000 |
| commit | 498a01534a4ffe825f84fd1b6aecbde5f5fde09c (patch) | |
| tree | 5df86f4c37a93a91ded8c80ca58c34d0fa1b099e /lib/CodeGen/ArithmeticHandler.cc | |
| parent | fe70048b33baebdfbf7071059bd4742ec16ab408 (diff) | |
fix(codegen): compare BOOLEAN and CHAR values as unsigned
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Diffstat (limited to 'lib/CodeGen/ArithmeticHandler.cc')
| -rw-r--r-- | lib/CodeGen/ArithmeticHandler.cc | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/lib/CodeGen/ArithmeticHandler.cc b/lib/CodeGen/ArithmeticHandler.cc index 6c7a7ff..3044687 100644 --- a/lib/CodeGen/ArithmeticHandler.cc +++ b/lib/CodeGen/ArithmeticHandler.cc @@ -100,6 +100,9 @@ Value *ArithmeticHandler::emitBinaryOp(int Op, Value *LHS, Value *RHS, int Line) HadError = true; return nullptr; } + // BOOLEAN (i1) and CHAR (i8) are unsigned: FALSE < TRUE and + // CHR(200) > CHR(65), which signed predicates would invert. + bool Unsigned = L->getType()->isIntegerTy(1) || L->getType()->isIntegerTy(8); switch (Op) { case '+': return Builder.CreateAdd(L, R, "addtmp"); case '-': return Builder.CreateSub(L, R, "subtmp"); @@ -107,10 +110,10 @@ Value *ArithmeticHandler::emitBinaryOp(int Op, Value *LHS, Value *RHS, int Line) case tok_eq: return Builder.CreateICmpEQ(L, R, "eqtmp"); case tok_ne: return Builder.CreateICmpNE(L, R, "netmp"); - case '<': return Builder.CreateICmpSLT(L, R, "slttmp"); - case '>': return Builder.CreateICmpSGT(L, R, "sgttmp"); - case tok_le: return Builder.CreateICmpSLE(L, R, "sletmp"); - case tok_ge: return Builder.CreateICmpSGE(L, R, "sgetmp"); + case '<': return Unsigned ? Builder.CreateICmpULT(L, R, "ulttmp") : Builder.CreateICmpSLT(L, R, "slttmp"); + case '>': return Unsigned ? Builder.CreateICmpUGT(L, R, "ugttmp") : Builder.CreateICmpSGT(L, R, "sgttmp"); + case tok_le: return Unsigned ? Builder.CreateICmpULE(L, R, "uletmp") : Builder.CreateICmpSLE(L, R, "sletmp"); + case tok_ge: return Unsigned ? Builder.CreateICmpUGE(L, R, "ugetmp") : Builder.CreateICmpSGE(L, R, "sgetmp"); } } |
