1 ; RUN: opt < %s -slsr -gvn -S | FileCheck %s
3 target datalayout = "e-i64:64-v16:16-v32:32-n16:32:64"
5 define void @slsr1(i32 %b, i32 %s) {
11 call void @foo(i32 %mul0)
15 %mul1 = mul i32 %b1, %s
16 call void @foo(i32 %mul1)
20 %mul2 = mul i32 %b2, %s
21 call void @foo(i32 %mul2)
29 ; foo((a + 1) * (b + 1))
30 define void @slsr2(i32 %a, i32 %b) {
31 ; CHECK-LABEL: @slsr2(
34 %mul0 = mul i32 %a, %b
37 %mul1 = mul i32 %a1, %b
38 %mul2 = mul i32 %a, %b1
39 %mul3 = mul i32 %a1, %b1
41 call void @foo(i32 %mul0)
42 call void @foo(i32 %mul1)
43 call void @foo(i32 %mul2)
44 call void @foo(i32 %mul3)
49 ; The bump is a multiple of the stride.
57 ; mul1 = mul0 + bump; // GVN ensures mul1 and mul2 use the same bump.
59 define void @slsr3(i32 %b, i32 %s) {
60 ; CHECK-LABEL: @slsr3(
61 %mul0 = mul i32 %b, %s
63 call void @foo(i32 %mul0)
66 %mul1 = mul i32 %b1, %s
67 ; CHECK: [[BUMP:%[a-zA-Z0-9]+]] = shl i32 %s, 1
68 ; CHECK: %mul1 = add i32 %mul0, [[BUMP]]
69 call void @foo(i32 %mul1)
72 %mul2 = mul i32 %b2, %s
73 ; CHECK: %mul2 = add i32 %mul1, [[BUMP]]
74 call void @foo(i32 %mul2)
79 ; Do not rewrite a candidate if its potential basis does not dominate it.
84 define void @not_dominate(i1 %cond, i32 %a, i32 %b) {
85 ; CHECK-LABEL: @not_dominate(
88 br i1 %cond, label %then, label %merge
91 %mul0 = mul i32 %a, %b
92 ; CHECK: %mul0 = mul i32 %a, %b
93 call void @foo(i32 %mul0)
97 %mul1 = mul i32 %a1, %b
98 ; CHECK: %mul1 = mul i32 %a1, %b
99 call void @foo(i32 %mul1)
103 declare void @foo(i32)