diff options
author | Florian Hahn <flo@fhahn.com> | 2025-07-29 21:25:52 +0100 |
---|---|---|
committer | Florian Hahn <flo@fhahn.com> | 2025-07-29 21:25:52 +0100 |
commit | 446b3de5b6adf8c9241d0bfd2fe3b99cd4e858eb (patch) | |
tree | 4d17c61ebda0675579d7d619556a9443250d20d8 /llvm | |
parent | fe93f75cc6b20361c273deea625c6201156a07c9 (diff) | |
download | llvm-446b3de5b6adf8c9241d0bfd2fe3b99cd4e858eb.zip llvm-446b3de5b6adf8c9241d0bfd2fe3b99cd4e858eb.tar.gz llvm-446b3de5b6adf8c9241d0bfd2fe3b99cd4e858eb.tar.bz2 |
[IndVars] Add tests showing missed folding opportunity.
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/test/Transforms/IndVarSimplify/AArch64/fold-ext-add.ll | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/llvm/test/Transforms/IndVarSimplify/AArch64/fold-ext-add.ll b/llvm/test/Transforms/IndVarSimplify/AArch64/fold-ext-add.ll new file mode 100644 index 0000000..48b92e9 --- /dev/null +++ b/llvm/test/Transforms/IndVarSimplify/AArch64/fold-ext-add.ll @@ -0,0 +1,55 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p indvars -S %s | FileCheck %s + +target triple = "arm64-apple-macosx15.0.0" + +declare i1 @cond() + +define void @pred_mip_12(ptr %dst, ptr %src, i32 %n, i64 %offset) { +; CHECK-LABEL: define void @pred_mip_12( +; CHECK-SAME: ptr [[DST:%.*]], ptr [[SRC:%.*]], i32 [[N:%.*]], i64 [[OFFSET:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*]]: +; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[N]], i32 1) +; CHECK-NEXT: br label %[[OUTER_LOOP:.*]] +; CHECK: [[OUTER_LOOP_LOOPEXIT:.*]]: +; CHECK-NEXT: [[PTR_IV_NEXT_LCSSA:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], %[[INNER_LOOP:.*]] ] +; CHECK-NEXT: br label %[[OUTER_LOOP]] +; CHECK: [[OUTER_LOOP]]: +; CHECK-NEXT: [[OUTER_PTR:%.*]] = phi ptr [ [[SRC]], %[[ENTRY]] ], [ [[PTR_IV_NEXT_LCSSA]], %[[OUTER_LOOP_LOOPEXIT]] ] +; CHECK-NEXT: [[C:%.*]] = call i1 @cond() +; CHECK-NEXT: br i1 [[C]], label %[[INNER_LOOP_PREHEADER:.*]], label %[[EXIT:.*]] +; CHECK: [[INNER_LOOP_PREHEADER]]: +; CHECK-NEXT: br label %[[INNER_LOOP]] +; CHECK: [[INNER_LOOP]]: +; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], %[[INNER_LOOP]] ], [ 0, %[[INNER_LOOP_PREHEADER]] ] +; CHECK-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT]], %[[INNER_LOOP]] ], [ [[SRC]], %[[INNER_LOOP_PREHEADER]] ] +; CHECK-NEXT: [[L:%.*]] = load i8, ptr [[OUTER_PTR]], align 1 +; CHECK-NEXT: [[PTR_IV_NEXT]] = getelementptr i8, ptr [[PTR_IV]], i64 [[OFFSET]] +; CHECK-NEXT: store i8 [[L]], ptr [[DST]], align 2 +; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 +; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[IV_NEXT]], [[SMAX]] +; CHECK-NEXT: br i1 [[EXITCOND]], label %[[INNER_LOOP]], label %[[OUTER_LOOP_LOOPEXIT]] +; CHECK: [[EXIT]]: +; CHECK-NEXT: ret void +; +entry: + br label %outer.loop + +outer.loop: + %outer.ptr = phi ptr [ %src, %entry ], [ %ptr.iv.next, %inner.loop ] + %c = call i1 @cond() + br i1 %c, label %inner.loop, label %exit + +inner.loop: + %iv = phi i32 [ 0, %outer.loop ], [ %iv.next, %inner.loop ] + %ptr.iv = phi ptr [ %src, %outer.loop ], [ %ptr.iv.next, %inner.loop ] + %l = load i8, ptr %outer.ptr, align 1 + %ptr.iv.next = getelementptr i8, ptr %ptr.iv, i64 %offset + store i8 %l, ptr %dst, align 2 + %iv.next = add i32 %iv, 1 + %ec = icmp slt i32 %iv.next, %n + br i1 %ec, label %inner.loop, label %outer.loop + +exit: + ret void +} |