Index: llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp =================================================================== --- llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp @@ -583,6 +583,13 @@ UndefValue::get(T), NewLoad, 0, Name)); } + // Bail out if the array is too large. Ideally we would like to optimize + // arrays of arbitrary size but this has a terrible impact on compile time. + // The threshold here is chosen arbitrarily, maybe needs a little bit of + // tuning. + if (NumElements > 1024) + return nullptr; + const DataLayout &DL = IC.getDataLayout(); auto EltSize = DL.getTypeAllocSize(ET); auto Align = LI.getAlignment(); Index: llvm/trunk/test/Transforms/InstCombine/unpack-fca.ll =================================================================== --- llvm/trunk/test/Transforms/InstCombine/unpack-fca.ll +++ llvm/trunk/test/Transforms/InstCombine/unpack-fca.ll @@ -179,6 +179,14 @@ ret [2 x %B] %1 } +define [2000 x %B] @loadLargeArrayOfB([2000 x %B]* %ab.ptr) { +; CHECK-LABEL: loadLargeArrayOfB +; CHECK-NEXT: load [2000 x %B], [2000 x %B]* %ab.ptr, align 8 +; CHECK-NEXT: ret [2000 x %B] + %1 = load [2000 x %B], [2000 x %B]* %ab.ptr, align 8 + ret [2000 x %B] %1 +} + %struct.S = type <{ i8, %struct.T }> %struct.T = type { i32, i32 }