aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/ArithmeticHandler.cc
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-22 15:04:13 +0000
committer_ov4 <ov4@ov4.org>2026-10-22 15:21:14 +0000
commit498a01534a4ffe825f84fd1b6aecbde5f5fde09c (patch)
tree5df86f4c37a93a91ded8c80ca58c34d0fa1b099e /lib/CodeGen/ArithmeticHandler.cc
parentfe70048b33baebdfbf7071059bd4742ec16ab408 (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.cc11
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");
}
}