; 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 }