On Dec 22, 2006, at 3:08 PM, Reid Spencer wrote: > On Fri, 2006-12-22 at 12:08 -0800, Chris Lattner wrote: > >> >> +/// Four bits are used to represent the condition, as follows: >> +/// 0 A > B >> +/// 1 A == B >> +/// 2 A < B >> +/// 3 A and B are signed >> +/// >> +/// S<=> Definition S<=> Definition >> +/// 0000 Always false 1000 Alwasy false >> +/// 0001 A u> B 1001 A s> B >> +/// 0010 A == B 1010 A == B >> +/// 0011 A u>= B 1011 A s>= B >> +/// 0100 A u< B 1100 A s< B >> +/// 0101 A != B 1101 A != B >> +/// 0110 A u<= B 1110 A s<= B >> +/// 0111 Always true 1111 Always true >> +/// >> +static unsigned getICmpCode(const ICmpInst *ICI) { >> >> >> This table (and it's use) is not correct. It will miscompile: >> >> >> (a <u b) | (a <s b) >> >> >> You really want separate bits for s<, s>, u<, u>. In this case, >> you'd >> detect that the merged comparison can't be done with a single >> compare, >> so you give up. > > I don't understand. There are separate bits for each of those. > > s< = 1100 > s> = 1001 > u< = 0100 > u> = 0001
If you or together s< and u< you get 1100, which is thought to be s<. This is not valid. You want == -> 00001 s< -> 00010 s> -> 00100 u< -> 01000 u> -> 10000 or something -Chris _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits