• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -indvars -indvars-predicate-loops=0  < %s | FileCheck %s
3
4; Check that we don't reuse %zext instead of %inc11 for LCSSA Phi node. Case
5; with constants SCEV.
6
7define i32 @test_01() {
8; CHECK-LABEL: @test_01(
9; CHECK-NEXT:  entry:
10; CHECK-NEXT:    br label [[FOR_COND1_PREHEADER:%.*]]
11; CHECK:       for.cond1.preheader:
12; CHECK-NEXT:    br label [[FOR_COND4_PREHEADER:%.*]]
13; CHECK:       for.cond4.preheader:
14; CHECK-NEXT:    [[ZEXT:%.*]] = zext i16 1 to i32
15; CHECK-NEXT:    br label [[FOR_BODY6:%.*]]
16; CHECK:       for.cond4:
17; CHECK-NEXT:    br i1 true, label [[FOR_BODY6]], label [[FOR_END:%.*]]
18; CHECK:       for.body6:
19; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[FOR_COND4_PREHEADER]] ], [ [[INC:%.*]], [[FOR_COND4:%.*]] ]
20; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[IV]], [[ZEXT]]
21; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[IV]], 1
22; CHECK-NEXT:    br i1 [[TMP0]], label [[RETURN_LOOPEXIT:%.*]], label [[FOR_COND4]]
23; CHECK:       for.end:
24; CHECK-NEXT:    br i1 false, label [[FOR_COND4_PREHEADER]], label [[FOR_END9:%.*]]
25; CHECK:       for.end9:
26; CHECK-NEXT:    br i1 false, label [[FOR_COND1_PREHEADER]], label [[RETURN_LOOPEXIT3:%.*]]
27; CHECK:       return.loopexit:
28; CHECK-NEXT:    unreachable
29; CHECK:       return.loopexit3:
30; CHECK-NEXT:    br label [[RETURN:%.*]]
31; CHECK:       return:
32; CHECK-NEXT:    ret i32 1
33;
34entry:
35  br label %for.cond1.preheader
36
37for.cond1.preheader:                              ; preds = %for.end9, %entry
38  br label %for.cond4.preheader
39
40for.cond4.preheader:                              ; preds = %for.end, %for.cond1.preheader
41  %zext = zext i16 1 to i32
42  br label %for.body6
43
44for.cond4:                                        ; preds = %for.body6
45  %cmp5 = icmp ult i32 %inc, 2
46  br i1 %cmp5, label %for.body6, label %for.end
47
48for.body6:                                        ; preds = %for.cond4, %for.cond4.preheader
49  %iv = phi i32 [ 0, %for.cond4.preheader ], [ %inc, %for.cond4 ]
50  %0 = icmp eq i32 %iv, %zext
51  %inc = add nuw nsw i32 %iv, 1
52  br i1 %0, label %return.loopexit, label %for.cond4
53
54for.end:                                          ; preds = %for.cond4
55  br i1 false, label %for.cond4.preheader, label %for.end9
56
57for.end9:                                         ; preds = %for.end
58  %inc11 = add nuw nsw i32 0, 1
59  br i1 false, label %for.cond1.preheader, label %return.loopexit3
60
61return.loopexit:                                  ; preds = %for.body6
62  unreachable
63
64return.loopexit3:                                 ; preds = %for.end9
65  %inc11.lcssa = phi i32 [ %inc11, %for.end9 ]
66  br label %return
67
68return:                                           ; preds = %return.loopexit3
69  ret i32 %inc11.lcssa
70}
71
72; Same as test_01, but the instructions with the same SCEV have a non-constant
73; SCEV.
74define i32 @test_02(i32 %x) {
75; CHECK-LABEL: @test_02(
76; CHECK-NEXT:  entry:
77; CHECK-NEXT:    br label [[FOR_COND1_PREHEADER:%.*]]
78; CHECK:       for.cond1.preheader:
79; CHECK-NEXT:    br label [[FOR_COND4_PREHEADER:%.*]]
80; CHECK:       for.cond4.preheader:
81; CHECK-NEXT:    [[ZEXT:%.*]] = mul i32 [[X:%.*]], 1
82; CHECK-NEXT:    br label [[FOR_BODY6:%.*]]
83; CHECK:       for.cond4:
84; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[INC:%.*]], 2
85; CHECK-NEXT:    br i1 [[CMP5]], label [[FOR_BODY6]], label [[FOR_END:%.*]]
86; CHECK:       for.body6:
87; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[FOR_COND4_PREHEADER]] ], [ [[INC]], [[FOR_COND4:%.*]] ]
88; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[IV]], [[ZEXT]]
89; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[IV]], 1
90; CHECK-NEXT:    br i1 [[TMP0]], label [[RETURN_LOOPEXIT:%.*]], label [[FOR_COND4]]
91; CHECK:       for.end:
92; CHECK-NEXT:    br i1 false, label [[FOR_COND4_PREHEADER]], label [[FOR_END9:%.*]]
93; CHECK:       for.end9:
94; CHECK-NEXT:    br i1 false, label [[FOR_COND1_PREHEADER]], label [[RETURN_LOOPEXIT3:%.*]]
95; CHECK:       return.loopexit:
96; CHECK-NEXT:    unreachable
97; CHECK:       return.loopexit3:
98; CHECK-NEXT:    br label [[RETURN:%.*]]
99; CHECK:       return:
100; CHECK-NEXT:    ret i32 [[X]]
101;
102entry:
103  br label %for.cond1.preheader
104
105for.cond1.preheader:                              ; preds = %for.end9, %entry
106  br label %for.cond4.preheader
107
108for.cond4.preheader:                              ; preds = %for.end, %for.cond1.preheader
109  %zext = mul i32 %x, 1
110  br label %for.body6
111
112for.cond4:                                        ; preds = %for.body6
113  %cmp5 = icmp ult i32 %inc, 2
114  br i1 %cmp5, label %for.body6, label %for.end
115
116for.body6:                                        ; preds = %for.cond4, %for.cond4.preheader
117  %iv = phi i32 [ 0, %for.cond4.preheader ], [ %inc, %for.cond4 ]
118  %0 = icmp eq i32 %iv, %zext
119  %inc = add nuw nsw i32 %iv, 1
120  br i1 %0, label %return.loopexit, label %for.cond4
121
122for.end:                                          ; preds = %for.cond4
123  br i1 false, label %for.cond4.preheader, label %for.end9
124
125for.end9:                                         ; preds = %for.end
126  %inc11 = add nuw nsw i32 0, %x
127  br i1 false, label %for.cond1.preheader, label %return.loopexit3
128
129return.loopexit:                                  ; preds = %for.body6
130  unreachable
131
132return.loopexit3:                                 ; preds = %for.end9
133  %inc11.lcssa = phi i32 [ %inc11, %for.end9 ]
134  br label %return
135
136return:                                           ; preds = %return.loopexit3
137  ret i32 %inc11.lcssa
138}
139