annotate llvm/test/Feature/OperandBundles/basic-aa-argmemonly.ll @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents 1d019706d866
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1 ; RUN: opt -S -basic-aa -gvn < %s | FileCheck %s
150
anatofuz
parents:
diff changeset
2
anatofuz
parents:
diff changeset
3 declare void @argmemonly_function(i32 *) argmemonly
anatofuz
parents:
diff changeset
4
anatofuz
parents:
diff changeset
5 define i32 @test0(i32* %P, i32* noalias %P2) {
anatofuz
parents:
diff changeset
6 ; CHECK-LABEL: @test0(
anatofuz
parents:
diff changeset
7 %v1 = load i32, i32* %P
anatofuz
parents:
diff changeset
8 ; CHECK: %v1 = load i32, i32* %P
anatofuz
parents:
diff changeset
9 call void @argmemonly_function(i32* %P2) [ "tag"() ]
anatofuz
parents:
diff changeset
10 ; CHECK: call void @argmemonly_function(
anatofuz
parents:
diff changeset
11 %v2 = load i32, i32* %P
anatofuz
parents:
diff changeset
12 ; CHECK: %v2 = load i32, i32* %P
anatofuz
parents:
diff changeset
13 %diff = sub i32 %v1, %v2
anatofuz
parents:
diff changeset
14 ; CHECK: %diff = sub i32 %v1, %v2
anatofuz
parents:
diff changeset
15 ret i32 %diff
anatofuz
parents:
diff changeset
16 ; CHECK: ret i32 %diff
anatofuz
parents:
diff changeset
17 }
anatofuz
parents:
diff changeset
18
anatofuz
parents:
diff changeset
19 define i32 @test1(i32* %P, i32* noalias %P2) {
anatofuz
parents:
diff changeset
20 ; CHECK-LABEL: @test1(
anatofuz
parents:
diff changeset
21 %v1 = load i32, i32* %P
anatofuz
parents:
diff changeset
22 call void @argmemonly_function(i32* %P2) argmemonly [ "tag"() ]
anatofuz
parents:
diff changeset
23 ; CHECK: call void @argmemonly_function(
anatofuz
parents:
diff changeset
24 %v2 = load i32, i32* %P
anatofuz
parents:
diff changeset
25 %diff = sub i32 %v1, %v2
anatofuz
parents:
diff changeset
26 ret i32 %diff
anatofuz
parents:
diff changeset
27 ; CHECK: ret i32 0
anatofuz
parents:
diff changeset
28 }
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 define i32 @test2(i32* %P, i32* noalias %P2) {
anatofuz
parents:
diff changeset
31 ; Note: in this test we //can// GVN %v1 and %v2 into one value in theory. Calls
anatofuz
parents:
diff changeset
32 ; with deopt operand bundles are not argmemonly because they *read* the entire
anatofuz
parents:
diff changeset
33 ; heap, but they don't write to any location in the heap if the callee does not
anatofuz
parents:
diff changeset
34 ; deoptimize the caller. This fact, combined with the fact that
anatofuz
parents:
diff changeset
35 ; @argmemonly_function is, well, an argmemonly function, can be used to conclude
anatofuz
parents:
diff changeset
36 ; that %P is not written to at the callsite. However LLVM currently cannot
anatofuz
parents:
diff changeset
37 ; describe the "does not write to non-args, and reads the entire heap" effect on
anatofuz
parents:
diff changeset
38 ; a callsite.
anatofuz
parents:
diff changeset
39
anatofuz
parents:
diff changeset
40 ; CHECK-LABEL: @test2(
anatofuz
parents:
diff changeset
41 %v1 = load i32, i32* %P
anatofuz
parents:
diff changeset
42 ; CHECK: %v1 = load i32, i32* %P
anatofuz
parents:
diff changeset
43 call void @argmemonly_function(i32* %P2) [ "deopt"() ]
anatofuz
parents:
diff changeset
44 ; CHECK: call void @argmemonly_function(
anatofuz
parents:
diff changeset
45 %v2 = load i32, i32* %P
anatofuz
parents:
diff changeset
46 ; CHECK: %v2 = load i32, i32* %P
anatofuz
parents:
diff changeset
47 %diff = sub i32 %v1, %v2
anatofuz
parents:
diff changeset
48 ; CHECK: %diff = sub i32 %v1, %v2
anatofuz
parents:
diff changeset
49 ret i32 %diff
anatofuz
parents:
diff changeset
50 ; CHECK: ret i32 %diff
anatofuz
parents:
diff changeset
51 }