comparison 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
comparison
equal deleted inserted replaced
574:aee6217b4084 575:f0c20d50d4b3
1176 1176
1177 if (t->isintegral() || t->ty == Tpointer) 1177 if (t->isintegral() || t->ty == Tpointer)
1178 { 1178 {
1179 llvm::ICmpInst::Predicate cmpop; 1179 llvm::ICmpInst::Predicate cmpop;
1180 bool skip = false; 1180 bool skip = false;
1181 // pointers don't report as being unsigned
1182 bool uns = (t->isunsigned() || t->ty == Tpointer);
1181 switch(op) 1183 switch(op)
1182 { 1184 {
1183 case TOKlt: 1185 case TOKlt:
1184 case TOKul: 1186 case TOKul:
1185 cmpop = t->isunsigned() ? llvm::ICmpInst::ICMP_ULT : llvm::ICmpInst::ICMP_SLT; 1187 cmpop = uns ? llvm::ICmpInst::ICMP_ULT : llvm::ICmpInst::ICMP_SLT;
1186 break; 1188 break;
1187 case TOKle: 1189 case TOKle:
1188 case TOKule: 1190 case TOKule:
1189 cmpop = t->isunsigned() ? llvm::ICmpInst::ICMP_ULE : llvm::ICmpInst::ICMP_SLE; 1191 cmpop = uns ? llvm::ICmpInst::ICMP_ULE : llvm::ICmpInst::ICMP_SLE;
1190 break; 1192 break;
1191 case TOKgt: 1193 case TOKgt:
1192 case TOKug: 1194 case TOKug:
1193 cmpop = t->isunsigned() ? llvm::ICmpInst::ICMP_UGT : llvm::ICmpInst::ICMP_SGT; 1195 cmpop = uns ? llvm::ICmpInst::ICMP_UGT : llvm::ICmpInst::ICMP_SGT;
1194 break; 1196 break;
1195 case TOKge: 1197 case TOKge:
1196 case TOKuge: 1198 case TOKuge:
1197 cmpop = t->isunsigned() ? llvm::ICmpInst::ICMP_UGE : llvm::ICmpInst::ICMP_SGE; 1199 cmpop = uns ? llvm::ICmpInst::ICMP_UGE : llvm::ICmpInst::ICMP_SGE;
1198 break; 1200 break;
1199 case TOKue: 1201 case TOKue:
1200 cmpop = llvm::ICmpInst::ICMP_EQ; 1202 cmpop = llvm::ICmpInst::ICMP_EQ;
1201 break; 1203 break;
1202 case TOKlg: 1204 case TOKlg: