Allow complex constants to be used as lvalues.

llvm-svn: 41223
diff --git a/llvm-gcc-4.2/gcc/llvm-convert.cpp b/llvm-gcc-4.2/gcc/llvm-convert.cpp
index 4c9c8d0..03b7ec3 100644
--- a/llvm-gcc-4.2/gcc/llvm-convert.cpp
+++ b/llvm-gcc-4.2/gcc/llvm-convert.cpp
@@ -1008,8 +1008,9 @@
   case IMAGPART_EXPR: return EmitLV_XXXXPART_EXPR(exp, 1);
 
   // Constants.
-  case LABEL_DECL:    return TreeConstantToLLVM::EmitLV_LABEL_DECL(exp);
-  case STRING_CST:    return LValue(TreeConstantToLLVM::EmitLV_STRING_CST(exp));
+  case LABEL_DECL:   return TreeConstantToLLVM::EmitLV_LABEL_DECL(exp);
+  case COMPLEX_CST:  return LValue(TreeConstantToLLVM::EmitLV_COMPLEX_CST(exp));
+  case STRING_CST:   return LValue(TreeConstantToLLVM::EmitLV_STRING_CST(exp));
 
   // Type Conversion.
   case VIEW_CONVERT_EXPR: return EmitLV_VIEW_CONVERT_EXPR(exp);
@@ -5756,6 +5757,7 @@
   case CONST_DECL:
   case VAR_DECL:      return EmitLV_Decl(exp);
   case LABEL_DECL:    return EmitLV_LABEL_DECL(exp);
+  case COMPLEX_CST:   return EmitLV_COMPLEX_CST(exp);
   case STRING_CST:    return EmitLV_STRING_CST(exp);
   case COMPONENT_REF: return EmitLV_COMPONENT_REF(exp);
   case ARRAY_RANGE_REF:
@@ -5817,6 +5819,22 @@
   return ConstantExpr::getIntToPtr(C, PointerType::get(Type::Int8Ty));
 }
 
+Constant *TreeConstantToLLVM::EmitLV_COMPLEX_CST(tree exp) {
+  Constant *Init = TreeConstantToLLVM::ConvertCOMPLEX_CST(exp);
+
+  // Cache the constants to avoid making obvious duplicates that have to be
+  // folded by the optimizer.
+  static std::map<Constant*, GlobalVariable*> ComplexCSTCache;
+  GlobalVariable *&Slot = ComplexCSTCache[Init];
+  if (Slot) return Slot;
+
+  // Create a new complex global.
+  Slot = new GlobalVariable(Init->getType(), true,
+                            GlobalVariable::InternalLinkage,
+                            Init, ".cpx", TheModule);
+  return Slot;
+}
+
 Constant *TreeConstantToLLVM::EmitLV_STRING_CST(tree exp) {
   Constant *Init = TreeConstantToLLVM::ConvertSTRING_CST(exp);
 
diff --git a/llvm-gcc-4.2/gcc/llvm-internal.h b/llvm-gcc-4.2/gcc/llvm-internal.h
index 91d91c3..ac3d433 100644
--- a/llvm-gcc-4.2/gcc/llvm-internal.h
+++ b/llvm-gcc-4.2/gcc/llvm-internal.h
@@ -593,6 +593,7 @@
   static Constant *EmitLV(tree_node *exp);
   static Constant *EmitLV_Decl(tree_node *exp);
   static Constant *EmitLV_LABEL_DECL(tree_node *exp);
+  static Constant *EmitLV_COMPLEX_CST(tree_node *exp);
   static Constant *EmitLV_STRING_CST(tree_node *exp);
   static Constant *EmitLV_COMPONENT_REF(tree_node *exp);
   static Constant *EmitLV_ARRAY_REF(tree_node *exp);