blob: 823f1e417a3d43f402cc103956c0dfd80e10c598 [file] [edit]
; 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
}