Compiler projects using llvm
; 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
}