]> granicus.if.org Git - clang/commitdiff
Examine VLA size expressions when computing liveness information.
authorTed Kremenek <kremenek@apple.com>
Fri, 26 Sep 2008 05:52:45 +0000 (05:52 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 26 Sep 2008 05:52:45 +0000 (05:52 +0000)
Fixes <rdar://problem/6248086>

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@56645 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/LiveVariables.cpp
test/Analysis/dead-stores.c

index f5a7fb40c77c220ff81fbd92d87f658fdf46a69e..e82c1e0bc01edfd609b5e859536896c389e4d754 100644 (file)
@@ -226,19 +226,41 @@ void TransferFuncs::VisitAssign(BinaryOperator* B) {
   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) {
   // Declarations effectively "kill" a variable since they cannot
   // possibly be live before they are declared.
   for (DeclStmt::decl_iterator DI=DS->decl_begin(), DE = DS->decl_end();
        DI != DE; ++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);
       LiveState.getDeclBit(bit) = Dead | AD.AlwaysLive.getDeclBit(bit);
-      
-      if (Expr* Init = VD->getInit())
-        Visit(Init);
+
+      // If the type of VD is a VLA, then we must process its size expressions.
+      // 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());
+
     }
 }
   
index d87a5591a348bfb9962f6afd5a947d520dae64ac..b1f16b9c844e431b89255aa2c074b585d9280692 100644 (file)
@@ -100,7 +100,7 @@ int f13(void)
 }
 
 // Filed with PR 2763.
-int f41(int count) {
+int f14(int count) {
   int index, nextLineIndex;
   for (index = 0; index < count; index = nextLineIndex+1) {
     nextLineIndex = index+1;  // no-warning
@@ -108,3 +108,10 @@ int f41(int count) {
   }
   return index;
 }
+
+// Test case for <rdar://problem/6248086>
+void f15(unsigned x, unsigned y) {
+  int count = x * y;   // no-warning
+  int z[count];
+}
+