DeadArgElim: aggregate Return assessment properly.
[oota-llvm.git] / lib / Transforms / IPO / DeadArgumentElimination.cpp
index 596204dac62b90572b5f465d3f6342aaed6abac4..44313113fce992e581e3b5eff782b07cb1cbf2aa 100644 (file)
@@ -449,12 +449,15 @@ DAE::Liveness DAE::SurveyUse(const Use *U,
         // We might be live, depending on the liveness of Use.
         return MarkIfNotLive(Use, MaybeLiveUses);
       } else {
-        DAE::Liveness Result;
+        DAE::Liveness Result = MaybeLive;
         for (unsigned i = 0; i < NumRetVals(F); ++i) {
           RetOrArg Use = CreateRet(F, i);
-          // We might be live, depending on the liveness of Use. All Results
-          // should be the same since they depend only on F.
-          Result = MarkIfNotLive(Use, MaybeLiveUses);
+          // We might be live, depending on the liveness of Use. If any
+          // sub-value is live, then the entire value is considered live. This
+          // is a conservative choice, and better tracking is possible.
+          DAE::Liveness SubResult = MarkIfNotLive(Use, MaybeLiveUses);
+          if (Result != Live)
+            Result = SubResult;
         }
         return Result;
       }