Changes in directory llvm-gcc/gcc:
llvm-expand.c updated: 1.125 -> 1.126 llvm-representation.h updated: 1.22 -> 1.23 llvm-types.c updated: 1.31 -> 1.32 --- Log message: Force bit count intrinsics to all have unsigned operands and unsigned results. --- Diffs of the changes: (+70 -45) llvm-expand.c | 101 ++++++++++++++++++++++++++++---------------------- llvm-representation.h | 3 - llvm-types.c | 11 +++++ 3 files changed, 70 insertions(+), 45 deletions(-) Index: llvm-gcc/gcc/llvm-expand.c diff -u llvm-gcc/gcc/llvm-expand.c:1.125 llvm-gcc/gcc/llvm-expand.c:1.126 --- llvm-gcc/gcc/llvm-expand.c:1.125 Mon Jan 16 16:21:14 2006 +++ llvm-gcc/gcc/llvm-expand.c Tue Jan 17 00:22:23 2006 @@ -3394,7 +3394,7 @@ /* Add a PHI node to merge together the two computed values */ - if (CondBr->NumOperands == 1 && CondBr->Operands[0] != DoneBlock) { + if (CondBr->NumOperands == 1 && CondBr->Operands[0] != D2V(DoneBlock)) { /* The cond branch terminating FromBlock was folded to not go to the done * block at all. This code is only reachable from the TestBlock. */ @@ -4585,19 +4585,23 @@ return BL->Fn = CreateIntrinsicFnWithType(Name, FnTy); } -static llvm_value * -llvm_expand_builtin_unaryop(llvm_function *Fn, llvm_type *DestTy, - tree arglist, const char *FnName) { - llvm_value *arg; - llvm_instruction *TheCall; +/* llvm_expand_unaryop - Expand the specified operand list to a unary function, + * checking that it is actually a list with one element. + */ +static llvm_value *llvm_expand_unaryop(llvm_function *Fn, tree arglist) { if (arglist == 0 || TREE_CHAIN(arglist) != 0) { - error("Invalid argument list to `%s'", FnName); - return llvm_constant_get_null(DestTy); + error("Invalid argument list to function"); + exit(1); } - - arg = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0); - TheCall = llvm_instruction_new(arg->Ty, "tmp", O_Call, 2); + return llvm_expand_expr(Fn, TREE_VALUE(arglist), 0); +} + +static llvm_value * +llvm_expand_builtin_unaryop(llvm_function *Fn, llvm_type *DestTy, + llvm_value *arg, const char *FnName) { + llvm_instruction *TheCall = + llvm_instruction_new(arg->Ty, "tmp", O_Call, 2); TheCall->Operands[0] = G2V(GetUnaryBuiltin(FnName, arg->Ty)); TheCall->Operands[1] = arg; append_inst(Fn, TheCall); @@ -4759,12 +4763,12 @@ case BUILT_IN_SQRTL: /* If errno math has been disabled, expand these to llvm.sqrt calls. */ if (!flag_errno_math) { - Op0 = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0); + Op0 = llvm_expand_unaryop(Fn, arglist); switch (Op0->Ty->ID) { case FloatTyID: - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist,"llvm.sqrt.f32"); + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.sqrt.f32"); case DoubleTyID: - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist,"llvm.sqrt.f64"); + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.sqrt.f64"); default: abort(); /* shouldn't happen */ } @@ -4949,50 +4953,59 @@ case BUILT_IN_CLZ: case BUILT_IN_CLZL: case BUILT_IN_CLZLL: - Op0 = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0); + Op0 = llvm_expand_unaryop(Fn, arglist); + if (llvm_type_is_signed(Op0->Ty)) + Op0 = cast_if_type_not_equal(Fn, Op0, + llvm_type_get_unsigned_version(Op0->Ty)); switch (Op0->Ty->ID) { - case UByteTyID: case SByteTyID: /* 8 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctlz.i8"); - case UShortTyID: case ShortTyID: /* 16 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctlz.i16"); - case UIntTyID: case IntTyID: /* 32 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctlz.i32"); - case ULongTyID: case LongTyID: /* 64 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctlz.i64"); + case UByteTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.ctlz.i8"); + case UShortTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.ctlz.i16"); + case UIntTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.ctlz.i32"); + case ULongTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.ctlz.i64"); default: - abort(); /* this shouldn't happen? */ + abort(); /* this shouldn't happen */ } case BUILT_IN_CTZ: case BUILT_IN_CTZL: case BUILT_IN_CTZLL: - Op0 = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0); + Op0 = llvm_expand_unaryop(Fn, arglist); + if (llvm_type_is_signed(Op0->Ty)) + Op0 = cast_if_type_not_equal(Fn, Op0, + llvm_type_get_unsigned_version(Op0->Ty)); switch (Op0->Ty->ID) { - case UByteTyID: case SByteTyID: /* 8 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.cttz.i8"); - case UShortTyID: case ShortTyID: /* 16 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.cttz.i16"); - case UIntTyID: case IntTyID: /* 32 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.cttz.i32"); - case ULongTyID: case LongTyID: /* 64 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.cttz.i64"); + case UByteTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.cttz.i8"); + case UShortTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.cttz.i16"); + case UIntTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.cttz.i32"); + case ULongTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.cttz.i64"); default: - abort(); /* this shouldn't happen? */ + abort(); /* this shouldn't happen */ } case BUILT_IN_POPCOUNT: case BUILT_IN_POPCOUNTL: case BUILT_IN_POPCOUNTLL: - Op0 = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0); + Op0 = llvm_expand_unaryop(Fn, arglist); + if (llvm_type_is_signed(Op0->Ty)) + Op0 = cast_if_type_not_equal(Fn, Op0, + llvm_type_get_unsigned_version(Op0->Ty)); switch (Op0->Ty->ID) { - case UByteTyID: case SByteTyID: /* 8 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctpop.i8"); - case UShortTyID: case ShortTyID: /* 16 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctpop.i16"); - case UIntTyID: case IntTyID: /* 32 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctpop.i32"); - case ULongTyID: case LongTyID: /* 64 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctpop.i64"); + case UByteTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.ctpop.i8"); + case UShortTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.ctpop.i16"); + case UIntTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.ctpop.i32"); + case ULongTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.ctpop.i64"); default: - abort(); /* this shouldn't happen? */ + abort(); /* this shouldn't happen */ } #if 0 Index: llvm-gcc/gcc/llvm-representation.h diff -u llvm-gcc/gcc/llvm-representation.h:1.22 llvm-gcc/gcc/llvm-representation.h:1.23 --- llvm-gcc/gcc/llvm-representation.h:1.22 Fri Dec 16 16:17:33 2005 +++ llvm-gcc/gcc/llvm-representation.h Tue Jan 17 00:22:23 2006 @@ -472,7 +472,8 @@ * promoted type. */ llvm_type *llvm_type_get_promoted_type(llvm_type *Ty); - +llvm_type *llvm_type_get_unsigned_version(llvm_type *Ty); + /* Creation methods for types */ llvm_type *llvm_type_get_array(llvm_type *Ty, unsigned NumElements); llvm_type *llvm_type_get_pointer(llvm_type *Ty); Index: llvm-gcc/gcc/llvm-types.c diff -u llvm-gcc/gcc/llvm-types.c:1.31 llvm-gcc/gcc/llvm-types.c:1.32 --- llvm-gcc/gcc/llvm-types.c:1.31 Fri Nov 4 00:18:30 2005 +++ llvm-gcc/gcc/llvm-types.c Tue Jan 17 00:22:23 2006 @@ -554,6 +554,17 @@ } } +llvm_type *llvm_type_get_unsigned_version(llvm_type *Ty) { + assert(llvm_type_is_signed(Ty)); + switch (Ty->ID) { + default: abort(); + case SByteTyID: return UByteTy; + case ShortTyID: return UShortTy; + case IntTyID: return UIntTy; + case LongTyID: return ULongTy; + } +} + /* This function prints the type list in reverse order. If this causes a problem due to stack depth at some point, we should change construction of _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits