[llvm-commits] [llvm-gcc-4.2] r99305 - in /llvm-gcc-4.2/trunk/gcc: cp/cp-objcp-common.c cp/cp-objcp-common.h cp/cp-tree.h langhooks-def.h langhooks.c langhooks.h llvm-convert.cpp

Stuart Hastings stuart at apple.com
Tue Mar 23 11:37:18 PDT 2010


Author: stuart
Date: Tue Mar 23 13:37:18 2010
New Revision: 99305

URL: http://llvm.org/viewvc/llvm-project?rev=99305&view=rev
Log:
Elide stores of empty structures for correct support of boost::compressed_pair.  Radar 7659636.

Modified:
    llvm-gcc-4.2/trunk/gcc/cp/cp-objcp-common.c
    llvm-gcc-4.2/trunk/gcc/cp/cp-objcp-common.h
    llvm-gcc-4.2/trunk/gcc/cp/cp-tree.h
    llvm-gcc-4.2/trunk/gcc/langhooks-def.h
    llvm-gcc-4.2/trunk/gcc/langhooks.c
    llvm-gcc-4.2/trunk/gcc/langhooks.h
    llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp

Modified: llvm-gcc-4.2/trunk/gcc/cp/cp-objcp-common.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/cp/cp-objcp-common.c?rev=99305&r1=99304&r2=99305&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/cp/cp-objcp-common.c (original)
+++ llvm-gcc-4.2/trunk/gcc/cp/cp-objcp-common.c Tue Mar 23 13:37:18 2010
@@ -111,6 +111,30 @@
     return lhd_expr_size (exp);
 }
 
+/* LLVM LOCAL begin 7659636 */
+/* lang_hooks.empty_type_p: Return true if the given type has size
+   zero.  */
+
+int
+cp_empty_type_p (tree exp)
+{
+  gcc_assert(TYPE_P(exp));
+  if (VOID_TYPE_P(exp))
+    return 0;
+
+  /* C++ classes with non-trivial constructors or non-trivial
+     assignment operators are assumed non-empty, thus assignments of
+     these types can't be elided.  */
+  if (CLASS_TYPE_P(exp)
+      && (TYPE_HAS_COMPLEX_INIT_REF(exp)
+          || TYPE_HAS_COMPLEX_ASSIGN_REF(exp)))
+    return 0;
+
+  return is_empty_class(exp);
+}
+
+/* LLVM LOCAL end 7659636 */
+
 /* Langhook for tree_size: determine size of our 'x' and 'c' nodes.  */
 size_t
 cp_tree_size (enum tree_code code)

Modified: llvm-gcc-4.2/trunk/gcc/cp/cp-objcp-common.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/cp/cp-objcp-common.h?rev=99305&r1=99304&r2=99305&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/cp/cp-objcp-common.h (original)
+++ llvm-gcc-4.2/trunk/gcc/cp/cp-objcp-common.h Tue Mar 23 13:37:18 2010
@@ -33,6 +33,10 @@
 
 #undef LANG_HOOKS_TREE_SIZE
 #define LANG_HOOKS_TREE_SIZE cp_tree_size
+/* LLVM LOCAL begin 7659636 */
+#undef LANG_HOOKS_EMPTY_TYPE_P
+#define LANG_HOOKS_EMPTY_TYPE_P cp_empty_type_p
+/* LLVM LOCAL end 7659636 */
 #undef LANG_HOOKS_FINISH
 #define LANG_HOOKS_FINISH cxx_finish
 #undef LANG_HOOKS_CLEAR_BINDING_STACK

Modified: llvm-gcc-4.2/trunk/gcc/cp/cp-tree.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/cp/cp-tree.h?rev=99305&r1=99304&r2=99305&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/cp/cp-tree.h (original)
+++ llvm-gcc-4.2/trunk/gcc/cp/cp-tree.h Tue Mar 23 13:37:18 2010
@@ -4639,6 +4639,8 @@
 extern bool cxx_warn_unused_global_decl		(tree);
 extern tree cp_expr_size			(tree);
 extern size_t cp_tree_size			(enum tree_code);
+/* LLVM LOCAL 7659636 */
+extern int cp_empty_type_p                      (tree);
 extern bool cp_var_mod_type_p			(tree, tree);
 extern void cxx_initialize_diagnostics		(struct diagnostic_context *);
 extern int cxx_types_compatible_p		(tree, tree);

Modified: llvm-gcc-4.2/trunk/gcc/langhooks-def.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/langhooks-def.h?rev=99305&r1=99304&r2=99305&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/langhooks-def.h (original)
+++ llvm-gcc-4.2/trunk/gcc/langhooks-def.h Tue Mar 23 13:37:18 2010
@@ -70,6 +70,8 @@
 extern bool lhd_decl_ok_for_sibcall (tree);
 extern const char *lhd_comdat_group (tree);
 extern tree lhd_expr_size (tree);
+/* LLVM LOCAL 7659636 */
+extern int lhd_empty_type_p (tree);
 extern size_t lhd_tree_size (enum tree_code);
 extern HOST_WIDE_INT lhd_to_target_charset (HOST_WIDE_INT);
 extern tree lhd_expr_to_decl (tree, bool *, bool *, bool *);
@@ -139,6 +141,8 @@
 #define LANG_HOOKS_DWARF_NAME		lhd_dwarf_name
 #define LANG_HOOKS_GET_CALLEE_FNDECL	lhd_return_null_tree
 #define LANG_HOOKS_EXPR_SIZE		lhd_expr_size
+/* LLVM LOCAL 7659636 */
+#define LANG_HOOKS_EMPTY_TYPE_P		lhd_empty_type_p
 #define LANG_HOOKS_TREE_SIZE		lhd_tree_size
 #define LANG_HOOKS_TYPES_COMPATIBLE_P	lhd_types_compatible_p
 #define LANG_HOOKS_BUILTIN_FUNCTION	builtin_function
@@ -336,6 +340,8 @@
   LANG_HOOKS_GET_CALLEE_FNDECL, \
   LANG_HOOKS_PRINT_ERROR_FUNCTION, \
   LANG_HOOKS_EXPR_SIZE, \
+/* LLVM LOCAL 7659636 */ \
+  LANG_HOOKS_EMPTY_TYPE_P, \
   LANG_HOOKS_TO_TARGET_CHARSET, \
   LANG_HOOKS_ATTRIBUTE_TABLE, \
   LANG_HOOKS_COMMON_ATTRIBUTE_TABLE, \

Modified: llvm-gcc-4.2/trunk/gcc/langhooks.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/langhooks.c?rev=99305&r1=99304&r2=99305&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/langhooks.c (original)
+++ llvm-gcc-4.2/trunk/gcc/langhooks.c Tue Mar 23 13:37:18 2010
@@ -439,6 +439,21 @@
     return size_in_bytes (TREE_TYPE (exp));
 }
 
+/* LLVM LOCAL begin 7659636 */
+/* lang_hooks.empty_type_p: Return true if the given type has size
+   zero.  */
+
+int
+lhd_empty_type_p (tree exp)
+{
+  gcc_assert(TYPE_P(exp));
+  if (VOID_TYPE_P(exp))
+    return 0;
+  return size_in_bytes(exp) == 0;
+}
+
+/* LLVM LOCAL end 7659636 */
+
 /* lang_hooks.gimplify_expr re-writes *EXPR_P into GIMPLE form.  */
 
 int

Modified: llvm-gcc-4.2/trunk/gcc/langhooks.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/langhooks.h?rev=99305&r1=99304&r2=99305&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/langhooks.h (original)
+++ llvm-gcc-4.2/trunk/gcc/langhooks.h Tue Mar 23 13:37:18 2010
@@ -410,6 +410,11 @@
      semantics in cases that it doesn't want to handle specially.  */
   tree (*expr_size) (tree);
 
+/* LLVM LOCAL begin 7659636 */
+  /* Return true (non-zero) if the given RECORD_TYPE has size zero.  */
+  int (*empty_type_p) (tree);
+/* LLVM LOCAL end 7659636 */
+
   /* Convert a character from the host's to the target's character
      set.  The character should be in what C calls the "basic source
      character set" (roughly, the set of characters defined by plain

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=99305&r1=99304&r2=99305&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Tue Mar 23 13:37:18 2010
@@ -3046,6 +3046,20 @@
   tree lhs = TREE_OPERAND (exp, 0);
   tree rhs = TREE_OPERAND (exp, 1);
 
+  // Avoid generating stores of empty types.  This is rare, but necessary
+  // to support the compressed_pair template.
+  if (lang_hooks.empty_type_p(TREE_TYPE(exp))) {
+    if (TREE_SIDE_EFFECTS(rhs)) {
+      // There's a side-effect; alloc a temporary to receive the
+      // value, if any.  Do not store into lhs; we must not
+      // reference it.
+      const Type *RHSTy = ConvertType(TREE_TYPE(rhs));
+      MemRef dest = CreateTempLoc(RHSTy);
+      return Emit(rhs, &dest);
+    } else
+      return (Value *)0;
+  }
+
   // If this is the definition of a gimple temporary, set its DECL_LLVM to the
   // RHS.
   bool LHSSigned = !TYPE_UNSIGNED(TREE_TYPE(lhs));





More information about the llvm-commits mailing list