@@ -89,3 +89,118 @@ loop_exit_7: ; preds = %be_6, %loop_4
89
89
%val_i32_24.lcssa = phi i32 [ %val_i32_24 , %be_6 ], [ %val_i32_24 , %loop_4 ]
90
90
br label %bb_5
91
91
}
92
+
93
+ define i64 @test_duplicated_phis (i64 noundef %N ) {
94
+ ; LEGACYPM-LABEL: define i64 @test_duplicated_phis
95
+ ; LEGACYPM-SAME: (i64 noundef [[N:%.*]]) {
96
+ ; LEGACYPM-NEXT: entry:
97
+ ; LEGACYPM-NEXT: [[MUL:%.*]] = shl i64 [[N]], 1
98
+ ; LEGACYPM-NEXT: [[CMP6_NOT:%.*]] = icmp eq i64 [[MUL]], 0
99
+ ; LEGACYPM-NEXT: br i1 [[CMP6_NOT]], label [[FOR_END:%.*]], label [[FOR_BODY_PREHEADER:%.*]]
100
+ ; LEGACYPM: for.body.preheader:
101
+ ; LEGACYPM-NEXT: [[TMP0:%.*]] = icmp ult i64 [[MUL]], 4
102
+ ; LEGACYPM-NEXT: br i1 [[TMP0]], label [[FOR_END_LOOPEXIT_UNR_LCSSA:%.*]], label [[FOR_BODY_PREHEADER_NEW:%.*]]
103
+ ; LEGACYPM: for.body.preheader.new:
104
+ ; LEGACYPM-NEXT: [[UNROLL_ITER:%.*]] = and i64 [[MUL]], -4
105
+ ; LEGACYPM-NEXT: br label [[FOR_BODY:%.*]]
106
+ ; LEGACYPM: for.body:
107
+ ; LEGACYPM-NEXT: [[LSR_IV:%.*]] = phi i64 [ [[LSR_IV_NEXT:%.*]], [[FOR_BODY]] ], [ -1, [[FOR_BODY_PREHEADER_NEW]] ]
108
+ ; LEGACYPM-NEXT: [[I_07:%.*]] = phi i64 [ 0, [[FOR_BODY_PREHEADER_NEW]] ], [ [[INC_3:%.*]], [[FOR_BODY]] ]
109
+ ; LEGACYPM-NEXT: [[INC_3]] = add i64 [[I_07]], 4
110
+ ; LEGACYPM-NEXT: [[LSR_IV_NEXT]] = add i64 [[LSR_IV]], -2
111
+ ; LEGACYPM-NEXT: [[NITER_NCMP_3_NOT:%.*]] = icmp eq i64 [[UNROLL_ITER]], [[INC_3]]
112
+ ; LEGACYPM-NEXT: br i1 [[NITER_NCMP_3_NOT]], label [[FOR_END_LOOPEXIT_UNR_LCSSA_LOOPEXIT:%.*]], label [[FOR_BODY]]
113
+ ; LEGACYPM: for.end.loopexit.unr-lcssa.loopexit:
114
+ ; LEGACYPM-NEXT: [[LSR_IV_NEXT_LCSSA:%.*]] = phi i64 [ [[LSR_IV_NEXT]], [[FOR_BODY]] ]
115
+ ; LEGACYPM-NEXT: [[TMP1:%.*]] = add i64 [[LSR_IV_NEXT]], 1
116
+ ; LEGACYPM-NEXT: br label [[FOR_END_LOOPEXIT_UNR_LCSSA]]
117
+ ; LEGACYPM: for.end.loopexit.unr-lcssa:
118
+ ; LEGACYPM-NEXT: [[RES_1_LCSSA_PH:%.*]] = phi i64 [ undef, [[FOR_BODY_PREHEADER]] ], [ [[TMP1]], [[FOR_END_LOOPEXIT_UNR_LCSSA_LOOPEXIT]] ]
119
+ ; LEGACYPM-NEXT: [[RES_09_UNR:%.*]] = phi i64 [ -1, [[FOR_BODY_PREHEADER]] ], [ [[LSR_IV_NEXT_LCSSA]], [[FOR_END_LOOPEXIT_UNR_LCSSA_LOOPEXIT]] ]
120
+ ; LEGACYPM-NEXT: [[TMP2:%.*]] = and i64 [[N]], 1
121
+ ; LEGACYPM-NEXT: [[LCMP_MOD_NOT:%.*]] = icmp eq i64 [[TMP2]], 0
122
+ ; LEGACYPM-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[LCMP_MOD_NOT]], i64 [[RES_1_LCSSA_PH]], i64 [[RES_09_UNR]]
123
+ ; LEGACYPM-NEXT: br label [[FOR_END]]
124
+ ; LEGACYPM: for.end:
125
+ ; LEGACYPM-NEXT: [[RES_0_LCSSA:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[FOR_END_LOOPEXIT_UNR_LCSSA]] ]
126
+ ; LEGACYPM-NEXT: ret i64 [[RES_0_LCSSA]]
127
+ ;
128
+ ; NEWPM-LABEL: define i64 @test_duplicated_phis
129
+ ; NEWPM-SAME: (i64 noundef [[N:%.*]]) {
130
+ ; NEWPM-NEXT: entry:
131
+ ; NEWPM-NEXT: [[MUL:%.*]] = shl i64 [[N]], 1
132
+ ; NEWPM-NEXT: [[CMP6_NOT:%.*]] = icmp eq i64 [[MUL]], 0
133
+ ; NEWPM-NEXT: br i1 [[CMP6_NOT]], label [[FOR_END:%.*]], label [[FOR_BODY_PREHEADER:%.*]]
134
+ ; NEWPM: for.body.preheader:
135
+ ; NEWPM-NEXT: [[TMP0:%.*]] = icmp ult i64 [[MUL]], 4
136
+ ; NEWPM-NEXT: br i1 [[TMP0]], label [[FOR_END_LOOPEXIT_UNR_LCSSA:%.*]], label [[FOR_BODY_PREHEADER_NEW:%.*]]
137
+ ; NEWPM: for.body.preheader.new:
138
+ ; NEWPM-NEXT: [[UNROLL_ITER:%.*]] = and i64 [[MUL]], -4
139
+ ; NEWPM-NEXT: br label [[FOR_BODY:%.*]]
140
+ ; NEWPM: for.body:
141
+ ; NEWPM-NEXT: [[LSR_IV:%.*]] = phi i64 [ [[LSR_IV_NEXT:%.*]], [[FOR_BODY]] ], [ 3, [[FOR_BODY_PREHEADER_NEW]] ]
142
+ ; NEWPM-NEXT: [[I_07:%.*]] = phi i64 [ 0, [[FOR_BODY_PREHEADER_NEW]] ], [ [[INC_3:%.*]], [[FOR_BODY]] ]
143
+ ; NEWPM-NEXT: [[INC_3]] = add i64 [[I_07]], 4
144
+ ; NEWPM-NEXT: [[LSR_IV_NEXT]] = add nsw i64 [[LSR_IV]], -2
145
+ ; NEWPM-NEXT: [[NITER_NCMP_3_NOT:%.*]] = icmp eq i64 [[UNROLL_ITER]], [[INC_3]]
146
+ ; NEWPM-NEXT: [[TMP1:%.*]] = add i64 [[LSR_IV_NEXT]], -3
147
+ ; NEWPM-NEXT: br i1 [[NITER_NCMP_3_NOT]], label [[FOR_END_LOOPEXIT_UNR_LCSSA_LOOPEXIT:%.*]], label [[FOR_BODY]]
148
+ ; NEWPM: for.end.loopexit.unr-lcssa.loopexit:
149
+ ; NEWPM-NEXT: [[REASS_SUB_LCSSA:%.*]] = phi i64 [ [[LSR_IV_NEXT]], [[FOR_BODY]] ]
150
+ ; NEWPM-NEXT: [[RES_1_3_LCSSA:%.*]] = phi i64 [ [[TMP1]], [[FOR_BODY]] ]
151
+ ; NEWPM-NEXT: [[TMP2:%.*]] = add i64 [[REASS_SUB_LCSSA]], -4
152
+ ; NEWPM-NEXT: br label [[FOR_END_LOOPEXIT_UNR_LCSSA]]
153
+ ; NEWPM: for.end.loopexit.unr-lcssa:
154
+ ; NEWPM-NEXT: [[RES_1_LCSSA_PH:%.*]] = phi i64 [ undef, [[FOR_BODY_PREHEADER]] ], [ [[RES_1_3_LCSSA]], [[FOR_END_LOOPEXIT_UNR_LCSSA_LOOPEXIT]] ]
155
+ ; NEWPM-NEXT: [[RES_09_UNR:%.*]] = phi i64 [ -1, [[FOR_BODY_PREHEADER]] ], [ [[TMP2]], [[FOR_END_LOOPEXIT_UNR_LCSSA_LOOPEXIT]] ]
156
+ ; NEWPM-NEXT: [[TMP3:%.*]] = and i64 [[N]], 1
157
+ ; NEWPM-NEXT: [[LCMP_MOD_NOT:%.*]] = icmp eq i64 [[TMP3]], 0
158
+ ; NEWPM-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[LCMP_MOD_NOT]], i64 [[RES_1_LCSSA_PH]], i64 [[RES_09_UNR]]
159
+ ; NEWPM-NEXT: br label [[FOR_END]]
160
+ ; NEWPM: for.end:
161
+ ; NEWPM-NEXT: [[RES_0_LCSSA:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[FOR_END_LOOPEXIT_UNR_LCSSA]] ]
162
+ ; NEWPM-NEXT: ret i64 [[RES_0_LCSSA]]
163
+ ;
164
+ entry:
165
+ %mul = shl i64 %N , 1
166
+ %cmp6.not = icmp eq i64 %mul , 0
167
+ br i1 %cmp6.not , label %for.end , label %for.body.preheader
168
+
169
+ for.body.preheader:
170
+ %0 = icmp ult i64 %mul , 4
171
+ br i1 %0 , label %for.end.loopexit.unr-lcssa , label %for.body.preheader.new
172
+
173
+ for.body.preheader.new:
174
+ %unroll_iter = and i64 %mul , -4
175
+ br label %for.body
176
+
177
+ for.body:
178
+ %res.09 = phi i64 [ 0 , %for.body.preheader.new ], [ %res.1.3 , %for.body ]
179
+ %i.07 = phi i64 [ 0 , %for.body.preheader.new ], [ %inc.3 , %for.body ]
180
+ %niter = phi i64 [ 0 , %for.body.preheader.new ], [ %niter.next.3 , %for.body ]
181
+ %res.1.1 = add i64 %res.09 , -1
182
+ %inc.1 = or disjoint i64 %i.07 , 2
183
+ %res.1.2 = add i64 %inc.1 , %res.1.1
184
+ %reass.sub = sub i64 %res.1.2 , %i.07
185
+ %res.1.3 = add i64 %reass.sub , -3
186
+ %inc.3 = add nuw i64 %i.07 , 4
187
+ %niter.next.3 = add i64 %niter , 4
188
+ %niter.ncmp.3.not = icmp eq i64 %niter.next.3 , %unroll_iter
189
+ br i1 %niter.ncmp.3.not , label %for.end.loopexit.unr-lcssa.loopexit , label %for.body
190
+
191
+ for.end.loopexit.unr-lcssa.loopexit:
192
+ %1 = add i64 %reass.sub , -4
193
+ br label %for.end.loopexit.unr-lcssa
194
+
195
+ for.end.loopexit.unr-lcssa:
196
+ %res.1.lcssa.ph = phi i64 [ undef , %for.body.preheader ], [ %res.1.3 , %for.end.loopexit.unr-lcssa.loopexit ]
197
+ %res.09.unr = phi i64 [ -1 , %for.body.preheader ], [ %1 , %for.end.loopexit.unr-lcssa.loopexit ]
198
+ %2 = and i64 %N , 1
199
+ %lcmp.mod.not = icmp eq i64 %2 , 0
200
+ %spec.select = select i1 %lcmp.mod.not , i64 %res.1.lcssa.ph , i64 %res.09.unr
201
+ br label %for.end
202
+
203
+ for.end:
204
+ %res.0.lcssa = phi i64 [ 0 , %entry ], [ %spec.select , %for.end.loopexit.unr-lcssa ]
205
+ ret i64 %res.0.lcssa
206
+ }
0 commit comments