1; RUN: opt -passes=sroa -S < %s | FileCheck %s
2
3; This test checks that SROA does not introduce ptrtoint and inttoptr
4; casts from and to non-integral pointers.  The "ni:4" bit in the
5; datalayout states that pointers of address space 4 are to be
6; considered "non-integral".
7
8target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:4"
9target triple = "x86_64-unknown-linux-gnu"
10
11define void @f0(i1 %alwaysFalse, i64 %val) {
12; CHECK-LABEL: @f0(
13; CHECK-NOT: inttoptr
14; CHECK-NOT: ptrtoint
15entry:
16  %loc = alloca i64
17  store i64 %val, ptr %loc
18  br i1 %alwaysFalse, label %neverTaken, label %alwaysTaken
19
20neverTaken:
21  %ptr = load ptr addrspace(4), ptr %loc
22  store i8 5, ptr addrspace(4) %ptr
23  ret void
24
25alwaysTaken:
26  ret void
27}
28
29define i64 @f1(i1 %alwaysFalse, ptr addrspace(4) %val) {
30; CHECK-LABEL: @f1(
31; CHECK-NOT: inttoptr
32; CHECK-NOT: ptrtoint
33entry:
34  %loc = alloca ptr addrspace(4)
35  store ptr addrspace(4) %val, ptr %loc
36  br i1 %alwaysFalse, label %neverTaken, label %alwaysTaken
37
38neverTaken:
39  %int = load i64, ptr %loc
40  ret i64 %int
41
42alwaysTaken:
43  ret i64 42
44}
45
46define ptr addrspace(4) @memset(i1 %alwaysFalse) {
47; CHECK-LABEL: @memset(
48; CHECK-NOT: inttoptr
49; CHECK-NOT: ptrtoint
50entry:
51  %x = alloca ptr addrspace(4)
52  call void @llvm.memset.p0.i64(ptr align 8 %x, i8 5, i64 16, i1 false)
53  br i1 %alwaysFalse, label %neverTaken, label %alwaysTaken
54
55neverTaken:
56  %x.field.ld.0 = load ptr addrspace(4), ptr %x
57  ret ptr addrspace(4) %x.field.ld.0
58
59alwaysTaken:
60  ret ptr addrspace(4) null
61}
62
63;; TODO: This one demonstrates a missed oppurtunity.  The only known bit
64;; pattern for a non-integral bit pattern is that null is zero.  As such
65;; we could do SROA and replace the memset w/a null store.  This will
66;; usually be gotten by instcombine.
67define ptr addrspace(4) @memset_null(i1 %alwaysFalse) {
68; CHECK-LABEL: @memset_null(
69; CHECK-NOT: inttoptr
70; CHECK-NOT: ptrtoint
71entry:
72  %x = alloca ptr addrspace(4)
73  call void @llvm.memset.p0.i64(ptr align 8 %x, i8 0, i64 16, i1 false)
74  br i1 %alwaysFalse, label %neverTaken, label %alwaysTaken
75
76neverTaken:
77  %x.field.ld.0 = load ptr addrspace(4), ptr %x
78  ret ptr addrspace(4) %x.field.ld.0
79
80alwaysTaken:
81  ret ptr addrspace(4) null
82}
83
84%union.anon = type { ptr }
85
86; CHECK-LABEL: @f2(
87; CHECK-NOT: ptr2int
88; CHECK-NOT: int2ptr
89define ptr@f2(ptr addrspace(4) %p) {
90  %1 = alloca %union.anon, align 8
91  store ptr addrspace(4) %p, ptr %1, align 8
92  %2 = load ptr, ptr %1, align 8
93  ret ptr %2
94}
95
96declare void @llvm.memset.p0.i64(ptr, i8, i64, i1)
97