| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: opt < %s -passes="loop-reduce" -S | FileCheck %s | |
| target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" | |
| target triple = "x86_64-unknown-linux-gnu" | |
| define i64 @testDuplicateLCSSA(ptr nocapture %a, i64 signext %m, i64 signext %n) { | |
| ; CHECK-LABEL: define i64 @testDuplicateLCSSA( | |
| ; CHECK-SAME: ptr captures(none) [[A:%.*]], i64 signext [[M:%.*]], i64 signext [[N:%.*]]) { | |
| ; CHECK-NEXT: [[ENTRY:.*]]: | |
| ; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[N]], [[M]] | |
| ; CHECK-NEXT: br label %[[FOR_BODY:.*]] | |
| ; CHECK: [[FOR_BODY]]: | |
| ; CHECK-NEXT: [[LSR_IV1:%.*]] = phi ptr [ [[SCEVGEP:%.*]], %[[FOR_BODY]] ], [ [[A]], %[[ENTRY]] ] | |
| ; CHECK-NEXT: [[LSR_IV:%.*]] = phi i64 [ [[LSR_IV_NEXT:%.*]], %[[FOR_BODY]] ], [ [[N]], %[[ENTRY]] ] | |
| ; CHECK-NEXT: store i64 55, ptr [[LSR_IV1]], align 4 | |
| ; CHECK-NEXT: [[LSR_IV_NEXT]] = add i64 [[LSR_IV]], -1 | |
| ; CHECK-NEXT: [[SCEVGEP]] = getelementptr i8, ptr [[LSR_IV1]], i64 8 | |
| ; CHECK-NEXT: [[I_CMP_NOT:%.*]] = icmp eq i64 [[LSR_IV_NEXT]], 0 | |
| ; CHECK-NEXT: br i1 [[I_CMP_NOT]], label %[[FOR_EXIT:.*]], label %[[FOR_BODY]] | |
| ; CHECK: [[FOR_EXIT]]: | |
| ; CHECK-NEXT: br label %[[EXIT:.*]] | |
| ; CHECK: [[EXIT]]: | |
| ; CHECK-NEXT: [[INDVARS_IV_UNR1:%.*]] = phi i64 [ [[TMP0]], %[[FOR_EXIT]] ] | |
| ; CHECK-NEXT: [[INDVARS_IV_UNR2:%.*]] = phi i64 [ [[TMP0]], %[[FOR_EXIT]] ] | |
| ; CHECK-NEXT: [[SUM:%.*]] = add i64 [[INDVARS_IV_UNR1]], [[INDVARS_IV_UNR2]] | |
| ; CHECK-NEXT: ret i64 [[SUM]] | |
| ; | |
| entry: | |
| br label %for.body | |
| for.body: | |
| %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %for.body ], [ %m, %entry ] | |
| %i = phi i64 [ %i.next, %for.body ], [ 0, %entry ] | |
| %uglygep = getelementptr i64, ptr %a, i64 %i | |
| store i64 55, ptr %uglygep, align 4 | |
| %indvars.iv.next.prol = add nuw nsw i64 %indvars.iv.prol, 1 | |
| %i.next = add i64 %i, 1 | |
| %i.cmp.not = icmp eq i64 %i.next, %n | |
| br i1 %i.cmp.not, label %for.exit, label %for.body | |
| for.exit: | |
| %indvars.iv.next.prol.lcssa1 = phi i64 [ %indvars.iv.next.prol, %for.body ] | |
| %indvars.iv.next.prol.lcssa2 = phi i64 [ %indvars.iv.next.prol, %for.body ] | |
| br label %exit | |
| exit: | |
| %indvars.iv.unr1 = phi i64 [ %indvars.iv.next.prol.lcssa1, %for.exit ] | |
| %indvars.iv.unr2 = phi i64 [ %indvars.iv.next.prol.lcssa2, %for.exit ] | |
| %sum = add i64 %indvars.iv.unr1, %indvars.iv.unr2 | |
| ret i64 %sum | |
| } |