blob: 4ce6f1a79fbfb94c0f5aaf75ac1f889dd7154a08 [file] [log] [blame]
; RUN: opt < %s -loop-reduce -lsr-filter-same-scaled-reg=true -mtriple=x86_64-unknown-linux-gnu -S | FileCheck %s
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
%struct.ham = type { i8, i8, [5 x i32], i64, i64, i64 }
@global = external local_unnamed_addr global %struct.ham, align 8
define void @foo() local_unnamed_addr {
bb:
%tmp = load i64, i64* getelementptr inbounds (%struct.ham, %struct.ham* @global, i64 0, i32 3), align 8
%tmp1 = and i64 %tmp, 1792
%tmp2 = load i64, i64* getelementptr inbounds (%struct.ham, %struct.ham* @global, i64 0, i32 4), align 8
%tmp3 = add i64 %tmp1, %tmp2
%tmp4 = load i8*, i8** null, align 8
%tmp5 = getelementptr inbounds i8, i8* %tmp4, i64 0
%tmp6 = sub i64 0, %tmp3
%tmp7 = getelementptr inbounds i8, i8* %tmp4, i64 %tmp6
%tmp8 = inttoptr i64 0 to i8*
br label %bb9
; Without filtering non-optimal formulae with the same ScaledReg and Scale, the strategy
; to narrow LSR search space by picking winner reg will generate only one lsr.iv and
; unoptimal result.
; CHECK-LABEL: @foo(
; CHECK: bb9:
; CHECK-NEXT: = phi i8*
; CHECK-NEXT: = phi i8*
bb9: ; preds = %bb12, %bb
%tmp10 = phi i8* [ %tmp7, %bb ], [ %tmp16, %bb12 ]
%tmp11 = phi i8* [ %tmp8, %bb ], [ %tmp17, %bb12 ]
br i1 false, label %bb18, label %bb12
bb12: ; preds = %bb9
%tmp13 = getelementptr inbounds i8, i8* %tmp10, i64 8
%tmp14 = bitcast i8* %tmp13 to i64*
%tmp15 = load i64, i64* %tmp14, align 1
%tmp16 = getelementptr inbounds i8, i8* %tmp10, i64 16
%tmp17 = getelementptr inbounds i8, i8* %tmp11, i64 16
br label %bb9
bb18: ; preds = %bb9
%tmp19 = icmp ugt i8* %tmp11, null
%tmp20 = getelementptr inbounds i8, i8* %tmp10, i64 8
%tmp21 = getelementptr inbounds i8, i8* %tmp11, i64 8
%tmp22 = select i1 %tmp19, i8* %tmp10, i8* %tmp20
%tmp23 = select i1 %tmp19, i8* %tmp11, i8* %tmp21
br label %bb24
bb24: ; preds = %bb24, %bb18
%tmp25 = phi i8* [ %tmp27, %bb24 ], [ %tmp22, %bb18 ]
%tmp26 = phi i8* [ %tmp29, %bb24 ], [ %tmp23, %bb18 ]
%tmp27 = getelementptr inbounds i8, i8* %tmp25, i64 1
%tmp28 = load i8, i8* %tmp25, align 1
%tmp29 = getelementptr inbounds i8, i8* %tmp26, i64 1
store i8 %tmp28, i8* %tmp26, align 1
%tmp30 = icmp eq i8* %tmp29, %tmp5
br label %bb24
}