xref: /aosp_15_r20/external/llvm/test/Transforms/Inline/ptr-diff.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -inline < %s -S -o - -inline-threshold=10 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workertarget datalayout = "p:32:32-p1:64:64-p2:16:16-n16:32:64"
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine i32 @outer1() {
6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer1(
7*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call
8*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker  %ptr = alloca i32
11*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds i32, i32* %ptr, i32 0
12*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds i32, i32* %ptr, i32 42
13*9880d681SAndroid Build Coastguard Worker  %result = call i32 @inner1(i32* %ptr1, i32* %ptr2)
14*9880d681SAndroid Build Coastguard Worker  ret i32 %result
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine i32 @inner1(i32* %begin, i32* %end) {
18*9880d681SAndroid Build Coastguard Worker  %begin.i = ptrtoint i32* %begin to i32
19*9880d681SAndroid Build Coastguard Worker  %end.i = ptrtoint i32* %end to i32
20*9880d681SAndroid Build Coastguard Worker  %distance = sub i32 %end.i, %begin.i
21*9880d681SAndroid Build Coastguard Worker  %icmp = icmp sle i32 %distance, 42
22*9880d681SAndroid Build Coastguard Worker  br i1 %icmp, label %then, label %else
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerthen:
25*9880d681SAndroid Build Coastguard Worker  ret i32 3
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerelse:
28*9880d681SAndroid Build Coastguard Worker  %t = load i32, i32* %begin
29*9880d681SAndroid Build Coastguard Worker  ret i32 %t
30*9880d681SAndroid Build Coastguard Worker}
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerdefine i32 @outer2(i32* %ptr) {
33*9880d681SAndroid Build Coastguard Worker; Test that an inbounds GEP disables this -- it isn't safe in general as
34*9880d681SAndroid Build Coastguard Worker; wrapping changes the behavior of lessthan and greaterthan comparisons.
35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer2(
36*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @inner2
37*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr i32, i32* %ptr, i32 0
40*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i32, i32* %ptr, i32 42
41*9880d681SAndroid Build Coastguard Worker  %result = call i32 @inner2(i32* %ptr1, i32* %ptr2)
42*9880d681SAndroid Build Coastguard Worker  ret i32 %result
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdefine i32 @inner2(i32* %begin, i32* %end) {
46*9880d681SAndroid Build Coastguard Worker  %begin.i = ptrtoint i32* %begin to i32
47*9880d681SAndroid Build Coastguard Worker  %end.i = ptrtoint i32* %end to i32
48*9880d681SAndroid Build Coastguard Worker  %distance = sub i32 %end.i, %begin.i
49*9880d681SAndroid Build Coastguard Worker  %icmp = icmp sle i32 %distance, 42
50*9880d681SAndroid Build Coastguard Worker  br i1 %icmp, label %then, label %else
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Workerthen:
53*9880d681SAndroid Build Coastguard Worker  ret i32 3
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Workerelse:
56*9880d681SAndroid Build Coastguard Worker  %t = load i32, i32* %begin
57*9880d681SAndroid Build Coastguard Worker  ret i32 %t
58*9880d681SAndroid Build Coastguard Worker}
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker; The inttoptrs are free since it is a smaller integer to a larger
61*9880d681SAndroid Build Coastguard Worker; pointer size
62*9880d681SAndroid Build Coastguard Workerdefine i32 @inttoptr_free_cost(i32 %a, i32 %b, i32 %c) {
63*9880d681SAndroid Build Coastguard Worker  %p1 = inttoptr i32 %a to i32 addrspace(1)*
64*9880d681SAndroid Build Coastguard Worker  %p2 = inttoptr i32 %b to i32 addrspace(1)*
65*9880d681SAndroid Build Coastguard Worker  %p3 = inttoptr i32 %c to i32 addrspace(1)*
66*9880d681SAndroid Build Coastguard Worker  %t1 = load i32, i32 addrspace(1)* %p1
67*9880d681SAndroid Build Coastguard Worker  %t2 = load i32, i32 addrspace(1)* %p2
68*9880d681SAndroid Build Coastguard Worker  %t3 = load i32, i32 addrspace(1)* %p3
69*9880d681SAndroid Build Coastguard Worker  %s = add i32 %t1, %t2
70*9880d681SAndroid Build Coastguard Worker  %s1 = add i32 %s, %t3
71*9880d681SAndroid Build Coastguard Worker  ret i32 %s1
72*9880d681SAndroid Build Coastguard Worker}
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerdefine i32 @inttoptr_free_cost_user(i32 %begin, i32 %end) {
75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @inttoptr_free_cost_user(
76*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call
77*9880d681SAndroid Build Coastguard Worker  %x = call i32 @inttoptr_free_cost(i32 %begin, i32 %end, i32 9)
78*9880d681SAndroid Build Coastguard Worker  ret i32 %x
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker; The inttoptrs have a cost since it is a larger integer to a smaller
82*9880d681SAndroid Build Coastguard Worker; pointer size
83*9880d681SAndroid Build Coastguard Workerdefine i32 @inttoptr_cost_smaller_ptr(i32 %a, i32 %b, i32 %c) {
84*9880d681SAndroid Build Coastguard Worker  %p1 = inttoptr i32 %a to i32 addrspace(2)*
85*9880d681SAndroid Build Coastguard Worker  %p2 = inttoptr i32 %b to i32 addrspace(2)*
86*9880d681SAndroid Build Coastguard Worker  %p3 = inttoptr i32 %c to i32 addrspace(2)*
87*9880d681SAndroid Build Coastguard Worker  %t1 = load i32, i32 addrspace(2)* %p1
88*9880d681SAndroid Build Coastguard Worker  %t2 = load i32, i32 addrspace(2)* %p2
89*9880d681SAndroid Build Coastguard Worker  %t3 = load i32, i32 addrspace(2)* %p3
90*9880d681SAndroid Build Coastguard Worker  %s = add i32 %t1, %t2
91*9880d681SAndroid Build Coastguard Worker  %s1 = add i32 %s, %t3
92*9880d681SAndroid Build Coastguard Worker  ret i32 %s1
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerdefine i32 @inttoptr_cost_smaller_ptr_user(i32 %begin, i32 %end) {
96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @inttoptr_cost_smaller_ptr_user(
97*9880d681SAndroid Build Coastguard Worker; CHECK: call
98*9880d681SAndroid Build Coastguard Worker  %x = call i32 @inttoptr_cost_smaller_ptr(i32 %begin, i32 %end, i32 9)
99*9880d681SAndroid Build Coastguard Worker  ret i32 %x
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker
102