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