1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -slsr -gvn -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-i64:64-v16:16-v32:32-n16:32:64" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine void @shl(i32 %b, i32 %s) { 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @shl( 7*9880d681SAndroid Build Coastguard Worker %1 = add i32 %b, %s 8*9880d681SAndroid Build Coastguard Worker; [[BASIS:%[a-zA-Z0-9]+]] = add i32 %b, %s 9*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %1) 10*9880d681SAndroid Build Coastguard Worker %s2 = shl i32 %s, 1 11*9880d681SAndroid Build Coastguard Worker %2 = add i32 %b, %s2 12*9880d681SAndroid Build Coastguard Worker; add i32 [[BASIS]], %s 13*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %2) 14*9880d681SAndroid Build Coastguard Worker ret void 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdefine void @stride_is_2s(i32 %b, i32 %s) { 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @stride_is_2s( 19*9880d681SAndroid Build Coastguard Worker %s2 = shl i32 %s, 1 20*9880d681SAndroid Build Coastguard Worker; CHECK: %s2 = shl i32 %s, 1 21*9880d681SAndroid Build Coastguard Worker %1 = add i32 %b, %s2 22*9880d681SAndroid Build Coastguard Worker; CHECK: [[t1:%[a-zA-Z0-9]+]] = add i32 %b, %s2 23*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %1) 24*9880d681SAndroid Build Coastguard Worker %s4 = shl i32 %s, 2 25*9880d681SAndroid Build Coastguard Worker %2 = add i32 %b, %s4 26*9880d681SAndroid Build Coastguard Worker; CHECK: [[t2:%[a-zA-Z0-9]+]] = add i32 [[t1]], %s2 27*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %2) 28*9880d681SAndroid Build Coastguard Worker %s6 = mul i32 %s, 6 29*9880d681SAndroid Build Coastguard Worker %3 = add i32 %b, %s6 30*9880d681SAndroid Build Coastguard Worker; CHECK: add i32 [[t2]], %s2 31*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %3) 32*9880d681SAndroid Build Coastguard Worker ret void 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdefine void @stride_is_3s(i32 %b, i32 %s) { 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @stride_is_3s( 37*9880d681SAndroid Build Coastguard Worker %1 = add i32 %s, %b 38*9880d681SAndroid Build Coastguard Worker; CHECK: [[t1:%[a-zA-Z0-9]+]] = add i32 %s, %b 39*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %1) 40*9880d681SAndroid Build Coastguard Worker %s4 = shl i32 %s, 2 41*9880d681SAndroid Build Coastguard Worker %2 = add i32 %s4, %b 42*9880d681SAndroid Build Coastguard Worker; CHECK: [[bump:%[a-zA-Z0-9]+]] = mul i32 %s, 3 43*9880d681SAndroid Build Coastguard Worker; CHECK: [[t2:%[a-zA-Z0-9]+]] = add i32 [[t1]], [[bump]] 44*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %2) 45*9880d681SAndroid Build Coastguard Worker %s7 = mul i32 %s, 7 46*9880d681SAndroid Build Coastguard Worker %3 = add i32 %s7, %b 47*9880d681SAndroid Build Coastguard Worker; CHECK: add i32 [[t2]], [[bump]] 48*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %3) 49*9880d681SAndroid Build Coastguard Worker ret void 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; foo(b + 6 * s); 53*9880d681SAndroid Build Coastguard Worker; foo(b + 4 * s); 54*9880d681SAndroid Build Coastguard Worker; foo(b + 2 * s); 55*9880d681SAndroid Build Coastguard Worker; => 56*9880d681SAndroid Build Coastguard Worker; t1 = b + 6 * s; 57*9880d681SAndroid Build Coastguard Worker; foo(t1); 58*9880d681SAndroid Build Coastguard Worker; s2 = 2 * s; 59*9880d681SAndroid Build Coastguard Worker; t2 = t1 - s2; 60*9880d681SAndroid Build Coastguard Worker; foo(t2); 61*9880d681SAndroid Build Coastguard Worker; t3 = t2 - s2; 62*9880d681SAndroid Build Coastguard Worker; foo(t3); 63*9880d681SAndroid Build Coastguard Workerdefine void @stride_is_minus_2s(i32 %b, i32 %s) { 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @stride_is_minus_2s( 65*9880d681SAndroid Build Coastguard Worker %s6 = mul i32 %s, 6 66*9880d681SAndroid Build Coastguard Worker %1 = add i32 %b, %s6 67*9880d681SAndroid Build Coastguard Worker; CHECK: [[t1:%[a-zA-Z0-9]+]] = add i32 %b, %s6 68*9880d681SAndroid Build Coastguard Worker; CHECK: call void @foo(i32 [[t1]]) 69*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %1) 70*9880d681SAndroid Build Coastguard Worker %s4 = shl i32 %s, 2 71*9880d681SAndroid Build Coastguard Worker %2 = add i32 %b, %s4 72*9880d681SAndroid Build Coastguard Worker; CHECK: [[bump:%[a-zA-Z0-9]+]] = shl i32 %s, 1 73*9880d681SAndroid Build Coastguard Worker; CHECK: [[t2:%[a-zA-Z0-9]+]] = sub i32 [[t1]], [[bump]] 74*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %2) 75*9880d681SAndroid Build Coastguard Worker; CHECK: call void @foo(i32 [[t2]]) 76*9880d681SAndroid Build Coastguard Worker %s2 = shl i32 %s, 1 77*9880d681SAndroid Build Coastguard Worker %3 = add i32 %b, %s2 78*9880d681SAndroid Build Coastguard Worker; CHECK: [[t3:%[a-zA-Z0-9]+]] = sub i32 [[t2]], [[bump]] 79*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %3) 80*9880d681SAndroid Build Coastguard Worker; CHECK: call void @foo(i32 [[t3]]) 81*9880d681SAndroid Build Coastguard Worker ret void 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker; t = b + (s << 3); 85*9880d681SAndroid Build Coastguard Worker; foo(t); 86*9880d681SAndroid Build Coastguard Worker; foo(b + s); 87*9880d681SAndroid Build Coastguard Worker; 88*9880d681SAndroid Build Coastguard Worker; do not rewrite b + s to t - 7 * s because the latter is more complicated. 89*9880d681SAndroid Build Coastguard Workerdefine void @simple_enough(i32 %b, i32 %s) { 90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @simple_enough( 91*9880d681SAndroid Build Coastguard Worker %s8 = shl i32 %s, 3 92*9880d681SAndroid Build Coastguard Worker %1 = add i32 %b, %s8 93*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %1) 94*9880d681SAndroid Build Coastguard Worker %2 = add i32 %b, %s 95*9880d681SAndroid Build Coastguard Worker; CHECK: [[t:%[a-zA-Z0-9]+]] = add i32 %b, %s{{$}} 96*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %2) 97*9880d681SAndroid Build Coastguard Worker; CHECK: call void @foo(i32 [[t]]) 98*9880d681SAndroid Build Coastguard Worker ret void 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerdefine void @slsr_strided_add_128bit(i128 %b, i128 %s) { 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @slsr_strided_add_128bit( 103*9880d681SAndroid Build Coastguard Worker %s125 = shl i128 %s, 125 104*9880d681SAndroid Build Coastguard Worker %s126 = shl i128 %s, 126 105*9880d681SAndroid Build Coastguard Worker %1 = add i128 %b, %s125 106*9880d681SAndroid Build Coastguard Worker; CHECK: [[t1:%[a-zA-Z0-9]+]] = add i128 %b, %s125 107*9880d681SAndroid Build Coastguard Worker call void @bar(i128 %1) 108*9880d681SAndroid Build Coastguard Worker %2 = add i128 %b, %s126 109*9880d681SAndroid Build Coastguard Worker; CHECK: [[t2:%[a-zA-Z0-9]+]] = add i128 [[t1]], %s125 110*9880d681SAndroid Build Coastguard Worker call void @bar(i128 %2) 111*9880d681SAndroid Build Coastguard Worker; CHECK: call void @bar(i128 [[t2]]) 112*9880d681SAndroid Build Coastguard Worker ret void 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerdeclare void @foo(i32) 116*9880d681SAndroid Build Coastguard Workerdeclare void @bar(i128) 117