xref: /llvm-project/llvm/test/Transforms/LoopFusion/lcssa.ll (revision 5004320590aed2e27140fb458ebd67b68af05a91)
1*50043205SJoshua Cao; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*50043205SJoshua Cao; RUN: opt -S -passes=loop-fusion < %s 2>&1 | FileCheck %s
3*50043205SJoshua Cao
4*50043205SJoshua Cao; Tests when the second loop preheader has a phi coming from the first loop
5*50043205SJoshua Cao; exit. If the phi is not used in the second loop, the loops can be fused and
6*50043205SJoshua Cao; the phi is sunk to the fused loop exit. If the phi is used in the second loop,
7*50043205SJoshua Cao; the loops cannot be fused.
8*50043205SJoshua Cao
9*50043205SJoshua Caodefine void @test1() {
10*50043205SJoshua Cao; CHECK-LABEL: @test1(
11*50043205SJoshua Cao; CHECK-NEXT:  entry:
12*50043205SJoshua Cao; CHECK-NEXT:    br label [[VECTOR_PH:%.*]]
13*50043205SJoshua Cao; CHECK:       vector.ph:
14*50043205SJoshua Cao; CHECK-NEXT:    br label [[MIDDLE_BLOCK:%.*]]
15*50043205SJoshua Cao; CHECK:       middle.block:
16*50043205SJoshua Cao; CHECK-NEXT:    br i1 true, label [[FOR_END41:%.*]], label [[VECTOR_PH]]
17*50043205SJoshua Cao; CHECK:       for.end41:
18*50043205SJoshua Cao; CHECK-NEXT:    [[DOTLCSSA92:%.*]] = phi i16 [ 1, [[MIDDLE_BLOCK]] ]
19*50043205SJoshua Cao; CHECK-NEXT:    ret void
20*50043205SJoshua Cao;
21*50043205SJoshua Caoentry:
22*50043205SJoshua Cao  br label %vector.ph
23*50043205SJoshua Cao
24*50043205SJoshua Caovector.ph:                                        ; preds = %middle.block, %entry
25*50043205SJoshua Cao  br label %middle.block
26*50043205SJoshua Cao
27*50043205SJoshua Caomiddle.block:                                     ; preds = %vector.ph
28*50043205SJoshua Cao  br i1 true, label %for.cond17.preheader, label %vector.ph
29*50043205SJoshua Cao
30*50043205SJoshua Caofor.cond17.preheader:                             ; preds = %middle.block
31*50043205SJoshua Cao  %.lcssa92 = phi i16 [ 1, %middle.block ]
32*50043205SJoshua Cao  br label %vector.ph61
33*50043205SJoshua Cao
34*50043205SJoshua Caovector.ph61:                                      ; preds = %middle.block59, %for.cond17.preheader
35*50043205SJoshua Cao  br i1 true, label %for.end41, label %vector.ph61
36*50043205SJoshua Cao
37*50043205SJoshua Caofor.end41:                                        ; preds = %middle.block59
38*50043205SJoshua Cao  ret void
39*50043205SJoshua Cao}
40*50043205SJoshua Cao
41*50043205SJoshua Caodefine void @test2() {
42*50043205SJoshua Cao; CHECK-LABEL: @test2(
43*50043205SJoshua Cao; CHECK-NEXT:  entry:
44*50043205SJoshua Cao; CHECK-NEXT:    br label [[VECTOR_PH:%.*]]
45*50043205SJoshua Cao; CHECK:       vector.ph:
46*50043205SJoshua Cao; CHECK-NEXT:    br label [[MIDDLE_BLOCK:%.*]]
47*50043205SJoshua Cao; CHECK:       middle.block:
48*50043205SJoshua Cao; CHECK-NEXT:    br i1 true, label [[FOR_COND17_PREHEADER:%.*]], label [[VECTOR_PH]]
49*50043205SJoshua Cao; CHECK:       for.cond17.preheader:
50*50043205SJoshua Cao; CHECK-NEXT:    [[DOTLCSSA92:%.*]] = phi i16 [ 1, [[MIDDLE_BLOCK]] ]
51*50043205SJoshua Cao; CHECK-NEXT:    br label [[VECTOR_PH61:%.*]]
52*50043205SJoshua Cao; CHECK:       vector.ph61:
53*50043205SJoshua Cao; CHECK-NEXT:    call void @a(i16 [[DOTLCSSA92]])
54*50043205SJoshua Cao; CHECK-NEXT:    br i1 true, label [[FOR_END41:%.*]], label [[VECTOR_PH61]]
55*50043205SJoshua Cao; CHECK:       for.end41:
56*50043205SJoshua Cao; CHECK-NEXT:    ret void
57*50043205SJoshua Cao;
58*50043205SJoshua Caoentry:
59*50043205SJoshua Cao  br label %vector.ph
60*50043205SJoshua Cao
61*50043205SJoshua Caovector.ph:                                        ; preds = %middle.block, %entry
62*50043205SJoshua Cao  br label %middle.block
63*50043205SJoshua Cao
64*50043205SJoshua Caomiddle.block:                                     ; preds = %vector.ph
65*50043205SJoshua Cao  br i1 true, label %for.cond17.preheader, label %vector.ph
66*50043205SJoshua Cao
67*50043205SJoshua Caofor.cond17.preheader:                             ; preds = %middle.block
68*50043205SJoshua Cao  %.lcssa92 = phi i16 [ 1, %middle.block ]
69*50043205SJoshua Cao  br label %vector.ph61
70*50043205SJoshua Cao
71*50043205SJoshua Caovector.ph61:                                      ; preds = %middle.block59, %for.cond17.preheader
72*50043205SJoshua Cao  call void @a(i16 %.lcssa92)
73*50043205SJoshua Cao  br i1 true, label %for.end41, label %vector.ph61
74*50043205SJoshua Cao
75*50043205SJoshua Caofor.end41:                                        ; preds = %middle.block59
76*50043205SJoshua Cao  ret void
77*50043205SJoshua Cao}
78*50043205SJoshua Cao
79*50043205SJoshua Caodeclare void @a(i16);
80