Examine VLA size expressions when computing liveness information.

Fixes <rdar://problem/6248086>

llvm-svn: 56645
This commit is contained in:
Ted Kremenek 2008-09-26 05:52:45 +00:00
parent 08971bf2c4
commit 2ece64bbc4
2 changed files with 35 additions and 6 deletions

View File

@ -226,19 +226,41 @@ void TransferFuncs::VisitAssign(BinaryOperator* B) {
Visit(B->getRHS()); Visit(B->getRHS());
} }
static VariableArrayType* FindVA(Type* t) {
while (ArrayType* vt = dyn_cast<ArrayType>(t)) {
if (VariableArrayType* vat = dyn_cast<VariableArrayType>(vt))
if (vat->getSizeExpr())
return vat;
t = vt->getElementType().getTypePtr();
}
return NULL;
}
void TransferFuncs::VisitDeclStmt(DeclStmt* DS) { void TransferFuncs::VisitDeclStmt(DeclStmt* DS) {
// Declarations effectively "kill" a variable since they cannot // Declarations effectively "kill" a variable since they cannot
// possibly be live before they are declared. // possibly be live before they are declared.
for (DeclStmt::decl_iterator DI=DS->decl_begin(), DE = DS->decl_end(); for (DeclStmt::decl_iterator DI=DS->decl_begin(), DE = DS->decl_end();
DI != DE; ++DI) DI != DE; ++DI)
if (VarDecl* VD = dyn_cast<VarDecl>(*DI)) { if (VarDecl* VD = dyn_cast<VarDecl>(*DI)) {
// The initializer is evaluated after the variable comes into scope.
// Since this is a reverse dataflow analysis, we must evaluate the
// transfer function for this expression first.
if (Expr* Init = VD->getInit())
Visit(Init);
// Update liveness information. // Update liveness information by killing the VarDecl.
unsigned bit = AD.getIdx(VD); unsigned bit = AD.getIdx(VD);
LiveState.getDeclBit(bit) = Dead | AD.AlwaysLive.getDeclBit(bit); LiveState.getDeclBit(bit) = Dead | AD.AlwaysLive.getDeclBit(bit);
if (Expr* Init = VD->getInit()) // If the type of VD is a VLA, then we must process its size expressions.
Visit(Init); // These expressions are evaluated before the variable comes into scope,
// so in a reverse dataflow analysis we evaluate them last.
for (VariableArrayType* VA = FindVA(VD->getType().getTypePtr()); VA != 0;
VA = FindVA(VA->getElementType().getTypePtr()))
Visit(VA->getSizeExpr());
} }
} }

View File

@ -100,7 +100,7 @@ int f13(void)
} }
// Filed with PR 2763. // Filed with PR 2763.
int f41(int count) { int f14(int count) {
int index, nextLineIndex; int index, nextLineIndex;
for (index = 0; index < count; index = nextLineIndex+1) { for (index = 0; index < count; index = nextLineIndex+1) {
nextLineIndex = index+1; // no-warning nextLineIndex = index+1; // no-warning
@ -108,3 +108,10 @@ int f41(int count) {
} }
return index; return index;
} }
// Test case for <rdar://problem/6248086>
void f15(unsigned x, unsigned y) {
int count = x * y; // no-warning
int z[count];
}