xref: /llvm-project/llvm/test/Analysis/BasicAA/deoptimize.ll (revision 303c308e452c703c3d47940383ded3b2d3eefd56)
1b81d5baaSArthur Eubanks; RUN: opt < %s -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
2887c7660SArtur Pilipenkotarget datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:64-v128:32:128-a0:0:32-n32"
3887c7660SArtur Pilipenko
4b4b6d637SEvgeniy Brevnov@G1 = external global i32
5b4b6d637SEvgeniy Brevnov
6*303c308eSNikita Popovdeclare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1)
7*303c308eSNikita Popovdeclare void @llvm.memmove.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1)
8887c7660SArtur Pilipenkodeclare void @llvm.experimental.deoptimize.void(...)
9887c7660SArtur Pilipenkodeclare void @unknown_but_readonly() readonly
10887c7660SArtur Pilipenko
11*303c308eSNikita Popovdefine void @test1(ptr %p) {
12*303c308eSNikita Popov  load i8, ptr %p
13887c7660SArtur Pilipenko  call void(...) @llvm.experimental.deoptimize.void() [ "deopt"() ]
14887c7660SArtur Pilipenko  ret void
15887c7660SArtur Pilipenko
16887c7660SArtur Pilipenko; CHECK-LABEL: Function: test1:
17887c7660SArtur Pilipenko; CHECK:  Just Ref: Ptr: i8* %p <-> call void (...) @llvm.experimental.deoptimize.isVoid() [ "deopt"() ]
18887c7660SArtur Pilipenko}
19b4b6d637SEvgeniy Brevnov
20b4b6d637SEvgeniy Brevnov; By specification calls with deopt bundles reads through all operands and entire heap.
21b4b6d637SEvgeniy Brevnov; Check that global G1 is reported as Ref by memcpy/memmove calls.
22b4b6d637SEvgeniy Brevnovdefine i32 @test_memcpy_with_deopt() {
23b4b6d637SEvgeniy Brevnov; CHECK-LABEL: Function: test_memcpy_with_deopt:
24*303c308eSNikita Popov; CHECK: Both ModRef:  Ptr: i8* %A	<->  call void @llvm.memcpy.p0.p0.i64(ptr %A, ptr %B, i64 -1, i1 false) [ "deopt"() ]
25*303c308eSNikita Popov; CHECK: Just Ref:  Ptr: i8* %B	<->  call void @llvm.memcpy.p0.p0.i64(ptr %A, ptr %B, i64 -1, i1 false) [ "deopt"() ]
26*303c308eSNikita Popov; CHECK: Just Ref:  Ptr: i32* @G1	<->  call void @llvm.memcpy.p0.p0.i64(ptr %A, ptr %B, i64 -1, i1 false) [ "deopt"() ]
27b4b6d637SEvgeniy Brevnov
28b4b6d637SEvgeniy Brevnov  %A = alloca i8
29b4b6d637SEvgeniy Brevnov  %B = alloca i8
30*303c308eSNikita Popov  load i8, ptr %A
31*303c308eSNikita Popov  load i8, ptr %B
32b4b6d637SEvgeniy Brevnov
33*303c308eSNikita Popov  store i32 2, ptr @G1  ;; Not referenced by semantics of memcpy but still may be read due to "deopt"
34b4b6d637SEvgeniy Brevnov
35*303c308eSNikita Popov  call void @llvm.memcpy.p0.p0.i64(ptr %A, ptr %B, i64 -1, i1 false) [ "deopt"() ]
36b4b6d637SEvgeniy Brevnov
37*303c308eSNikita Popov  %C = load i32, ptr @G1
38b4b6d637SEvgeniy Brevnov  ret i32 %C
39b4b6d637SEvgeniy Brevnov}
40b4b6d637SEvgeniy Brevnov
41b4b6d637SEvgeniy Brevnovdefine i32 @test_memmove_with_deopt() {
42b4b6d637SEvgeniy Brevnov; CHECK-LABEL: Function: test_memmove_with_deopt:
43*303c308eSNikita Popov; CHECK: Both ModRef:  Ptr: i8* %A	<->  call void @llvm.memmove.p0.p0.i64(ptr %A, ptr %B, i64 -1, i1 false) [ "deopt"() ]
44*303c308eSNikita Popov; CHECK: Just Ref:  Ptr: i8* %B	<->  call void @llvm.memmove.p0.p0.i64(ptr %A, ptr %B, i64 -1, i1 false) [ "deopt"() ]
45*303c308eSNikita Popov; CHECK: Just Ref:  Ptr: i32* @G1	<->  call void @llvm.memmove.p0.p0.i64(ptr %A, ptr %B, i64 -1, i1 false) [ "deopt"() ]
46b4b6d637SEvgeniy Brevnov
47b4b6d637SEvgeniy Brevnov  %A = alloca i8
48b4b6d637SEvgeniy Brevnov  %B = alloca i8
49*303c308eSNikita Popov  load i8, ptr %A
50*303c308eSNikita Popov  load i8, ptr %B
51b4b6d637SEvgeniy Brevnov
52*303c308eSNikita Popov  store i32 2, ptr @G1  ;; Not referenced by semantics of memcpy but still may be read due to "deopt"
53b4b6d637SEvgeniy Brevnov
54*303c308eSNikita Popov  call void @llvm.memmove.p0.p0.i64(ptr %A, ptr %B, i64 -1, i1 false) [ "deopt"() ]
55b4b6d637SEvgeniy Brevnov
56*303c308eSNikita Popov  %C = load i32, ptr @G1
57b4b6d637SEvgeniy Brevnov  ret i32 %C
58b4b6d637SEvgeniy Brevnov}
59