xref: /llvm-project/llvm/test/Transforms/LoopVectorize/X86/pr39160.ll (revision abb9f9fa06ef22be2b0287b9047d5cfed71d91d4)
1; RUN: opt -passes=loop-vectorize -S < %s 2>&1 | FileCheck %s
2
3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:1"
4target triple = "x86_64-unknown-linux-gnu"
5
6; Make sure that we can compile the test without crash.
7define void @barney(ptr %dst, i1 %arg) {
8
9; CHECK-LABEL: @barney(
10; CHECK:       middle.block:
11
12bb:
13  br label %bb2
14
15bb2:                                              ; preds = %bb2, %bb
16  %tmp4 = icmp slt i32 undef, 0
17  br i1 %tmp4, label %bb2, label %bb5
18
19bb5:                                              ; preds = %bb2
20  br label %bb19
21
22bb18:                                             ; preds = %bb33
23  ret void
24
25bb19:                                             ; preds = %bb36, %bb5
26  %tmp21 = phi i64 [ undef, %bb36 ], [ 2, %bb5 ]
27  %tmp22 = phi i32 [ %tmp65, %bb36 ], [ undef, %bb5 ]
28  br label %bb50
29
30bb33:                                             ; preds = %bb62
31  br i1 %arg, label %bb18, label %bb36
32
33bb36:                                             ; preds = %bb33
34  br label %bb19
35
36bb46:                                             ; preds = %bb50
37  br i1 %arg, label %bb48, label %bb59
38
39bb48:                                             ; preds = %bb46
40  %tmp49 = add i32 %tmp52, 14
41  ret void
42
43bb50:                                             ; preds = %bb50, %bb19
44  %tmp52 = phi i32 [ %tmp55, %bb50 ], [ %tmp22, %bb19 ]
45  %tmp53 = phi i64 [ %tmp56, %bb50 ], [ 1, %bb19 ]
46  %gep = getelementptr inbounds i8, ptr %dst, i64 %tmp53
47  store i8 1, ptr %gep
48  %tmp54 = add i32 %tmp52, 12
49  %tmp55 = add i32 %tmp52, 13
50  %tmp56 = add nuw nsw i64 %tmp53, 1
51  %tmp58 = icmp ult i64 %tmp53, undef
52  br i1 %tmp58, label %bb50, label %bb46
53
54bb59:                                             ; preds = %bb46
55  br label %bb62
56
57bb62:                                             ; preds = %bb68, %bb59
58  %tmp63 = phi i32 [ %tmp65, %bb68 ], [ %tmp55, %bb59 ]
59  %tmp64 = phi i64 [ %tmp66, %bb68 ], [ %tmp56, %bb59 ]
60  %tmp65 = add i32 %tmp63, 13
61  %tmp66 = add nuw nsw i64 %tmp64, 1
62  %tmp67 = icmp ult i64 %tmp66, %tmp21
63  br i1 %tmp67, label %bb68, label %bb33
64
65bb68:                                             ; preds = %bb62
66  br label %bb62
67}
68
69define i32 @foo(ptr addrspace(1) %p) {
70
71; CHECK-LABEL: foo
72; CHECK:       middle.block:
73
74entry:
75  br label %outer
76
77outer:                                            ; preds = %outer_latch, %entry
78  %iv = phi i64 [ 2, %entry ], [ %iv.next, %outer_latch ]
79  br label %inner
80
81inner:                                            ; preds = %inner, %outer
82  %0 = phi i32 [ %2, %inner ], [ 0, %outer ]
83  %a = phi i32 [ %3, %inner ], [ 1, %outer ]
84  %b = phi i32 [ %1, %inner ], [ 6, %outer ]
85  %1 = add i32 %b, 2
86  %2 = or i32 %0, %b
87  %3 = add nuw nsw i32 %a, 1
88  %4 = zext i32 %3 to i64
89  %5 = icmp ugt i64 %iv, %4
90  br i1 %5, label %inner, label %outer_latch
91
92outer_latch:                                      ; preds = %inner
93  store atomic i32 %2, ptr addrspace(1) %p unordered, align 4
94  %iv.next = add nuw nsw i64 %iv, 1
95  %6 = icmp ugt i64 %iv, 63
96  br i1 %6, label %exit, label %outer
97
98exit:                                             ; preds = %outer_latch
99  ret i32 0
100}
101