44 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=licm < %s | FileCheck %s3 4; The %val.ptr load might alias the %pos.ptr load/stores, but it's still5; fine to promote the load as long as the store is retained.6define i32 @test(ptr %ary, i64 %len) {7; CHECK-LABEL: @test(8; CHECK-NEXT: entry:9; CHECK-NEXT: [[POS_PTR:%.*]] = getelementptr i8, ptr [[ARY:%.*]], i64 3210; CHECK-NEXT: [[POS_PTR_PROMOTED:%.*]] = load i64, ptr [[POS_PTR]], align 411; CHECK-NEXT: br label [[LOOP:%.*]]12; CHECK: loop:13; CHECK-NEXT: [[POS_NEXT1:%.*]] = phi i64 [ [[POS_PTR_PROMOTED]], [[ENTRY:%.*]] ], [ [[POS_NEXT:%.*]], [[LOOP]] ]14; CHECK-NEXT: [[ACCUM:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[ACCUM_NEXT:%.*]], [[LOOP]] ]15; CHECK-NEXT: [[POS_NEXT]] = add i64 [[POS_NEXT1]], 116; CHECK-NEXT: store i64 [[POS_NEXT]], ptr [[POS_PTR]], align 417; CHECK-NEXT: [[VAL_PTR:%.*]] = getelementptr i32, ptr [[ARY]], i64 [[POS_NEXT1]]18; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr [[VAL_PTR]], align 419; CHECK-NEXT: [[ACCUM_NEXT]] = add i32 [[ACCUM]], [[VAL]]20; CHECK-NEXT: [[EXIT_COND:%.*]] = icmp ult i64 [[POS_NEXT1]], [[LEN:%.*]]21; CHECK-NEXT: br i1 [[EXIT_COND]], label [[LOOP]], label [[EXIT:%.*]]22; CHECK: exit:23; CHECK-NEXT: [[ACCUM_LCSSA:%.*]] = phi i32 [ [[ACCUM]], [[LOOP]] ]24; CHECK-NEXT: ret i32 [[ACCUM_LCSSA]]25;26entry:27 %pos.ptr = getelementptr i8, ptr %ary, i64 3228 br label %loop29 30loop:31 %accum = phi i32 [ 0, %entry ], [ %accum.next, %loop ]32 %pos = load i64, ptr %pos.ptr33 %pos.next = add i64 %pos, 134 store i64 %pos.next, ptr %pos.ptr35 %val.ptr = getelementptr i32, ptr %ary, i64 %pos36 %val = load i32, ptr %val.ptr37 %accum.next = add i32 %accum, %val38 %exit.cond = icmp ult i64 %pos, %len39 br i1 %exit.cond, label %loop, label %exit40 41exit:42 ret i32 %accum43}44