xref: /llvm-project/llvm/test/Transforms/SimpleLoopUnswitch/invalidate-block-and-loop-dispositions.ll (revision a41cb8bf58aec8d8bdc2134267d68267886ef9f4)
1e399dd60SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2eb975caeSFlorian Hahn; RUN: opt -passes="loop-mssa(indvars,simple-loop-unswitch<nontrivial>)" -verify-scev -S %s | FileCheck %s
3e399dd60SFlorian Hahntarget datalayout = "n16:32"
4e399dd60SFlorian Hahn
5e399dd60SFlorian Hahn@glob = external global i16, align 1
6e399dd60SFlorian Hahn
7e399dd60SFlorian Hahn; Test case for PR58136.
8eb975caeSFlorian Hahndefine void @test_pr58136(i1 %c.1, i1 %c.2) {
9eb975caeSFlorian Hahn; CHECK-LABEL: @test_pr58136(
10e399dd60SFlorian Hahn; CHECK-NEXT:  entry:
11eb975caeSFlorian Hahn; CHECK-NEXT:    [[SRC1:%.*]] = alloca i16, align 2
12eb975caeSFlorian Hahn; CHECK-NEXT:    [[L_3:%.*]] = load i16, ptr [[SRC1]], align 2
13eb975caeSFlorian Hahn; CHECK-NEXT:    [[GLOB_PROMOTED:%.*]] = load i16, ptr @glob, align 2
14eb975caeSFlorian Hahn; CHECK-NEXT:    [[C_1_FR:%.*]] = freeze i1 [[C_1:%.*]]
15eb975caeSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]
16e399dd60SFlorian Hahn; CHECK:       entry.split.us:
17eb975caeSFlorian Hahn; CHECK-NEXT:    [[C_2_FR:%.*]] = freeze i1 [[C_2:%.*]]
18eb975caeSFlorian Hahn; CHECK-NEXT:    br i1 [[C_2_FR]], label [[ENTRY_SPLIT_US_SPLIT_US:%.*]], label [[ENTRY_SPLIT_US_SPLIT:%.*]]
19e399dd60SFlorian Hahn; CHECK:       entry.split.us.split.us:
20e399dd60SFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER_US_US:%.*]]
21e399dd60SFlorian Hahn; CHECK:       loop.header.us.us:
22eb975caeSFlorian Hahn; CHECK-NEXT:    [[MUL1_US_US:%.*]] = phi i16 [ [[MUL_US_US:%.*]], [[LOOP_LATCH_US_US:%.*]] ], [ [[GLOB_PROMOTED]], [[ENTRY_SPLIT_US_SPLIT_US]] ]
23eb975caeSFlorian Hahn; CHECK-NEXT:    [[CALL2_US_US:%.*]] = call i16 @foo()
24eb975caeSFlorian Hahn; CHECK-NEXT:    br label [[THEN_BB_US_US:%.*]]
25eb975caeSFlorian Hahn; CHECK:       then.bb.us.us:
26eb975caeSFlorian Hahn; CHECK-NEXT:    br label [[LOOP_LATCH_US_US]]
27eb975caeSFlorian Hahn; CHECK:       loop.latch.us.us:
28e399dd60SFlorian Hahn; CHECK-NEXT:    [[MUL_US_US]] = mul nsw i16 [[MUL1_US_US]], [[L_3]]
29eb975caeSFlorian Hahn; CHECK-NEXT:    store i16 [[MUL_US_US]], ptr @glob, align 2
30e399dd60SFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER_US_US]]
31e399dd60SFlorian Hahn; CHECK:       entry.split.us.split:
32e399dd60SFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER_US:%.*]]
33e399dd60SFlorian Hahn; CHECK:       loop.header.us:
34eb975caeSFlorian Hahn; CHECK-NEXT:    [[CALL2_US:%.*]] = call i16 @foo()
35eb975caeSFlorian Hahn; CHECK-NEXT:    br label [[THEN_BB_US:%.*]]
36eb975caeSFlorian Hahn; CHECK:       then.bb.us:
37e399dd60SFlorian Hahn; CHECK-NEXT:    br label [[EXIT_SPLIT_US:%.*]]
38e399dd60SFlorian Hahn; CHECK:       exit.split.us:
39e399dd60SFlorian Hahn; CHECK-NEXT:    br label [[EXIT:%.*]]
40e399dd60SFlorian Hahn; CHECK:       entry.split:
41e399dd60SFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]
42e399dd60SFlorian Hahn; CHECK:       loop.header:
43eb975caeSFlorian Hahn; CHECK-NEXT:    [[CALL2:%.*]] = call i16 @foo()
44eb975caeSFlorian Hahn; CHECK-NEXT:    br label [[EXIT_SPLIT:%.*]]
45e399dd60SFlorian Hahn; CHECK:       exit.split:
46e399dd60SFlorian Hahn; CHECK-NEXT:    br label [[EXIT]]
47e399dd60SFlorian Hahn; CHECK:       exit:
48e399dd60SFlorian Hahn; CHECK-NEXT:    ret void
49e399dd60SFlorian Hahn;
50e399dd60SFlorian Hahnentry:
51eb975caeSFlorian Hahn  %src1 = alloca i16, align 2
52eb975caeSFlorian Hahn  %l.3 = load i16, ptr %src1, align 2
53eb975caeSFlorian Hahn  %glob.promoted = load i16, ptr @glob, align 2
54e399dd60SFlorian Hahn  br label %loop.header
55e399dd60SFlorian Hahn
56eb975caeSFlorian Hahnloop.header:                                      ; preds = %loop.latch, %entry
57eb975caeSFlorian Hahn  %mul1 = phi i16 [ %mul, %loop.latch ], [ %glob.promoted, %entry ]
58eb975caeSFlorian Hahn  %call2 = call i16 @foo()
59eb975caeSFlorian Hahn  br i1 %c.1, label %then.bb, label %exit
60e399dd60SFlorian Hahn
61eb975caeSFlorian Hahnthen.bb:                                          ; preds = %loop.header
62eb975caeSFlorian Hahn  br i1 %c.2, label %loop.latch, label %exit
63e399dd60SFlorian Hahn
64eb975caeSFlorian Hahnloop.latch:                                       ; preds = %then.bb
65eb975caeSFlorian Hahn  %mul = mul nsw i16 %mul1, %l.3
66eb975caeSFlorian Hahn  store i16 %mul, ptr @glob, align 2
67e399dd60SFlorian Hahn  br label %loop.header
68e399dd60SFlorian Hahn
69eb975caeSFlorian Hahnexit:                                             ; preds = %then.bb, %loop.header
70e399dd60SFlorian Hahn  ret void
71e399dd60SFlorian Hahn}
72e399dd60SFlorian Hahn
73e399dd60SFlorian Hahndeclare i16 @foo() nounwind readnone
74469f0fc6SFlorian Hahn
75469f0fc6SFlorian Hahndefine void @test_pr58158(i1 %c.1) {
76469f0fc6SFlorian Hahn; CHECK-LABEL: @test_pr58158(
77469f0fc6SFlorian Hahn; CHECK-NEXT:  entry:
78469f0fc6SFlorian Hahn; CHECK-NEXT:    [[CALL:%.*]] = tail call i16 @bar()
79469f0fc6SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]
80469f0fc6SFlorian Hahn; CHECK:       entry.split.us:
81469f0fc6SFlorian Hahn; CHECK-NEXT:    br label [[OUTER_US:%.*]]
82469f0fc6SFlorian Hahn; CHECK:       outer.us:
83469f0fc6SFlorian Hahn; CHECK-NEXT:    br label [[INNER_PREHEADER_US:%.*]]
84469f0fc6SFlorian Hahn; CHECK:       inner.us:
85469f0fc6SFlorian Hahn; CHECK-NEXT:    [[C_2_US:%.*]] = icmp eq i16 0, [[CALL]]
86469f0fc6SFlorian Hahn; CHECK-NEXT:    br i1 [[C_2_US]], label [[OUTER_LOOPEXIT_US:%.*]], label [[INNER_US:%.*]]
87469f0fc6SFlorian Hahn; CHECK:       inner.preheader.us:
88469f0fc6SFlorian Hahn; CHECK-NEXT:    br label [[INNER_US]]
89469f0fc6SFlorian Hahn; CHECK:       outer.loopexit.us:
90469f0fc6SFlorian Hahn; CHECK-NEXT:    br label [[OUTER_BACKEDGE_US:%.*]]
91469f0fc6SFlorian Hahn; CHECK:       outer.backedge.us:
92469f0fc6SFlorian Hahn; CHECK-NEXT:    br label [[OUTER_US]]
93469f0fc6SFlorian Hahn; CHECK:       entry.split:
94469f0fc6SFlorian Hahn; CHECK-NEXT:    br label [[OUTER:%.*]]
95469f0fc6SFlorian Hahn; CHECK:       outer:
96469f0fc6SFlorian Hahn; CHECK-NEXT:    br label [[OUTER_BACKEDGE:%.*]]
97469f0fc6SFlorian Hahn; CHECK:       outer.backedge:
98469f0fc6SFlorian Hahn; CHECK-NEXT:    br label [[OUTER]]
99469f0fc6SFlorian Hahn;
100469f0fc6SFlorian Hahnentry:
101469f0fc6SFlorian Hahn  %call = tail call i16 @bar()
102469f0fc6SFlorian Hahn  br label %outer
103469f0fc6SFlorian Hahn
104469f0fc6SFlorian Hahnouter:
105469f0fc6SFlorian Hahn  br i1 %c.1, label %inner, label %outer
106469f0fc6SFlorian Hahn
107469f0fc6SFlorian Hahninner:
108469f0fc6SFlorian Hahn  %c.2 = icmp eq i16 0, %call
109469f0fc6SFlorian Hahn  br i1 %c.2, label %outer, label %inner
110469f0fc6SFlorian Hahn}
111469f0fc6SFlorian Hahn
112469f0fc6SFlorian Hahndeclare i16 @bar()
113*a41cb8bfSFlorian Hahn
114*a41cb8bfSFlorian Hahndefine void @pr58751(i16 %a, ptr %dst) {
115*a41cb8bfSFlorian Hahnentry:
116*a41cb8bfSFlorian Hahn  %c.1 = icmp eq i16 %a, 0
117*a41cb8bfSFlorian Hahn  br label %outer.header
118*a41cb8bfSFlorian Hahn
119*a41cb8bfSFlorian Hahnouter.header:
120*a41cb8bfSFlorian Hahn  %outer.iv = phi i16 [ %a, %entry ], [ %outer.iv.next, %outer.latch ]
121*a41cb8bfSFlorian Hahn  br label %inner.header
122*a41cb8bfSFlorian Hahn
123*a41cb8bfSFlorian Hahninner.header:
124*a41cb8bfSFlorian Hahn  %inner.iv = phi i16 [ %outer.iv, %outer.header ], [ %inner.iv.next, %inner.latch ]
125*a41cb8bfSFlorian Hahn  br i1 %c.1, label %outer.latch, label %inner.latch
126*a41cb8bfSFlorian Hahn
127*a41cb8bfSFlorian Hahninner.latch:
128*a41cb8bfSFlorian Hahn  %inner.iv.next = add nsw i16 %inner.iv, 1
129*a41cb8bfSFlorian Hahn  store i16 %inner.iv.next, ptr %dst, align 1
130*a41cb8bfSFlorian Hahn  %c.2 = icmp eq i16 %inner.iv.next, 0
131*a41cb8bfSFlorian Hahn  br i1 %c.2, label %exit, label %inner.header
132*a41cb8bfSFlorian Hahn
133*a41cb8bfSFlorian Hahnouter.latch:
134*a41cb8bfSFlorian Hahn  %outer.iv.next = add nsw i16 %outer.iv, 1
135*a41cb8bfSFlorian Hahn  br label %outer.header
136*a41cb8bfSFlorian Hahn
137*a41cb8bfSFlorian Hahnexit:
138*a41cb8bfSFlorian Hahn  ret void
139*a41cb8bfSFlorian Hahn}
140*a41cb8bfSFlorian Hahn
141