1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -loop-reduce -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; LSR shouldn't consider %t8 to be an interesting user of %t6, and it 4*9880d681SAndroid Build Coastguard Worker; should be able to form pretty GEPs. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine void @Z4() nounwind { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @Z4( 10*9880d681SAndroid Build Coastguard Workerbb: 11*9880d681SAndroid Build Coastguard Worker br label %bb3 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %bb3 14*9880d681SAndroid Build Coastguard Worker br i1 undef, label %bb10, label %bb2 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerbb2: ; preds = %bb1 17*9880d681SAndroid Build Coastguard Worker %t = add i64 %t4, 1 ; <i64> [#uses=1] 18*9880d681SAndroid Build Coastguard Worker br label %bb3 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerbb3: ; preds = %bb2, %bb 21*9880d681SAndroid Build Coastguard Worker %t4 = phi i64 [ %t, %bb2 ], [ 0, %bb ] ; <i64> [#uses=3] 22*9880d681SAndroid Build Coastguard Worker br label %bb1 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker; CHECK: bb10: 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %t7 = icmp eq i64 %t4, 0 26*9880d681SAndroid Build Coastguard Worker; Host %t2 computation outside the loop. 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SCEVGEP:%[^ ]+]] = getelementptr i8, i8* undef, i64 %t4 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %bb14 29*9880d681SAndroid Build Coastguard Workerbb10: ; preds = %bb9 30*9880d681SAndroid Build Coastguard Worker %t7 = icmp eq i64 %t4, 0 ; <i1> [#uses=1] 31*9880d681SAndroid Build Coastguard Worker %t3 = add i64 %t4, 16 ; <i64> [#uses=1] 32*9880d681SAndroid Build Coastguard Worker br label %bb14 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; CHECK: bb14: 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i8 undef, i8* [[SCEVGEP]] 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %t6 = load float*, float** undef 37*9880d681SAndroid Build Coastguard Worker; Fold %t3's add within the address. 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SCEVGEP1:%[^ ]+]] = getelementptr float, float* %t6, i64 4 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SCEVGEP2:%[^ ]+]] = bitcast float* [[SCEVGEP1]] to i8* 40*9880d681SAndroid Build Coastguard Worker; Use the induction variable (%t4) to access the right element 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADDRESS:%[^ ]+]] = getelementptr i8, i8* [[SCEVGEP2]], i64 %t4 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i8 undef, i8* [[ADDRESS]] 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %bb14 44*9880d681SAndroid Build Coastguard Workerbb14: ; preds = %bb14, %bb10 45*9880d681SAndroid Build Coastguard Worker %t2 = getelementptr inbounds i8, i8* undef, i64 %t4 ; <i8*> [#uses=1] 46*9880d681SAndroid Build Coastguard Worker store i8 undef, i8* %t2 47*9880d681SAndroid Build Coastguard Worker %t6 = load float*, float** undef 48*9880d681SAndroid Build Coastguard Worker %t8 = bitcast float* %t6 to i8* ; <i8*> [#uses=1] 49*9880d681SAndroid Build Coastguard Worker %t9 = getelementptr inbounds i8, i8* %t8, i64 %t3 ; <i8*> [#uses=1] 50*9880d681SAndroid Build Coastguard Worker store i8 undef, i8* %t9 51*9880d681SAndroid Build Coastguard Worker br label %bb14 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdefine fastcc void @TransformLine() nounwind { 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @TransformLine( 56*9880d681SAndroid Build Coastguard Workerbb: 57*9880d681SAndroid Build Coastguard Worker br label %loop0 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker; CHECK: loop0: 60*9880d681SAndroid Build Coastguard Worker; Induction variable is initialized to -2. 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PHIIV:%[^ ]+]] = phi i32 [ [[IVNEXT:%[^ ]+]], %loop0 ], [ -2, %bb ] 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[IVNEXT]] = add nuw nsw i32 [[PHIIV]], 1 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 false, label %loop0, label %bb0 64*9880d681SAndroid Build Coastguard Workerloop0: ; preds = %loop0, %bb 65*9880d681SAndroid Build Coastguard Worker %i0 = phi i32 [ %i0.next, %loop0 ], [ 0, %bb ] ; <i32> [#uses=2] 66*9880d681SAndroid Build Coastguard Worker %i0.next = add i32 %i0, 1 ; <i32> [#uses=1] 67*9880d681SAndroid Build Coastguard Worker br i1 false, label %loop0, label %bb0 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerbb0: ; preds = %loop0 70*9880d681SAndroid Build Coastguard Worker br label %loop1 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; CHECK: loop1: 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %i1 = phi i32 [ 0, %bb0 ], [ %i1.next, %bb5 ] 74*9880d681SAndroid Build Coastguard Worker; IVNEXT covers the uses of %i0 and %t0. 75*9880d681SAndroid Build Coastguard Worker; Therefore, %t0 has been removed. 76*9880d681SAndroid Build Coastguard Worker; The critical edge has been split. 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 false, label %bb2, label %[[LOOP1BB6:.+]] 78*9880d681SAndroid Build Coastguard Workerloop1: ; preds = %bb5, %bb0 79*9880d681SAndroid Build Coastguard Worker %i1 = phi i32 [ 0, %bb0 ], [ %i1.next, %bb5 ] ; <i32> [#uses=4] 80*9880d681SAndroid Build Coastguard Worker %t0 = add i32 %i0, %i1 ; <i32> [#uses=1] 81*9880d681SAndroid Build Coastguard Worker br i1 false, label %bb2, label %bb6 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker; CHECK: bb2: 84*9880d681SAndroid Build Coastguard Worker; Critical edge split. 85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 true, label %[[BB2BB6:[^,]+]], label %bb5 86*9880d681SAndroid Build Coastguard Workerbb2: ; preds = %loop1 87*9880d681SAndroid Build Coastguard Worker br i1 true, label %bb6, label %bb5 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker; CHECK: bb5: 90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %i1.next = add i32 %i1, 1 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 true, label %[[BB5BB6:[^,]+]], label %loop1 92*9880d681SAndroid Build Coastguard Workerbb5: ; preds = %bb2 93*9880d681SAndroid Build Coastguard Worker %i1.next = add i32 %i1, 1 ; <i32> [#uses=1] 94*9880d681SAndroid Build Coastguard Worker br i1 true, label %bb6, label %loop1 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker; bb5 to bb6 split basic block. 97*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB5BB6]]: 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[INITIALVAL:%[^ ]+]] = add i32 [[IVNEXT]], %i1.next 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %[[SPLITTOBB6:.+]] 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; bb2 to bb6 split basic block. 102*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB2BB6]]: 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %[[SPLITTOBB6]] 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker; Split basic blocks to bb6. 106*9880d681SAndroid Build Coastguard Worker; CHECK: [[SPLITTOBB6]]: 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[INITP8:%[^ ]+]] = phi i32 [ [[INITIALVAL]], %[[BB5BB6]] ], [ undef, %[[BB2BB6]] ] 108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[INITP9:%[^ ]+]] = phi i32 [ undef, %[[BB5BB6]] ], [ %i1, %[[BB2BB6]] ] 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %bb6 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker; CHECK: [[LOOP1BB6]]: 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %bb6 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker; CHECK: bb6: 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %p8 = phi i32 [ undef, %[[LOOP1BB6]] ], [ [[INITP8]], %[[SPLITTOBB6]] ] 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %p9 = phi i32 [ %i1, %[[LOOP1BB6]] ], [ [[INITP9]], %[[SPLITTOBB6]] ] 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable 118*9880d681SAndroid Build Coastguard Workerbb6: ; preds = %bb5, %bb2, %loop1 119*9880d681SAndroid Build Coastguard Worker %p8 = phi i32 [ %t0, %bb5 ], [ undef, %loop1 ], [ undef, %bb2 ] ; <i32> [#uses=0] 120*9880d681SAndroid Build Coastguard Worker %p9 = phi i32 [ undef, %bb5 ], [ %i1, %loop1 ], [ %i1, %bb2 ] ; <i32> [#uses=0] 121*9880d681SAndroid Build Coastguard Worker unreachable 122*9880d681SAndroid Build Coastguard Worker} 123