[llvm-commits] [llvm-gcc-4.2] r76208 - in /llvm-gcc-4.2/trunk/gcc: llvm-backend.cpp llvm-convert.cpp
Anton Korobeynikov
asl at math.spbu.ru
Fri Jul 17 11:26:47 PDT 2009
Author: asl
Date: Fri Jul 17 13:26:46 2009
New Revision: 76208
URL: http://llvm.org/viewvc/llvm-project?rev=76208&view=rev
Log:
Handle local register variables in consistent way - emit inline asm nodes for
reads / writes
Modified:
llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp
llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
Modified: llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp?rev=76208&r1=76207&r2=76208&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp Fri Jul 17 13:26:46 2009
@@ -1420,12 +1420,9 @@
int RegNumber = decode_reg_name(extractRegisterName(decl));
const Type *Ty = ConvertType(TREE_TYPE(decl));
- // If this has already been processed, don't emit duplicate error messages.
- if (DECL_LLVM_SET_P(decl)) {
- // Error state encoded into DECL_LLVM.
- return cast<ConstantInt>(DECL_LLVM(decl))->getZExtValue();
- }
-
+ if (errorcount || sorrycount)
+ return true; // Do not process broken code.
+
/* Detect errors in declaring global registers. */
if (RegNumber == -1)
error("%Jregister name not specified for %qD", decl, decl);
@@ -1446,11 +1443,10 @@
else {
if (TREE_THIS_VOLATILE(decl))
warning(0, "volatile register variables don%'t work as you might wish");
-
- SET_DECL_LLVM(decl, Context.getConstantIntFalse());
+
return false; // Everything ok.
}
- SET_DECL_LLVM(decl, Context.getConstantIntTrue());
+
return true;
}
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=76208&r1=76207&r2=76208&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Fri Jul 17 13:26:46 2009
@@ -2155,6 +2155,24 @@
// ... Expressions ...
//===----------------------------------------------------------------------===//
+static bool canEmitRegisterVariable(tree exp) {
+ // Only variables can be marked as 'register'.
+ if (TREE_CODE(exp) != VAR_DECL || !DECL_REGISTER(exp))
+ return false;
+
+ // We can emit inline assembler for access to global register variables.
+ if (TREE_STATIC(exp) || DECL_EXTERNAL(exp) || TREE_PUBLIC(exp))
+ return true;
+
+ // Emit inline asm if this is local variable with assembler name on it.
+ if (DECL_ASSEMBLER_NAME_SET_P(exp))
+ return true;
+
+ // Otherwise - it's normal automatic variable.
+ return false;
+}
+
+
/// EmitLoadOfLValue - When an l-value expression is used in a context that
/// requires an r-value, this method emits the lvalue computation, then loads
/// the result.
@@ -2171,8 +2189,7 @@
DECL_GIMPLE_FORMAL_TEMP_P(exp) = 0;
EmitAutomaticVariableDecl(exp);
// Fall through.
- } else if (TREE_CODE(exp) == VAR_DECL && DECL_REGISTER(exp) &&
- TREE_STATIC(exp)) {
+ } else if (canEmitRegisterVariable(exp)) {
// If this is a register variable, EmitLV can't handle it (there is no
// l-value of a register variable). Emit an inline asm node that copies the
// value out of the specified register.
@@ -2864,8 +2881,7 @@
Builder.Insert(Cast);
SET_DECL_LLVM(lhs, Cast);
return Cast;
- } else if (TREE_CODE(lhs) == VAR_DECL && DECL_REGISTER(lhs) &&
- TREE_STATIC(lhs)) {
+ } else if (canEmitRegisterVariable(lhs)) {
// If this is a store to a register variable, EmitLV can't handle the dest
// (there is no l-value of a register variable). Emit an inline asm node
// that copies the value into the specified register.
@@ -3788,19 +3804,20 @@
Value *TreeToLLVM::EmitReadOfRegisterVariable(tree decl,
const MemRef *DestLoc) {
const Type *Ty = ConvertType(TREE_TYPE(decl));
-
+
// If there was an error, return something bogus.
if (ValidateRegisterVariable(decl)) {
if (Ty->isSingleValueType())
return Context.getUndef(Ty);
return 0; // Just don't copy something into DestLoc.
}
-
+
// Turn this into a 'tmp = call Ty asm "", "={reg}"()'.
FunctionType *FTy =
Context.getFunctionType(Ty, std::vector<const Type*>(),false);
-
- const char *Name = extractRegisterName(decl);
+
+ const char *Name = reg_names[decode_reg_name(extractRegisterName(decl))];
+
InlineAsm *IA = InlineAsm::get(FTy, "", "={"+std::string(Name)+"}", false);
CallInst *Call = Builder.CreateCall(IA);
Call->setDoesNotThrow();
@@ -3813,13 +3830,14 @@
// If there was an error, bail out.
if (ValidateRegisterVariable(decl))
return;
-
+
// Turn this into a 'call void asm sideeffect "", "{reg}"(Ty %RHS)'.
std::vector<const Type*> ArgTys;
ArgTys.push_back(ConvertType(TREE_TYPE(decl)));
FunctionType *FTy = Context.getFunctionType(Type::VoidTy, ArgTys, false);
-
- const char *Name = extractRegisterName(decl);
+
+ const char *Name = reg_names[decode_reg_name(extractRegisterName(decl))];
+
InlineAsm *IA = InlineAsm::get(FTy, "", "{"+std::string(Name)+"}", true);
CallInst *Call = Builder.CreateCall(IA, RHS);
Call->setDoesNotThrow();
More information about the llvm-commits
mailing list