For the llvm.c* intrinsics, we need to truncate or zero extend if we're placing
the results in a larger or smaller location.
llvm-svn: 41259
diff --git a/llvm-gcc-4.0/gcc/llvm-convert.cpp b/llvm-gcc-4.0/gcc/llvm-convert.cpp
index 9c729e9..d21c7a3 100644
--- a/llvm-gcc-4.0/gcc/llvm-convert.cpp
+++ b/llvm-gcc-4.0/gcc/llvm-convert.cpp
@@ -4281,13 +4281,19 @@
case BUILT_IN_CLZLL: {
Value *Amt = Emit(TREE_VALUE(TREE_OPERAND(exp, 1)), 0);
EmitBuiltinUnaryIntOp(Amt, Result, Intrinsic::ctlz);
+ const Type *DestTy = ConvertType(TREE_TYPE(exp));
+ if (Result->getType() != DestTy)
+ Result = Builder.CreateIntCast(Result, DestTy, "cast");
return true;
}
case BUILT_IN_CTZ: // These GCC builtins always return int.
case BUILT_IN_CTZL:
case BUILT_IN_CTZLL: {
Value *Amt = Emit(TREE_VALUE(TREE_OPERAND(exp, 1)), 0);
- EmitBuiltinUnaryIntOp(Amt, Result, Intrinsic::cttz);
+ EmitBuiltinUnaryIntOp(Amt, Result, Intrinsic::cttz);
+ const Type *DestTy = ConvertType(TREE_TYPE(exp));
+ if (Result->getType() != DestTy)
+ Result = Builder.CreateIntCast(Result, DestTy, "cast");
return true;
}
case BUILT_IN_POPCOUNT: // These GCC builtins always return int.
@@ -4295,6 +4301,9 @@
case BUILT_IN_POPCOUNTLL: {
Value *Amt = Emit(TREE_VALUE(TREE_OPERAND(exp, 1)), 0);
EmitBuiltinUnaryIntOp(Amt, Result, Intrinsic::ctpop);
+ const Type *DestTy = ConvertType(TREE_TYPE(exp));
+ if (Result->getType() != DestTy)
+ Result = Builder.CreateIntCast(Result, DestTy, "cast");
return true;
}
case BUILT_IN_SQRT: