]> granicus.if.org Git - llvm/commitdiff
[LoopUnrollAnalyzer] Fix a bug in UnrolledInstAnalyzer::visitLoad.
authorMichael Zolotukhin <mzolotukhin@apple.com>
Thu, 23 Jun 2016 14:31:31 +0000 (14:31 +0000)
committerMichael Zolotukhin <mzolotukhin@apple.com>
Thu, 23 Jun 2016 14:31:31 +0000 (14:31 +0000)
When simplifying a load we need to make sure that the type of the
simplified value matches the type of the instruction we're processing.
In theory, we can handle casts here as we deal with constant data, but
since it's not implemented at the moment, we at least need to bail out.

This fixes PR28262.

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

lib/Analysis/LoopUnrollAnalyzer.cpp
test/Transforms/LoopUnroll/full-unroll-crashers.ll

index b13f63176fc155fe9c315dd56d989423f187b2ba..f59257ab16b501706872e6b2526d08775e679dec 100644 (file)
@@ -115,7 +115,7 @@ bool UnrolledInstAnalyzer::visitLoad(LoadInst &I) {
   // We might have a vector load from an array. FIXME: for now we just bail
   // out in this case, but we should be able to resolve and simplify such
   // loads.
-  if(!CDS->isElementTypeCompatible(I.getType()))
+  if(CDS->getElementType() != I.getType())
     return false;
 
   int ElemSize = CDS->getElementType()->getPrimitiveSizeInBits() / 8U;
index 54f0f817695fd47d205e27907f614adee676e322..f5c7734de968b3910efaca7f76085efb960bdf55 100644 (file)
@@ -204,3 +204,21 @@ for.body:
 for.end:
   ret void
 }
+
+define void @load_type_mismatch() {
+entry:
+  br label %for.body
+
+for.body:
+  %iv.0 = phi i64 [ 0, %entry ], [ %iv.1, %for.body ]
+  %arrayidx1 = getelementptr inbounds [10 x i32], [10 x i32]* @known_constant, i64 0, i64 %iv.0
+  %bc = bitcast i32* %arrayidx1 to i64*
+  %x1 = load i64, i64* %bc, align 4
+  %x2 = add i64 10, %x1
+  %iv.1 = add nuw nsw i64 %iv.0, 1
+  %exitcond = icmp eq i64 %iv.1, 10
+  br i1 %exitcond, label %for.end, label %for.body
+
+for.end:
+  ret void
+}