| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt -S -indvars < %s | FileCheck %s |
| |
| ; Check that we don't reuse %zext instead of %inc11 for LCSSA Phi node. Case |
| ; with constants SCEV. |
| |
| define i32 @test_01() { |
| ; CHECK-LABEL: @test_01( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label [[FOR_COND1_PREHEADER:%.*]] |
| ; CHECK: for.cond1.preheader: |
| ; CHECK-NEXT: br label [[FOR_COND4_PREHEADER:%.*]] |
| ; CHECK: for.cond4.preheader: |
| ; CHECK-NEXT: [[ZEXT:%.*]] = zext i16 1 to i32 |
| ; CHECK-NEXT: br label [[FOR_BODY6:%.*]] |
| ; CHECK: for.cond4: |
| ; CHECK-NEXT: [[CMP5:%.*]] = icmp ult i32 [[INC:%.*]], 2 |
| ; CHECK-NEXT: br i1 [[CMP5]], label [[FOR_BODY6]], label [[FOR_END:%.*]] |
| ; CHECK: for.body6: |
| ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[FOR_COND4_PREHEADER]] ], [ [[INC]], [[FOR_COND4:%.*]] ] |
| ; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[IV]], [[ZEXT]] |
| ; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[IV]], 1 |
| ; CHECK-NEXT: br i1 [[TMP0]], label [[RETURN_LOOPEXIT:%.*]], label [[FOR_COND4]] |
| ; CHECK: for.end: |
| ; CHECK-NEXT: br i1 false, label [[FOR_COND4_PREHEADER]], label [[FOR_END9:%.*]] |
| ; CHECK: for.end9: |
| ; CHECK-NEXT: br i1 false, label [[FOR_COND1_PREHEADER]], label [[RETURN_LOOPEXIT3:%.*]] |
| ; CHECK: return.loopexit: |
| ; CHECK-NEXT: unreachable |
| ; CHECK: return.loopexit3: |
| ; CHECK-NEXT: br label [[RETURN:%.*]] |
| ; CHECK: return: |
| ; CHECK-NEXT: ret i32 1 |
| ; |
| entry: |
| br label %for.cond1.preheader |
| |
| for.cond1.preheader: ; preds = %for.end9, %entry |
| br label %for.cond4.preheader |
| |
| for.cond4.preheader: ; preds = %for.end, %for.cond1.preheader |
| %zext = zext i16 1 to i32 |
| br label %for.body6 |
| |
| for.cond4: ; preds = %for.body6 |
| %cmp5 = icmp ult i32 %inc, 2 |
| br i1 %cmp5, label %for.body6, label %for.end |
| |
| for.body6: ; preds = %for.cond4, %for.cond4.preheader |
| %iv = phi i32 [ 0, %for.cond4.preheader ], [ %inc, %for.cond4 ] |
| %0 = icmp eq i32 %iv, %zext |
| %inc = add nuw nsw i32 %iv, 1 |
| br i1 %0, label %return.loopexit, label %for.cond4 |
| |
| for.end: ; preds = %for.cond4 |
| br i1 false, label %for.cond4.preheader, label %for.end9 |
| |
| for.end9: ; preds = %for.end |
| %inc11 = add nuw nsw i32 0, 1 |
| br i1 false, label %for.cond1.preheader, label %return.loopexit3 |
| |
| return.loopexit: ; preds = %for.body6 |
| unreachable |
| |
| return.loopexit3: ; preds = %for.end9 |
| %inc11.lcssa = phi i32 [ %inc11, %for.end9 ] |
| br label %return |
| |
| return: ; preds = %return.loopexit3 |
| ret i32 %inc11.lcssa |
| } |
| |
| ; Same as test_01, but the instructions with the same SCEV have a non-constant |
| ; SCEV. |
| define i32 @test_02(i32 %x) { |
| ; CHECK-LABEL: @test_02( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label [[FOR_COND1_PREHEADER:%.*]] |
| ; CHECK: for.cond1.preheader: |
| ; CHECK-NEXT: br label [[FOR_COND4_PREHEADER:%.*]] |
| ; CHECK: for.cond4.preheader: |
| ; CHECK-NEXT: [[ZEXT:%.*]] = mul i32 [[X:%.*]], 1 |
| ; CHECK-NEXT: br label [[FOR_BODY6:%.*]] |
| ; CHECK: for.cond4: |
| ; CHECK-NEXT: [[CMP5:%.*]] = icmp ult i32 [[INC:%.*]], 2 |
| ; CHECK-NEXT: br i1 [[CMP5]], label [[FOR_BODY6]], label [[FOR_END:%.*]] |
| ; CHECK: for.body6: |
| ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[FOR_COND4_PREHEADER]] ], [ [[INC]], [[FOR_COND4:%.*]] ] |
| ; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[IV]], [[ZEXT]] |
| ; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[IV]], 1 |
| ; CHECK-NEXT: br i1 [[TMP0]], label [[RETURN_LOOPEXIT:%.*]], label [[FOR_COND4]] |
| ; CHECK: for.end: |
| ; CHECK-NEXT: br i1 false, label [[FOR_COND4_PREHEADER]], label [[FOR_END9:%.*]] |
| ; CHECK: for.end9: |
| ; CHECK-NEXT: [[INC11:%.*]] = add nuw nsw i32 0, [[X]] |
| ; CHECK-NEXT: br i1 false, label [[FOR_COND1_PREHEADER]], label [[RETURN_LOOPEXIT3:%.*]] |
| ; CHECK: return.loopexit: |
| ; CHECK-NEXT: unreachable |
| ; CHECK: return.loopexit3: |
| ; CHECK-NEXT: [[INC11_LCSSA:%.*]] = phi i32 [ [[INC11]], [[FOR_END9]] ] |
| ; CHECK-NEXT: br label [[RETURN:%.*]] |
| ; CHECK: return: |
| ; CHECK-NEXT: ret i32 [[INC11_LCSSA]] |
| ; |
| entry: |
| br label %for.cond1.preheader |
| |
| for.cond1.preheader: ; preds = %for.end9, %entry |
| br label %for.cond4.preheader |
| |
| for.cond4.preheader: ; preds = %for.end, %for.cond1.preheader |
| %zext = mul i32 %x, 1 |
| br label %for.body6 |
| |
| for.cond4: ; preds = %for.body6 |
| %cmp5 = icmp ult i32 %inc, 2 |
| br i1 %cmp5, label %for.body6, label %for.end |
| |
| for.body6: ; preds = %for.cond4, %for.cond4.preheader |
| %iv = phi i32 [ 0, %for.cond4.preheader ], [ %inc, %for.cond4 ] |
| %0 = icmp eq i32 %iv, %zext |
| %inc = add nuw nsw i32 %iv, 1 |
| br i1 %0, label %return.loopexit, label %for.cond4 |
| |
| for.end: ; preds = %for.cond4 |
| br i1 false, label %for.cond4.preheader, label %for.end9 |
| |
| for.end9: ; preds = %for.end |
| %inc11 = add nuw nsw i32 0, %x |
| br i1 false, label %for.cond1.preheader, label %return.loopexit3 |
| |
| return.loopexit: ; preds = %for.body6 |
| unreachable |
| |
| return.loopexit3: ; preds = %for.end9 |
| %inc11.lcssa = phi i32 [ %inc11, %for.end9 ] |
| br label %return |
| |
| return: ; preds = %return.loopexit3 |
| ret i32 %inc11.lcssa |
| } |