| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
| ; RUN: opt -p indvars -S %s | FileCheck %s |
| |
| target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32" |
| target triple = "arm64-apple-macosx15.0.0" |
| |
| define i32 @guards_applied_to_add_rec(ptr %dst) { |
| ; CHECK-LABEL: define i32 @guards_applied_to_add_rec( |
| ; CHECK-SAME: ptr [[DST:%.*]]) { |
| ; CHECK-NEXT: [[ENTRY:.*]]: |
| ; CHECK-NEXT: br label %[[OUTER_HEADER:.*]] |
| ; CHECK: [[OUTER_HEADER]]: |
| ; CHECK-NEXT: [[OUTER_IV_0:%.*]] = phi i32 [ 2, %[[ENTRY]] ], [ [[OUTER_IV_0_NEXT:%.*]], %[[OUTER_LATCH:.*]] ] |
| ; CHECK-NEXT: [[OUTER_IV_1:%.*]] = phi i32 [ 1, %[[ENTRY]] ], [ [[OUTER_IV_0]], %[[OUTER_LATCH]] ] |
| ; CHECK-NEXT: [[SHR28:%.*]] = lshr i32 [[OUTER_IV_1]], 1 |
| ; CHECK-NEXT: [[PRE:%.*]] = icmp samesign ult i32 [[OUTER_IV_1]], 2 |
| ; CHECK-NEXT: br i1 [[PRE]], label %[[OUTER_LATCH]], label %[[INNER_PREHEADER:.*]] |
| ; CHECK: [[INNER_PREHEADER]]: |
| ; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[SHR28]] to i64 |
| ; CHECK-NEXT: br label %[[INNER:.*]] |
| ; CHECK: [[INNER]]: |
| ; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, %[[INNER_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], %[[INNER]] ] |
| ; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr i32, ptr [[DST]], i64 [[INDVARS_IV]] |
| ; CHECK-NEXT: [[TMP1:%.*]] = trunc nuw nsw i64 [[INDVARS_IV]] to i32 |
| ; CHECK-NEXT: store i32 [[TMP1]], ptr [[GEP_DST]], align 4 |
| ; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1 |
| ; CHECK-NEXT: [[CMP29:%.*]] = icmp samesign ult i64 [[INDVARS_IV_NEXT]], [[TMP0]] |
| ; CHECK-NEXT: br i1 [[CMP29]], label %[[INNER]], label %[[OUTER_LATCH_LOOPEXIT:.*]] |
| ; CHECK: [[OUTER_LATCH_LOOPEXIT]]: |
| ; CHECK-NEXT: br label %[[OUTER_LATCH]] |
| ; CHECK: [[OUTER_LATCH]]: |
| ; CHECK-NEXT: [[OUTER_IV_0_NEXT]] = add nuw i32 [[OUTER_IV_0]], 1 |
| ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[OUTER_IV_0_NEXT]], -2147483647 |
| ; CHECK-NEXT: br i1 [[EXITCOND]], label %[[OUTER_HEADER]], label %[[EXIT:.*]] |
| ; CHECK: [[EXIT]]: |
| ; CHECK-NEXT: ret i32 0 |
| ; |
| entry: |
| br label %outer.header |
| |
| outer.header: |
| %outer.iv.0 = phi i32 [ 2, %entry ], [ %outer.iv.0.next, %outer.latch ] |
| %outer.iv.1 = phi i32 [ 1, %entry ], [ %outer.iv.0, %outer.latch ] |
| %shr28 = lshr i32 %outer.iv.1, 1 |
| %pre = icmp samesign ult i32 %outer.iv.1, 2 |
| br i1 %pre, label %outer.latch, label %inner |
| |
| inner: |
| %inner.iv = phi i32 [ 0, %outer.header ], [ %inc, %inner ] |
| %ext.iv = zext nneg i32 %inner.iv to i64 |
| %gep.dst = getelementptr i32, ptr %dst, i64 %ext.iv |
| store i32 %inner.iv, ptr %gep.dst, align 4 |
| %inc = add nuw nsw i32 %inner.iv, 1 |
| %cmp29 = icmp samesign ult i32 %inc, %shr28 |
| br i1 %cmp29, label %inner, label %outer.latch |
| |
| outer.latch: |
| %outer.iv.0.next = add i32 %outer.iv.0, 1 |
| %outer.ec = icmp sgt i32 %outer.iv.0, 0 |
| br i1 %outer.ec, label %outer.header, label %exit |
| |
| exit: |
| ret i32 0 |
| } |