xref: /llvm-project/llvm/test/Transforms/GVNSink/int_sideeffect.ll (revision abe3c5ac19e455d8a6df3120fa5e7a6e5f9005a6)
1; RUN: opt -S < %s -passes=gvn-sink | FileCheck %s
2
3declare void @llvm.sideeffect()
4
5; GVN sinking across a @llvm.sideeffect.
6
7; CHECK-LABEL: scalarsSinking
8; CHECK-NOT: fmul
9; CHECK: = phi
10; CHECK: = fmul
11define float @scalarsSinking(float %d, float %m, float %a, i1 %cmp) {
12entry:
13  br i1 %cmp, label %if.then, label %if.else
14
15if.then:
16  call void @llvm.sideeffect()
17  %sub = fsub float %m, %a
18  %mul0 = fmul float %sub, %d
19  br label %if.end
20
21if.else:
22  %add = fadd float %m, %a
23  %mul1 = fmul float %add, %d
24  br label %if.end
25
26if.end:
27  %phi = phi float [ %mul0, %if.then ], [ %mul1, %if.else ]
28  ret float %phi
29}
30
31; CHECK-LABEL: scalarsSinkingReverse
32; CHECK-NOT: fmul
33; CHECK: = phi
34; CHECK: = fmul
35define float @scalarsSinkingReverse(float %d, float %m, float %a, i1 %cmp) {
36; This test is just a reverse(graph mirror) of the test
37; above to ensure GVNSink doesn't depend on the order of branches.
38entry:
39  br i1 %cmp, label %if.then, label %if.else
40
41if.then:
42  %add = fadd float %m, %a
43  %mul1 = fmul float %add, %d
44  br label %if.end
45
46if.else:
47  call void @llvm.sideeffect()
48  %sub = fsub float %m, %a
49  %mul0 = fmul float %sub, %d
50  br label %if.end
51
52if.end:
53  %phi = phi float [ %mul1, %if.then ], [ %mul0, %if.else ]
54  ret float %phi
55}
56
57