diff options
| author | Pekka Enberg <penberg@kernel.org> | 2011-08-30 19:46:29 +0300 |
|---|---|---|
| committer | Pekka Enberg <penberg@kernel.org> | 2011-08-30 20:29:10 +0300 |
| commit | c19ad437aee130bfde2ac41494d3a46900670dc6 (patch) | |
| tree | 24786de5a073aa960e0611b85370cf7065c6b7ac /sparse-llvm.c | |
| parent | 014de231b87ad9ba3f62b21abd4a591de742a5f4 (diff) | |
| download | sparse-dev-c19ad437aee130bfde2ac41494d3a46900670dc6.tar.gz | |
sparse, llvm: Fix code generation for casts
Signed-off-by: Pekka Enberg <penberg@kernel.org>
Diffstat (limited to 'sparse-llvm.c')
| -rw-r--r-- | sparse-llvm.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/sparse-llvm.c b/sparse-llvm.c index bf7389c9..bbf8646a 100644 --- a/sparse-llvm.c +++ b/sparse-llvm.c @@ -595,19 +595,23 @@ static void output_op_phi(struct function *fn, struct instruction *insn) insn->target->priv = target; } -static void output_op_cast(struct function *fn, struct instruction *insn) +static void output_op_cast(struct function *fn, struct instruction *insn, LLVMOpcode op) { LLVMValueRef src, target; char target_name[64]; src = insn->src->priv; + if (!src) + src = pseudo_to_value(fn, insn, insn->src); pseudo_name(insn->target, target_name); - if (symbol_is_fp_type(insn->type)) - target = LLVMBuildFPCast(fn->builder, src, symbol_type(insn->type), target_name); + assert(!symbol_is_fp_type(insn->type)); + + if (insn->size < LLVMGetIntTypeWidth(LLVMTypeOf(src))) + target = LLVMBuildTrunc(fn->builder, src, symbol_type(insn->type), target_name); else - target = LLVMBuildZExt(fn->builder, src, symbol_type(insn->type), target_name); + target = LLVMBuildCast(fn->builder, op, src, symbol_type(insn->type), target_name); insn->target->priv = target; } @@ -656,10 +660,10 @@ static void output_insn(struct function *fn, struct instruction *insn) output_op_call(fn, insn); break; case OP_CAST: - output_op_cast(fn, insn); + output_op_cast(fn, insn, LLVMZExt); break; case OP_SCAST: - assert(0); + output_op_cast(fn, insn, LLVMSExt); break; case OP_FPCAST: assert(0); |
