Index: lib/Transforms/Vectorize/SLPVectorizer.cpp =================================================================== --- lib/Transforms/Vectorize/SLPVectorizer.cpp +++ lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -1831,8 +1831,11 @@ for (unsigned i = 0, e = Left.size(); i < e - 1; ++i) { if (!isa(Left[i]) || !isa(Right[i])) return; - if (!(isConsecutiveAccess(Left[i], Right[i]) && - isConsecutiveAccess(Right[i], Left[i + 1]))) + LoadInst *L = dyn_cast(Left[i]); + bool isInt = L->getType()->isIntegerTy(); + if (!(isConsecutiveAccess(Left[i], Right[i]))) + continue; + else if (!isInt && !isConsecutiveAccess(Right[i], Left[i + 1])) continue; else std::swap(Left[i + 1], Right[i]); Index: test/Transforms/SLPVectorizer/AArch64/horizontaladd.ll =================================================================== --- test/Transforms/SLPVectorizer/AArch64/horizontaladd.ll +++ test/Transforms/SLPVectorizer/AArch64/horizontaladd.ll @@ -25,3 +25,34 @@ %add5 = fadd float %add, %add4 ret float %add5 } + +; CHECK-LABEL: @hadd_int +; CHECK: load <2 x i32>* +; CHECK: add <2 x i32> +; CHECK: extractelement <2 x i32> +define i32 @hadd_int(i32* nocapture readonly %a) { +entry: + %0 = load i32* %a, align 4 + %arrayidx1 = getelementptr inbounds i32* %a, i64 1 + %1 = load i32* %arrayidx1, align 4 + %arrayidx2 = getelementptr inbounds i32* %a, i64 2 + %2 = load i32* %arrayidx2, align 4 + %arrayidx3 = getelementptr inbounds i32* %a, i64 3 + %3 = load i32* %arrayidx3, align 4 + %arrayidx6 = getelementptr inbounds i32* %a, i64 4 + %4 = load i32* %arrayidx6, align 4 + %arrayidx7 = getelementptr inbounds i32* %a, i64 5 + %5 = load i32* %arrayidx7, align 4 + %arrayidx10 = getelementptr inbounds i32* %a, i64 6 + %6 = load i32* %arrayidx10, align 4 + %arrayidx11 = getelementptr inbounds i32* %a, i64 7 + %7 = load i32* %arrayidx11, align 4 + %add1 = add i32 %0, %1 + %add2 = add i32 %2, %3 + %add3 = add i32 %4, %5 + %add4 = add i32 %6, %7 + %add5 = add i32 %add1, %add2 + %add6 = add i32 %add3, %add4 + %add7 = add i32 %add5, %add6 + ret i32 %add7 +}