1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -objc-arc -S < %s | FileCheck %s
3
4declare i8* @llvm.objc.initWeak(i8**, i8*)
5declare i8* @llvm.objc.storeWeak(i8**, i8*)
6declare i8* @llvm.objc.loadWeak(i8**)
7declare void @llvm.objc.destroyWeak(i8**)
8declare i8* @llvm.objc.loadWeakRetained(i8**)
9declare void @llvm.objc.moveWeak(i8**, i8**)
10declare void @llvm.objc.copyWeak(i8**, i8**)
11
12; If the pointer-to-weak-pointer is null, it's undefined behavior.
13
14define void @test0(i8* %p, i8** %q) {
15; CHECK-LABEL: @test0(
16; CHECK-NEXT:  entry:
17; CHECK-NEXT:    store i1 true, i1* undef, align 1
18; CHECK-NEXT:    store i1 true, i1* undef, align 1
19; CHECK-NEXT:    store i1 true, i1* undef, align 1
20; CHECK-NEXT:    store i1 true, i1* undef, align 1
21; CHECK-NEXT:    store i1 true, i1* undef, align 1
22; CHECK-NEXT:    store i1 true, i1* undef, align 1
23; CHECK-NEXT:    store i1 true, i1* undef, align 1
24; CHECK-NEXT:    store i1 true, i1* undef, align 1
25; CHECK-NEXT:    store i1 true, i1* undef, align 1
26; CHECK-NEXT:    store i1 true, i1* undef, align 1
27; CHECK-NEXT:    store i1 true, i1* undef, align 1
28; CHECK-NEXT:    store i1 true, i1* undef, align 1
29; CHECK-NEXT:    store i1 true, i1* undef, align 1
30; CHECK-NEXT:    store i1 true, i1* undef, align 1
31; CHECK-NEXT:    store i1 true, i1* undef, align 1
32; CHECK-NEXT:    store i1 true, i1* undef, align 1
33; CHECK-NEXT:    store i1 true, i1* undef, align 1
34; CHECK-NEXT:    store i1 true, i1* undef, align 1
35; CHECK-NEXT:    ret void
36;
37entry:
38  call i8* @llvm.objc.storeWeak(i8** null, i8* %p)
39  call i8* @llvm.objc.storeWeak(i8** undef, i8* %p)
40  call i8* @llvm.objc.loadWeakRetained(i8** null)
41  call i8* @llvm.objc.loadWeakRetained(i8** undef)
42  call i8* @llvm.objc.loadWeak(i8** null)
43  call i8* @llvm.objc.loadWeak(i8** undef)
44  call i8* @llvm.objc.initWeak(i8** null, i8* %p)
45  call i8* @llvm.objc.initWeak(i8** undef, i8* %p)
46  call void @llvm.objc.destroyWeak(i8** null)
47  call void @llvm.objc.destroyWeak(i8** undef)
48
49  call void @llvm.objc.copyWeak(i8** null, i8** %q)
50  call void @llvm.objc.copyWeak(i8** undef, i8** %q)
51  call void @llvm.objc.copyWeak(i8** %q, i8** null)
52  call void @llvm.objc.copyWeak(i8** %q, i8** undef)
53
54  call void @llvm.objc.moveWeak(i8** null, i8** %q)
55  call void @llvm.objc.moveWeak(i8** undef, i8** %q)
56  call void @llvm.objc.moveWeak(i8** %q, i8** null)
57  call void @llvm.objc.moveWeak(i8** %q, i8** undef)
58
59  ret void
60}
61