diff gen/toir.cpp @ 575:f0c20d50d4b3

Pointer comparisons were being treated as signed integers. Now they are handled as unsigned integers.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Thu, 04 Sep 2008 17:24:10 +0200
parents aee6217b4084
children fbb1a366cfbc
line wrap: on
line diff
--- a/gen/toir.cpp	Thu Sep 04 17:17:40 2008 +0200
+++ b/gen/toir.cpp	Thu Sep 04 17:24:10 2008 +0200
@@ -1178,23 +1178,25 @@
     {
         llvm::ICmpInst::Predicate cmpop;
         bool skip = false;
+        // pointers don't report as being unsigned
+        bool uns = (t->isunsigned() || t->ty == Tpointer);
         switch(op)
         {
         case TOKlt:
         case TOKul:
-            cmpop = t->isunsigned() ? llvm::ICmpInst::ICMP_ULT : llvm::ICmpInst::ICMP_SLT;
+            cmpop = uns ? llvm::ICmpInst::ICMP_ULT : llvm::ICmpInst::ICMP_SLT;
             break;
         case TOKle:
         case TOKule:
-            cmpop = t->isunsigned() ? llvm::ICmpInst::ICMP_ULE : llvm::ICmpInst::ICMP_SLE;
+            cmpop = uns ? llvm::ICmpInst::ICMP_ULE : llvm::ICmpInst::ICMP_SLE;
             break;
         case TOKgt:
         case TOKug:
-            cmpop = t->isunsigned() ? llvm::ICmpInst::ICMP_UGT : llvm::ICmpInst::ICMP_SGT;
+            cmpop = uns ? llvm::ICmpInst::ICMP_UGT : llvm::ICmpInst::ICMP_SGT;
             break;
         case TOKge:
         case TOKuge:
-            cmpop = t->isunsigned() ? llvm::ICmpInst::ICMP_UGE : llvm::ICmpInst::ICMP_SGE;
+            cmpop = uns ? llvm::ICmpInst::ICMP_UGE : llvm::ICmpInst::ICMP_SGE;
             break;
         case TOKue:
             cmpop = llvm::ICmpInst::ICMP_EQ;