1; RUN: opt -S -basic-aa -loop-idiom < %s | FileCheck %s
2
3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:4"
4target triple = "x86_64-unknown-linux-gnu"
5
6; LIR'ing stores of pointers with address space 3 is fine, since
7; they're integral pointers.
8define void @f_0(i8 addrspace(3)** %ptr) {
9; CHECK-LABEL: @f_0(
10; CHECK: call{{.*}}memset
11
12entry:
13  br label %for.body
14
15for.body:
16  %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %for.body ]
17  %arrayidx = getelementptr i8 addrspace(3)*, i8 addrspace(3)** %ptr, i64 %indvar
18  store i8 addrspace(3)* null, i8 addrspace(3)** %arrayidx, align 4
19  %indvar.next = add i64 %indvar, 1
20  %exitcond = icmp eq i64 %indvar.next, 10000
21  br i1 %exitcond, label %for.end, label %for.body
22
23for.end:
24  ret void
25}
26
27; LIR'ing stores of pointers with address space 4 is not ok, since
28; they're non-integral pointers. NOTE: Zero is special value which
29; can be converted, if we add said handling here, convert this test
30; to use any non-null pointer.
31define void @f_1(i8 addrspace(4)** %ptr) {
32; CHECK-LABEL: @f_1(
33; CHECK-NOT: call{{.*}}memset
34
35entry:
36  br label %for.body
37
38for.body:
39  %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %for.body ]
40  %arrayidx = getelementptr i8 addrspace(4)*, i8 addrspace(4)** %ptr, i64 %indvar
41  store i8 addrspace(4)* null, i8 addrspace(4)** %arrayidx, align 4
42  %indvar.next = add i64 %indvar, 1
43  %exitcond = icmp eq i64 %indvar.next, 10000
44  br i1 %exitcond, label %for.end, label %for.body
45
46for.end:
47  ret void
48}
49
50; Same as previous case, but vector of non-integral pointers
51define void @f_2(i8 addrspace(4)** %ptr) {
52; CHECK-LABEL: @f_2(
53; CHECK-NOT: call{{.*}}memset
54entry:
55  br label %for.body
56
57for.body:
58  %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %for.body ]
59  %arrayidx = getelementptr i8 addrspace(4)*, i8 addrspace(4)** %ptr, i64 %indvar
60  %addr = bitcast i8 addrspace(4)** %arrayidx to <2 x i8 addrspace(4)*>*
61  store <2 x i8 addrspace(4)*> zeroinitializer, <2 x i8 addrspace(4)*>* %addr, align 8
62  %indvar.next = add i64 %indvar, 2
63  %exitcond = icmp eq i64 %indvar.next, 10000
64  br i1 %exitcond, label %for.end, label %for.body
65
66for.end:
67  ret void
68}
69