On Sat, Jun 16, 2012 at 9:55 AM, Xi Wang <xi.wang@xxxxxxxxx> wrote: > Casting to _Bool requires a zero test rather than truncation. > > Signed-off-by: Xi Wang <xi.wang@xxxxxxxxx> > --- > A simple example is: > > _Bool x = 0x200; > > x should have been true rather than false. > > BTW, this patch also disables the warning "cast truncates bits from > constant value". Does that sound good? That's unfortunate. > A more serious problem is something like: > > _Bool foo(int x) { return x; } > > sparse emits: > > scast.1 %r2 <- (32) %arg1 > > which makes sparse-llvm generate: > > %R2 = trunc i32 %0 to i1 > > My experimental backend "splay" has to treat _Bool specifically to > generate: > > %0 = icmp ne i32 %x, 0 > > Should we leave the conversion job to backends, or should we just fix > the sparse IR (e.g., emitting setne rather than scast for casts to _Bool)? It'd be best if the backend didn't have to do anything special here. Can we have it both ways? Not disable the warning but still deal with it in the frontend? > --- > expand.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/expand.c b/expand.c > index 63a9075..ee818a4 100644 > --- a/expand.c > +++ b/expand.c > @@ -92,6 +92,12 @@ void cast_value(struct expression *expr, struct symbol *newtype, > value = get_longlong(old); > > Int: > + // _Bool requires a zero test rather than truncation. > + if (is_bool_type(newtype)) { > + expr->value = value ? 1 : 0; > + return; > + } > + > // Truncate it to the new size > signmask = 1ULL << (new_size-1); > mask = signmask | (signmask-1); > -- > 1.7.9.5 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-sparse" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html