[llvm-commits] [llvm-gcc-4.2] r119392 - in /llvm-gcc-4.2/trunk/gcc: config/i386/i386.c llvm-convert.cpp tree.h

Dale Johannesen dalej at apple.com
Tue Nov 16 13:55:09 PST 2010


Author: johannes
Date: Tue Nov 16 15:55:09 2010
New Revision: 119392

URL: http://llvm.org/viewvc/llvm-project?rev=119392&view=rev
Log:
My patch 112674 fixed the use of asm register variables,
but broke asm blocks.  The fundamental problem is that the
asm-block handling code used register variables in ways that
are beyond what standard gcc register variables support, such
as expecting parameter registers to be defined at the entrance
to a function.  To fix this, represent the use of registers
by asm blocks with a different, marked VAR_DECL than standard
gcc register variables, and generate pre-112674 IR (which
was correct in this case) for them.  MMX register handling has
changed in the meantime, and is adjusted.  8482548.


Modified:
    llvm-gcc-4.2/trunk/gcc/config/i386/i386.c
    llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
    llvm-gcc-4.2/trunk/gcc/tree.h

Modified: llvm-gcc-4.2/trunk/gcc/config/i386/i386.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/i386.c?rev=119392&r1=119391&r2=119392&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/i386/i386.c (original)
+++ llvm-gcc-4.2/trunk/gcc/config/i386/i386.c Tue Nov 16 15:55:09 2010
@@ -22161,7 +22161,7 @@
       decl = lookup_name (arg);
       if (decl == error_mark_node)
 	decl = 0;
-      if (decl == 0)
+      if (decl == 0 || !DECL_ASM_BLOCK_REGISTER (decl))
 	{
 	  tree type = iasm_type_for (arg);
 	  if (type)
@@ -22171,6 +22171,7 @@
 	      DECL_REGISTER (decl) = 1;
 	      C_DECL_REGISTER (decl) = 1;
 	      DECL_HARD_REGISTER (decl) = 1;
+              DECL_ASM_BLOCK_REGISTER (decl) = 1;
 	      set_user_assembler_name (decl, IDENTIFIER_POINTER (arg));
 	      decl = lang_hooks.decls.pushdecl (decl);
 	    }

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=119392&r1=119391&r2=119392&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Tue Nov 16 15:55:09 2010
@@ -2457,6 +2457,10 @@
   if (TREE_STATIC(exp) || DECL_EXTERNAL(exp) || TREE_PUBLIC(exp))
     return false;
 
+  // Asm block register usage is not accepted here.
+  if (DECL_ASM_BLOCK_REGISTER (exp))
+    return false;
+
   // Emit inline asm if this is local variable with assembler name on it.
   if (DECL_ASSEMBLER_NAME_SET_P(exp))
     return true;
@@ -2470,6 +2474,10 @@
   if (TREE_CODE(exp) != VAR_DECL || !DECL_REGISTER(exp))
     return false;
 
+  // Treat register usage in asm blocks as global.
+  if (DECL_ASM_BLOCK_REGISTER (exp))
+    return true;
+
   // Local register variables are not accepted here.
   if (TREE_STATIC(exp) || DECL_EXTERNAL(exp) || TREE_PUBLIC(exp))
     return true;
@@ -4329,6 +4337,8 @@
 Value *TreeToLLVM::EmitReadOfRegisterVariable(tree decl,
                                               const MemRef *DestLoc) {
   const Type *Ty = ConvertType(TREE_TYPE(decl));
+  if (LLVM_IS_DECL_MMX_REGISTER(decl))
+    Ty = Type::getX86_MMXTy(Context);
 
   // If there was an error, return something bogus.
   if (ValidateRegisterVariable(decl)) {
@@ -4394,7 +4404,10 @@
 
   // Turn this into a 'call void asm sideeffect "", "{reg}"(Ty %RHS)'.
   std::vector<const Type*> ArgTys;
-  ArgTys.push_back(ConvertType(TREE_TYPE(decl)));
+  const Type* Ty = ConvertType(TREE_TYPE(decl));
+  if (LLVM_IS_DECL_MMX_REGISTER(decl))
+    Ty = Type::getX86_MMXTy(Context);
+  ArgTys.push_back(Ty);
   FunctionType *FTy = FunctionType::get(Type::getVoidTy(Context), ArgTys, false);
 
   const char *Name = extractRegisterName(decl);

Modified: llvm-gcc-4.2/trunk/gcc/tree.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/tree.h?rev=119392&r1=119391&r2=119392&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/tree.h (original)
+++ llvm-gcc-4.2/trunk/gcc/tree.h Tue Nov 16 15:55:09 2010
@@ -2623,6 +2623,8 @@
      In VAR_DECL and PARM_DECL, this is DECL_REGISTER.  */
   unsigned decl_flag_0 : 1;
   /* In FIELD_DECL, this is DECL_PACKED.  */
+  /* LLVM LOCAL */
+  /* In VAR_DECL, this is DECL_ASM_BLOCK_REGISTER. */
   unsigned decl_flag_1 : 1;
   /* In FIELD_DECL, this is DECL_BIT_FIELD
      In VAR_DECL and FUNCTION_DECL, this is DECL_EXTERNAL.
@@ -2703,6 +2705,9 @@
 /* In VAR_DECL and PARM_DECL nodes, nonzero means declared `register'.  */
 #define DECL_REGISTER(NODE) (DECL_WRTL_CHECK (NODE)->decl_common.decl_flag_0)
 
+/* In VAR_DECL, nonzero means a register used by asm block code. */
+#define DECL_ASM_BLOCK_REGISTER(NODE) (DECL_WRTL_CHECK (NODE)->decl_common.decl_flag_1)
+
 struct tree_decl_with_rtl GTY(())
 {
   struct tree_decl_common common;





More information about the llvm-commits mailing list