xref: /aosp_15_r20/external/llvm/test/Transforms/StraightLineStrengthReduce/slsr-add.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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