Index: lib/Analysis/LoopAccessAnalysis.cpp =================================================================== --- lib/Analysis/LoopAccessAnalysis.cpp +++ lib/Analysis/LoopAccessAnalysis.cpp @@ -845,6 +845,7 @@ if (Lp != AR->getLoop()) { DEBUG(dbgs() << "LAA: Bad stride - Not striding over innermost loop " << *Ptr << " SCEV: " << *PtrScev << "\n"); + return 0; } // The address calculation must not wrap. Otherwise, a dependence could be Index: test/Analysis/LoopAccessAnalysis/interleave_innermost.ll =================================================================== --- /dev/null +++ test/Analysis/LoopAccessAnalysis/interleave_innermost.ll @@ -0,0 +1,86 @@ +; RUN: opt -O2 %s | llvm-dis | FileCheck %s +; CHECK: %[[ENTRY:[0-9]+]] = getelementptr inbounds %StructA, %StructA* %{{[^ ]+}}, i64 -1, i32 1 +; CHECK: bitcast i32* %[[ENTRY]] to <{{[0-9]+}} x i32>* +; XFAIL: * + +target datalayout = "e-m:e-i64:64-n32:64" +target triple = "powerpc64le-unknown-linux-gnu" + +%StructA = type { i8, i32 } + +@GlobalA = external global [5 x [64 x i32]], align 4 +@GLobalB = external global [1 x %StructA*], align 8 +@Entry = external global [2 x %StructA], align 4 + +define void @_ZN4borgL16BuildReasonTableEv() { + %i = alloca i32, align 4 + %field = alloca %StructA*, align 8 + %f = alloca %StructA*, align 8 + %r = alloca i32*, align 8 + %width = alloca i32, align 4 + %j = alloca i32, align 4 + store i32 0, i32* %i, align 4 + br label %1 + +;