xref: /aosp_15_r20/external/llvm/test/Transforms/LoopIdiom/basic-address-space.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -basicaa -loop-idiom < %s -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:32:32:32-p1:64:64:64-p2:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:32-n8:16:32:64"
4*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-apple-darwin10.0.0"
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; Two dimensional nested loop should be promoted to one big memset.
7*9880d681SAndroid Build Coastguard Workerdefine void @test10(i8 addrspace(2)* %X) nounwind ssp {
8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10(
9*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @llvm.memset.p2i8.i16(i8 addrspace(2)* %X, i8 0, i16 10000, i32 1, i1 false)
11*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store
12*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerentry:
15*9880d681SAndroid Build Coastguard Worker  br label %bb.nph
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerbb.nph:                                           ; preds = %entry, %for.inc10
18*9880d681SAndroid Build Coastguard Worker  %i.04 = phi i16 [ 0, %entry ], [ %inc12, %for.inc10 ]
19*9880d681SAndroid Build Coastguard Worker  br label %for.body5
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerfor.body5:                                        ; preds = %for.body5, %bb.nph
22*9880d681SAndroid Build Coastguard Worker  %j.02 = phi i16 [ 0, %bb.nph ], [ %inc, %for.body5 ]
23*9880d681SAndroid Build Coastguard Worker  %mul = mul nsw i16 %i.04, 100
24*9880d681SAndroid Build Coastguard Worker  %add = add nsw i16 %j.02, %mul
25*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i8, i8 addrspace(2)* %X, i16 %add
26*9880d681SAndroid Build Coastguard Worker  store i8 0, i8 addrspace(2)* %arrayidx, align 1
27*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i16 %j.02, 1
28*9880d681SAndroid Build Coastguard Worker  %cmp4 = icmp eq i16 %inc, 100
29*9880d681SAndroid Build Coastguard Worker  br i1 %cmp4, label %for.inc10, label %for.body5
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerfor.inc10:                                        ; preds = %for.body5
32*9880d681SAndroid Build Coastguard Worker  %inc12 = add nsw i16 %i.04, 1
33*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i16 %inc12, 100
34*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.end13, label %bb.nph
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Workerfor.end13:                                        ; preds = %for.inc10
37*9880d681SAndroid Build Coastguard Worker  ret void
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerdefine void @test11_pattern(i32 addrspace(2)* nocapture %P) nounwind ssp {
41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11_pattern(
42*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: memset_pattern
43*9880d681SAndroid Build Coastguard Workerentry:
44*9880d681SAndroid Build Coastguard Worker  br label %for.body
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
47*9880d681SAndroid Build Coastguard Worker  %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %for.body ]
48*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr i32, i32 addrspace(2)* %P, i64 %indvar
49*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 addrspace(2)* %arrayidx, align 4
50*9880d681SAndroid Build Coastguard Worker  %indvar.next = add i64 %indvar, 1
51*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i64 %indvar.next, 10000
52*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.end, label %for.body
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
55*9880d681SAndroid Build Coastguard Worker  ret void
56*9880d681SAndroid Build Coastguard Worker}
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker; PR9815 - This is a partial overlap case that cannot be safely transformed
59*9880d681SAndroid Build Coastguard Worker; into a memcpy.
60*9880d681SAndroid Build Coastguard Worker@g_50 = addrspace(2) global [7 x i32] [i32 0, i32 0, i32 0, i32 0, i32 1, i32 0, i32 0], align 16
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerdefine i32 @test14() nounwind {
64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14(
65*9880d681SAndroid Build Coastguard Worker; CHECK: for.body:
66*9880d681SAndroid Build Coastguard Worker; CHECK: load i32
67*9880d681SAndroid Build Coastguard Worker; CHECK: store i32
68*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %cmp
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerentry:
71*9880d681SAndroid Build Coastguard Worker  br label %for.body
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.inc, %for.body.lr.ph
74*9880d681SAndroid Build Coastguard Worker  %tmp5 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
75*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %tmp5, 4
76*9880d681SAndroid Build Coastguard Worker  %idxprom = sext i32 %add to i64
77*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds [7 x i32], [7 x i32] addrspace(2)* @g_50, i32 0, i64 %idxprom
78*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i32, i32 addrspace(2)* %arrayidx, align 4
79*9880d681SAndroid Build Coastguard Worker  %add4 = add nsw i32 %tmp5, 5
80*9880d681SAndroid Build Coastguard Worker  %idxprom5 = sext i32 %add4 to i64
81*9880d681SAndroid Build Coastguard Worker  %arrayidx6 = getelementptr inbounds [7 x i32], [7 x i32] addrspace(2)* @g_50, i32 0, i64 %idxprom5
82*9880d681SAndroid Build Coastguard Worker  store i32 %tmp2, i32 addrspace(2)* %arrayidx6, align 4
83*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i32 %tmp5, 1
84*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %inc, 2
85*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.end
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.inc
88*9880d681SAndroid Build Coastguard Worker  %tmp8 = load i32, i32 addrspace(2)* getelementptr inbounds ([7 x i32], [7 x i32] addrspace(2)* @g_50, i32 0, i64 6), align 4
89*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp8
90*9880d681SAndroid Build Coastguard Worker}
91*9880d681SAndroid Build Coastguard Worker
92