@@ -77,10 +77,14 @@ define i32 @peel_with_guard_known_nonnegative_2(ptr %x, i32 %w) {
7777; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[W]], -1
7878; CHECK-NEXT: [[TMP0:%.*]] = zext nneg i32 [[SUB]] to i64
7979; CHECK-NEXT: [[WIDE_TRIP_COUNT:%.*]] = zext nneg i32 [[W]] to i64
80+ ; CHECK-NEXT: [[TMP3:%.*]] = add nsw i64 [[WIDE_TRIP_COUNT]], -1
81+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i64 [[TMP3]], 0
82+ ; CHECK-NEXT: br i1 [[TMP2]], label %[[PH_SPLIT:.*]], label %[[EXIT_LOOPEXIT_PEEL_BEGIN:.*]]
83+ ; CHECK: [[PH_SPLIT]]:
8084; CHECK-NEXT: br label %[[LOOP_HEADER:.*]]
8185; CHECK: [[LOOP_HEADER]]:
82- ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[PH ]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
83- ; CHECK-NEXT: [[RED:%.*]] = phi i32 [ 0, %[[PH ]] ], [ [[ADD:%.*]], %[[LOOP_LATCH]] ]
86+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[PH_SPLIT ]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
87+ ; CHECK-NEXT: [[RED:%.*]] = phi i32 [ 0, %[[PH_SPLIT ]] ], [ [[ADD:%.*]], %[[LOOP_LATCH]] ]
8488; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i64 [[IV]], [[TMP0]]
8589; CHECK-NEXT: br i1 [[CMP1]], label %[[IF_THEN:.*]], label %[[LOOP_LATCH]]
8690; CHECK: [[IF_THEN]]:
@@ -91,13 +95,38 @@ define i32 @peel_with_guard_known_nonnegative_2(ptr %x, i32 %w) {
9195; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
9296; CHECK-NEXT: [[ADD]] = add nsw i32 [[TMP1]], [[RED]]
9397; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
94- ; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[WIDE_TRIP_COUNT]]
95- ; CHECK-NEXT: br i1 [[EC]], label %[[EXIT_LOOPEXIT:.*]], label %[[LOOP_HEADER]]
98+ ; CHECK-NEXT: [[TMP4:%.*]] = sub i64 [[WIDE_TRIP_COUNT]], 1
99+ ; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[TMP4]]
100+ ; CHECK-NEXT: br i1 [[EC]], label %[[EXIT_LOOPEXIT_PEEL_BEGIN_LOOPEXIT:.*]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP2:![0-9]+]]
101+ ; CHECK: [[EXIT_LOOPEXIT_PEEL_BEGIN_LOOPEXIT]]:
102+ ; CHECK-NEXT: [[DOTPH:%.*]] = phi i64 [ [[IV_NEXT]], %[[LOOP_LATCH]] ]
103+ ; CHECK-NEXT: [[DOTPH1:%.*]] = phi i32 [ [[ADD]], %[[LOOP_LATCH]] ]
104+ ; CHECK-NEXT: br label %[[EXIT_LOOPEXIT_PEEL_BEGIN]]
105+ ; CHECK: [[EXIT_LOOPEXIT_PEEL_BEGIN]]:
106+ ; CHECK-NEXT: [[TMP5:%.*]] = phi i64 [ 0, %[[PH]] ], [ [[DOTPH]], %[[EXIT_LOOPEXIT_PEEL_BEGIN_LOOPEXIT]] ]
107+ ; CHECK-NEXT: [[TMP6:%.*]] = phi i32 [ 0, %[[PH]] ], [ [[DOTPH1]], %[[EXIT_LOOPEXIT_PEEL_BEGIN_LOOPEXIT]] ]
108+ ; CHECK-NEXT: br label %[[LOOP_HEADER_PEEL:.*]]
109+ ; CHECK: [[LOOP_HEADER_PEEL]]:
110+ ; CHECK-NEXT: [[CMP1_PEEL:%.*]] = icmp eq i64 [[TMP5]], [[TMP0]]
111+ ; CHECK-NEXT: br i1 [[CMP1_PEEL]], label %[[IF_THEN_PEEL:.*]], label %[[LOOP_LATCH_PEEL:.*]]
112+ ; CHECK: [[IF_THEN_PEEL]]:
113+ ; CHECK-NEXT: tail call void @foo()
114+ ; CHECK-NEXT: br label %[[LOOP_LATCH_PEEL]]
115+ ; CHECK: [[LOOP_LATCH_PEEL]]:
116+ ; CHECK-NEXT: [[ARRAYIDX_PEEL:%.*]] = getelementptr inbounds nuw i32, ptr [[X]], i64 [[TMP5]]
117+ ; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[ARRAYIDX_PEEL]], align 4
118+ ; CHECK-NEXT: [[ADD_PEEL:%.*]] = add nsw i32 [[TMP7]], [[TMP6]]
119+ ; CHECK-NEXT: [[IV_NEXT_PEEL:%.*]] = add nuw nsw i64 [[TMP5]], 1
120+ ; CHECK-NEXT: [[EC_PEEL:%.*]] = icmp eq i64 [[IV_NEXT_PEEL]], [[WIDE_TRIP_COUNT]]
121+ ; CHECK-NEXT: br i1 [[EC_PEEL]], label %[[EXIT_LOOPEXIT_PEEL_NEXT:.*]], label %[[EXIT_LOOPEXIT_PEEL_NEXT]]
122+ ; CHECK: [[EXIT_LOOPEXIT_PEEL_NEXT]]:
123+ ; CHECK-NEXT: br label %[[LOOP_HEADER_PEEL_NEXT:.*]]
124+ ; CHECK: [[LOOP_HEADER_PEEL_NEXT]]:
125+ ; CHECK-NEXT: br label %[[EXIT_LOOPEXIT:.*]]
96126; CHECK: [[EXIT_LOOPEXIT]]:
97- ; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], %[[LOOP_LATCH]] ]
98127; CHECK-NEXT: br label %[[EXIT]]
99128; CHECK: [[EXIT]]:
100- ; CHECK-NEXT: [[RED_LCSSA:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[ADD_LCSSA ]], %[[EXIT_LOOPEXIT]] ]
129+ ; CHECK-NEXT: [[RED_LCSSA:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[ADD_PEEL ]], %[[EXIT_LOOPEXIT]] ]
101130; CHECK-NEXT: ret i32 [[RED_LCSSA]]
102131;
103132entry:
@@ -156,7 +185,7 @@ define void @peel_with_guard2(i32 %n) {
156185; CHECK-NEXT: [[IV_NEXT]] = add nuw i32 [[IV]], 1
157186; CHECK-NEXT: [[TMP2:%.*]] = sub i32 [[N]], 1
158187; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], [[TMP2]]
159- ; CHECK-NEXT: br i1 [[EC]], label %[[EXIT_LOOPEXIT_PEEL_BEGIN_LOOPEXIT:.*]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP2 :![0-9]+]]
188+ ; CHECK-NEXT: br i1 [[EC]], label %[[EXIT_LOOPEXIT_PEEL_BEGIN_LOOPEXIT:.*]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP3 :![0-9]+]]
160189; CHECK: [[EXIT_LOOPEXIT_PEEL_BEGIN_LOOPEXIT]]:
161190; CHECK-NEXT: [[DOTPH:%.*]] = phi i32 [ [[IV_NEXT]], %[[LOOP_LATCH]] ]
162191; CHECK-NEXT: br label %[[EXIT_LOOPEXIT_PEEL_BEGIN]]
0 commit comments