[llvm] r236635 - CodeGen: move over-zealous assert into actual if statement.

Tim Northover tnorthover at apple.com
Wed May 6 13:07:38 PDT 2015


Author: tnorthover
Date: Wed May  6 15:07:38 2015
New Revision: 236635

URL: http://llvm.org/viewvc/llvm-project?rev=236635&view=rev
Log:
CodeGen: move over-zealous assert into actual if statement.

It's quite possible to encounter an insertvalue instruction that's more deeply
nested than the value we're looking for, but when that happens we really
mustn't compare beyond the end of the index array.

Since I couldn't see any guarantees about what comparisons std::equal makes, we
probably need to directly check the size beforehand. In practice, I suspect
most std::equal implementations would probably bail early, which would be OK.
But just in case...

rdar://20834485

Modified:
    llvm/trunk/lib/CodeGen/Analysis.cpp
    llvm/trunk/test/CodeGen/AArch64/tail-call.ll

Modified: llvm/trunk/lib/CodeGen/Analysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/Analysis.cpp?rev=236635&r1=236634&r2=236635&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/Analysis.cpp (original)
+++ llvm/trunk/lib/CodeGen/Analysis.cpp Wed May  6 15:07:38 2015
@@ -295,9 +295,8 @@ static const Value *getNoopInput(const V
     } else if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(V)) {
       // Value may come from either the aggregate or the scalar
       ArrayRef<unsigned> InsertLoc = IVI->getIndices();
-      assert(ValLoc.size() >= InsertLoc.size() && "extracting too deeply");
-      if (std::equal(InsertLoc.begin(), InsertLoc.end(),
-                     ValLoc.rbegin())) {
+      if (ValLoc.size() >= InsertLoc.size() &&
+          std::equal(InsertLoc.begin(), InsertLoc.end(), ValLoc.rbegin())) {
         // The type being inserted is a nested sub-type of the aggregate; we
         // have to remove those initial indices to get the location we're
         // interested in for the operand.

Modified: llvm/trunk/test/CodeGen/AArch64/tail-call.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/tail-call.ll?rev=236635&r1=236634&r2=236635&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/tail-call.ll (original)
+++ llvm/trunk/test/CodeGen/AArch64/tail-call.ll Wed May  6 15:07:38 2015
@@ -122,3 +122,22 @@ define { [3 x float] } @test_add_elem()
   %res.012 = insertvalue { [3 x float] } %res.01, float 1.000000e+00, 0, 2
   ret { [3 x float] } %res.012
 }
+
+declare double @get_double()
+define { double, [2 x double] } @test_mismatched_insert() {
+; CHECK-LABEL: test_mismatched_insert:
+; CHECK: bl get_double
+; CHECK: bl get_double
+; CHECK: bl get_double
+; CHECK: ret
+
+  %val0 = call double @get_double()
+  %val1 = call double @get_double()
+  %val2 = tail call double @get_double()
+
+  %res.0 = insertvalue { double, [2 x double] } undef, double %val0, 0
+  %res.01 = insertvalue { double, [2 x double] } %res.0, double %val1, 1, 0
+  %res.012 = insertvalue { double, [2 x double] } %res.01, double %val2, 1, 1
+
+  ret { double, [2 x double] } %res.012
+}





More information about the llvm-commits mailing list