[PATCH] D153004: [LSR] Consider post-inc form when creating extends/truncates.
Peixin Qiao via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 28 18:22:51 PDT 2023
peixin added a comment.
In D153004#4451053 <https://reviews.llvm.org/D153004#4451053>, @peixin wrote:
> There may be one more case which this patch does not capture? Check the following input:
>
> target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
> target triple = "aarch64-unknown-linux-gnu"
>
> @c = internal global i32 0, align 4
> @g = dso_local local_unnamed_addr global ptr @c, align 8
> @h = dso_local global i8 0, align 4
> @j = dso_local local_unnamed_addr global ptr @h, align 8
> @b = internal unnamed_addr global i32 0, align 4
> @e = dso_local local_unnamed_addr global i16 0, align 4
> @f = dso_local local_unnamed_addr global i64 0, align 8
> @l = dso_local local_unnamed_addr global i64 0, align 8
> @i = dso_local local_unnamed_addr global i64 0, align 8
> @.str = private unnamed_addr constant [5 x i8] c"%lX\0A\00", align 1
> @a = dso_local local_unnamed_addr global i8 0, align 1
>
> ; Function Attrs: mustprogress nofree norecurse nosync nounwind readnone willreturn uwtable
> define dso_local void @n(ptr nocapture noundef %0) {
> ret void
> }
>
> ; Function Attrs: nofree nounwind uwtable
> define dso_local i32 @main() {
> %1 = load ptr, ptr @g, align 8
> %2 = load i64, ptr @f, align 8
> br label %3
>
> 3: ; preds = %0, %18
> %4 = phi i32 [ 0, %0 ], [ %19, %18 ]
> %5 = phi i64 [ %2, %0 ], [ %15, %18 ]
> br label %6
>
> 6: ; preds = %3, %6
> %7 = phi i32 [ 1, %3 ], [ %10, %6 ]
> %8 = phi i64 [ %5, %3 ], [ %9, %6 ]
> %9 = add nsw i64 %8, 1
> %10 = add nsw i32 %7, -1
> %11 = icmp sgt i32 %7, 0
> br i1 %11, label %6, label %12
>
> 12: ; preds = %6, %12
> %13 = phi i32 [ %16, %12 ], [ 1, %6 ]
> %14 = phi i64 [ %15, %12 ], [ %9, %6 ]
> %15 = add nsw i64 %14, 1
> %16 = add nsw i32 %13, -1
> %17 = icmp sgt i32 %13, 0
> br i1 %17, label %12, label %18
>
> 18: ; preds = %12
> %19 = add nuw nsw i32 %4, 1
> %20 = icmp eq i32 %19, 8
> br i1 %20, label %21, label %3
>
> 21: ; preds = %18
> store i32 %16, ptr @b, align 4
> store i32 0, ptr %1, align 4
> %22 = zext i32 %13 to i64
> store i16 -1, ptr @e, align 4
> store i64 %15, ptr @f, align 8
> store i64 %14, ptr @l, align 8
> store i64 %22, ptr @i, align 8
> %23 = urem i32 %16, 53
> %24 = trunc i32 %23 to i8
> %25 = load ptr, ptr @j, align 8
> store i8 %24, ptr %25, align 1
> %26 = load i8, ptr @h, align 4
> %27 = xor i8 %26, 5
> %28 = zext i8 %27 to i64
> %29 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull @.str, i64 noundef %28)
> ret i32 0
> }
>
> declare noundef i32 @printf(ptr nocapture noundef readonly, ...)
>
> $ opt -loop-reduce reduced.ll -S -o out.ll && clang out.ll -o a.out && ./a.out
> B
> $ clang reduced.ll -o a.out && ./a.out
> 2C
@fhahn Do you plan to fix this? If not, I will file one ticket for this.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D153004/new/
https://reviews.llvm.org/D153004
More information about the llvm-commits
mailing list