61 lines
2.5 KiB
LLVM
61 lines
2.5 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -passes=slp-vectorizer -S -slp-revec -slp-max-reg-size=1024 -slp-threshold=-100 %s | FileCheck %s
|
|
|
|
define void @test1(ptr %a, ptr %b, ptr %c) {
|
|
; CHECK-LABEL: @test1(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <16 x i32>, ptr [[A:%.*]], align 4
|
|
; CHECK-NEXT: [[TMP1:%.*]] = load <16 x i32>, ptr [[B:%.*]], align 4
|
|
; CHECK-NEXT: [[TMP2:%.*]] = add <16 x i32> [[TMP1]], [[TMP0]]
|
|
; CHECK-NEXT: store <16 x i32> [[TMP2]], ptr [[C:%.*]], align 4
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
%arrayidx3 = getelementptr inbounds i32, ptr %a, i64 4
|
|
%arrayidx7 = getelementptr inbounds i32, ptr %a, i64 8
|
|
%arrayidx11 = getelementptr inbounds i32, ptr %a, i64 12
|
|
%0 = load <4 x i32>, ptr %a, align 4
|
|
%1 = load <4 x i32>, ptr %arrayidx3, align 4
|
|
%2 = load <4 x i32>, ptr %arrayidx7, align 4
|
|
%3 = load <4 x i32>, ptr %arrayidx11, align 4
|
|
%arrayidx19 = getelementptr inbounds i32, ptr %b, i64 4
|
|
%arrayidx23 = getelementptr inbounds i32, ptr %b, i64 8
|
|
%arrayidx27 = getelementptr inbounds i32, ptr %b, i64 12
|
|
%4 = load <4 x i32>, ptr %b, align 4
|
|
%5 = load <4 x i32>, ptr %arrayidx19, align 4
|
|
%6 = load <4 x i32>, ptr %arrayidx23, align 4
|
|
%7 = load <4 x i32>, ptr %arrayidx27, align 4
|
|
%add.i = add <4 x i32> %4, %0
|
|
%add.i63 = add <4 x i32> %5, %1
|
|
%add.i64 = add <4 x i32> %6, %2
|
|
%add.i65 = add <4 x i32> %7, %3
|
|
%arrayidx36 = getelementptr inbounds i32, ptr %c, i64 4
|
|
%arrayidx39 = getelementptr inbounds i32, ptr %c, i64 8
|
|
%arrayidx42 = getelementptr inbounds i32, ptr %c, i64 12
|
|
store <4 x i32> %add.i, ptr %c, align 4
|
|
store <4 x i32> %add.i63, ptr %arrayidx36, align 4
|
|
store <4 x i32> %add.i64, ptr %arrayidx39, align 4
|
|
store <4 x i32> %add.i65, ptr %arrayidx42, align 4
|
|
ret void
|
|
}
|
|
|
|
define void @test2(ptr %in, ptr %out) {
|
|
; CHECK-LABEL: @test2(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <16 x i16>, ptr [[IN:%.*]], align 2
|
|
; CHECK-NEXT: [[TMP1:%.*]] = call <16 x i16> @llvm.sadd.sat.v16i16(<16 x i16> [[TMP0]], <16 x i16> [[TMP0]])
|
|
; CHECK-NEXT: store <16 x i16> [[TMP1]], ptr [[OUT:%.*]], align 2
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
%0 = getelementptr i16, ptr %in, i64 8
|
|
%1 = load <8 x i16>, ptr %in, align 2
|
|
%2 = load <8 x i16>, ptr %0, align 2
|
|
%3 = call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %1, <8 x i16> %1)
|
|
%4 = call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %2, <8 x i16> %2)
|
|
%5 = getelementptr i16, ptr %out, i64 8
|
|
store <8 x i16> %3, ptr %out, align 2
|
|
store <8 x i16> %4, ptr %5, align 2
|
|
ret void
|
|
}
|