xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/insert-crash-index.ll (revision 706e71076e0276747e7ae94e3f8a7f73a45e5b6e)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: %if x86-registered-target %{ opt -S -passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu  < %s | FileCheck %s %}
3; RUN: %if aarch64-registered-target %{ opt -S -passes=slp-vectorizer -mtriple=aarch64-unknown-linux-gnu  < %s | FileCheck %s %}
4
5; These all crashing before patch
6
7define  <2 x i8> @negative_index(<2 x i8> %aux_vec, ptr %in) {
8; CHECK-LABEL: @negative_index(
9; CHECK-NEXT:    [[IN0:%.*]] = load i8, ptr [[IN:%.*]], align 4
10; CHECK-NEXT:    [[G1:%.*]] = getelementptr inbounds i8, ptr [[IN]], i64 1
11; CHECK-NEXT:    [[IN1:%.*]] = load i8, ptr [[G1]], align 4
12; CHECK-NEXT:    [[V0:%.*]] = insertelement <2 x i8> [[AUX_VEC:%.*]], i8 [[IN0]], i8 -1
13; CHECK-NEXT:    [[V1:%.*]] = insertelement <2 x i8> [[V0]], i8 [[IN1]], i64 1
14; CHECK-NEXT:    [[OUT:%.*]] = add <2 x i8> [[V1]], [[V1]]
15; CHECK-NEXT:    ret <2 x i8> [[OUT]]
16;
17  %in0 = load i8, ptr %in, align 4
18  %g1 = getelementptr inbounds i8, ptr %in, i64 1
19  %in1 = load i8, ptr %g1, align 4
20
21  %v0 = insertelement <2 x i8> %aux_vec, i8 %in0, i8 -1
22  %v1 = insertelement <2 x i8> %v0, i8 %in1, i64 1
23
24  %out = add <2 x i8> %v1, %v1
25  ret <2 x i8> %out
26}
27
28define  <2 x i8> @exceed_index(<2 x i8> %aux_vec, ptr %in) {
29; CHECK-LABEL: @exceed_index(
30; CHECK-NEXT:    [[IN0:%.*]] = load i8, ptr [[IN:%.*]], align 4
31; CHECK-NEXT:    [[G1:%.*]] = getelementptr inbounds i8, ptr [[IN]], i64 1
32; CHECK-NEXT:    [[IN1:%.*]] = load i8, ptr [[G1]], align 4
33; CHECK-NEXT:    [[V0:%.*]] = insertelement <2 x i8> [[AUX_VEC:%.*]], i8 [[IN0]], i8 2
34; CHECK-NEXT:    [[V1:%.*]] = insertelement <2 x i8> [[V0]], i8 [[IN1]], i64 1
35; CHECK-NEXT:    [[OUT:%.*]] = add <2 x i8> [[V1]], [[V1]]
36; CHECK-NEXT:    ret <2 x i8> [[OUT]]
37;
38  %in0 = load i8, ptr %in, align 4
39  %g1 = getelementptr inbounds i8, ptr %in, i64 1
40  %in1 = load i8, ptr %g1, align 4
41
42  %v0 = insertelement <2 x i8> %aux_vec, i8 %in0, i8 2
43  %v1 = insertelement <2 x i8> %v0, i8 %in1, i64 1
44
45  %out = add <2 x i8> %v1, %v1
46  ret <2 x i8> %out
47}
48
49define  <2 x i8> @poison_index(<2 x i8> %aux_vec, ptr %in) {
50; CHECK-LABEL: @poison_index(
51; CHECK-NEXT:    [[IN0:%.*]] = load i8, ptr [[IN:%.*]], align 4
52; CHECK-NEXT:    [[G1:%.*]] = getelementptr inbounds i8, ptr [[IN]], i64 1
53; CHECK-NEXT:    [[IN1:%.*]] = load i8, ptr [[G1]], align 4
54; CHECK-NEXT:    [[V0:%.*]] = insertelement <2 x i8> [[AUX_VEC:%.*]], i8 [[IN0]], i8 poison
55; CHECK-NEXT:    [[V1:%.*]] = insertelement <2 x i8> [[V0]], i8 [[IN1]], i64 1
56; CHECK-NEXT:    [[OUT:%.*]] = add <2 x i8> [[V1]], [[V1]]
57; CHECK-NEXT:    ret <2 x i8> [[OUT]]
58;
59  %in0 = load i8, ptr %in, align 4
60  %g1 = getelementptr inbounds i8, ptr %in, i64 1
61  %in1 = load i8, ptr %g1, align 4
62
63  %v0 = insertelement <2 x i8> %aux_vec, i8 %in0, i8 poison
64  %v1 = insertelement <2 x i8> %v0, i8 %in1, i64 1
65
66  %out = add <2 x i8> %v1, %v1
67  ret <2 x i8> %out
68}
69