[llvm-commits] [llvm-gcc-4.2] r42315 - /llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
Duncan Sands
baldrick at free.fr
Tue Sep 25 13:12:14 PDT 2007
Author: baldrick
Date: Tue Sep 25 15:12:14 2007
New Revision: 42315
URL: http://llvm.org/viewvc/llvm-project?rev=42315&view=rev
Log:
Handle scalar to aggregate VIEW_CONVERT_EXPR lvalue.
Modified:
llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=42315&r1=42314&r2=42315&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Tue Sep 25 15:12:14 2007
@@ -5068,12 +5068,22 @@
}
LValue TreeToLLVM::EmitLV_VIEW_CONVERT_EXPR(tree exp) {
- // The address is the address of the operand.
- LValue LV = EmitLV(TREE_OPERAND(exp, 0));
- // The type is the type of the expression.
- const Type *Ty = ConvertType(TREE_TYPE(exp));
- LV.Ptr = BitCastToType(LV.Ptr, PointerType::get(Ty));
- return LV;
+ tree Op = TREE_OPERAND(exp, 0);
+
+ if (isAggregateTreeType(TREE_TYPE(Op))) {
+ // If the input is an aggregate, the address is the address of the operand.
+ LValue LV = EmitLV(Op);
+ // The type is the type of the expression.
+ LV.Ptr = BitCastToType(LV.Ptr, PointerType::get(ConvertType(TREE_TYPE(exp))));
+ return LV;
+ } else {
+ // If the input is a scalar, emit to a temporary.
+ Value *Dest = CreateTemporary(ConvertType(TREE_TYPE(Op)));
+ Builder.CreateStore(Emit(Op, 0), Dest);
+ // The type is the type of the expression.
+ Dest = BitCastToType(Dest, PointerType::get(ConvertType(TREE_TYPE(exp))));
+ return LValue(Dest);
+ }
}
LValue TreeToLLVM::EmitLV_EXC_PTR_EXPR(tree exp) {
More information about the llvm-commits
mailing list