xref: /aosp_15_r20/external/llvm/test/Transforms/CodeGenPrepare/builtin-condition.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -codegenprepare -S  < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; #include<stdlib.h>
4*9880d681SAndroid Build Coastguard Worker; #define STATIC_BUF_SIZE 10
5*9880d681SAndroid Build Coastguard Worker; #define LARGER_BUF_SIZE 30
6*9880d681SAndroid Build Coastguard Worker;
7*9880d681SAndroid Build Coastguard Worker; size_t foo1(int flag) {
8*9880d681SAndroid Build Coastguard Worker;   char *cptr;
9*9880d681SAndroid Build Coastguard Worker;   char chararray[LARGER_BUF_SIZE];
10*9880d681SAndroid Build Coastguard Worker;   char chararray2[STATIC_BUF_SIZE];
11*9880d681SAndroid Build Coastguard Worker;   if(flag)
12*9880d681SAndroid Build Coastguard Worker;     cptr = chararray2;
13*9880d681SAndroid Build Coastguard Worker;    else
14*9880d681SAndroid Build Coastguard Worker;     cptr = chararray;
15*9880d681SAndroid Build Coastguard Worker;
16*9880d681SAndroid Build Coastguard Worker;   return  __builtin_object_size(cptr, 2);
17*9880d681SAndroid Build Coastguard Worker; }
18*9880d681SAndroid Build Coastguard Worker;
19*9880d681SAndroid Build Coastguard Worker; size_t foo2(int n) {
20*9880d681SAndroid Build Coastguard Worker;   char Small[10];
21*9880d681SAndroid Build Coastguard Worker;   char Large[20];
22*9880d681SAndroid Build Coastguard Worker;   char *Ptr = n ? Small : Large + 19;
23*9880d681SAndroid Build Coastguard Worker;   return __builtin_object_size(Ptr, 0);
24*9880d681SAndroid Build Coastguard Worker; }
25*9880d681SAndroid Build Coastguard Worker;
26*9880d681SAndroid Build Coastguard Worker; void foo() {
27*9880d681SAndroid Build Coastguard Worker;   size_t ret;
28*9880d681SAndroid Build Coastguard Worker;   size_t ret1;
29*9880d681SAndroid Build Coastguard Worker;   ret = foo1(0);
30*9880d681SAndroid Build Coastguard Worker;   ret1 = foo2(0);
31*9880d681SAndroid Build Coastguard Worker;   printf("\n%d %d\n", ret, ret1);
32*9880d681SAndroid Build Coastguard Worker; }
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
35*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-linux-gnu"
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker@.str = private unnamed_addr constant [8 x i8] c"\0A%d %d\0A\00", align 1
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdefine i64 @foo1(i32 %flag) {
40*9880d681SAndroid Build Coastguard Workerentry:
41*9880d681SAndroid Build Coastguard Worker  %chararray = alloca [30 x i8], align 16
42*9880d681SAndroid Build Coastguard Worker  %chararray2 = alloca [10 x i8], align 1
43*9880d681SAndroid Build Coastguard Worker  %0 = getelementptr inbounds [30 x i8], [30 x i8]* %chararray, i64 0, i64 0
44*9880d681SAndroid Build Coastguard Worker  call void @llvm.lifetime.start(i64 30, i8* %0)
45*9880d681SAndroid Build Coastguard Worker  %1 = getelementptr inbounds [10 x i8], [10 x i8]* %chararray2, i64 0, i64 0
46*9880d681SAndroid Build Coastguard Worker  call void @llvm.lifetime.start(i64 10, i8* %1)
47*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %flag, 0
48*9880d681SAndroid Build Coastguard Worker  %cptr.0 = select i1 %tobool, i8* %0, i8* %1
49*9880d681SAndroid Build Coastguard Worker  %2 = call i64 @llvm.objectsize.i64.p0i8(i8* %cptr.0, i1 true)
50*9880d681SAndroid Build Coastguard Worker  call void @llvm.lifetime.end(i64 10, i8* %1)
51*9880d681SAndroid Build Coastguard Worker  call void @llvm.lifetime.end(i64 30, i8* %0)
52*9880d681SAndroid Build Coastguard Worker  ret i64 %2
53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo1
54*9880d681SAndroid Build Coastguard Worker; CHECK:  ret i64 10
55*9880d681SAndroid Build Coastguard Worker}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.lifetime.start(i64, i8* nocapture)
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.objectsize.i64.p0i8(i8*, i1)
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.lifetime.end(i64, i8* nocapture)
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerdefine i64 @foo2(i32 %n) {
64*9880d681SAndroid Build Coastguard Workerentry:
65*9880d681SAndroid Build Coastguard Worker  %Small = alloca [10 x i8], align 1
66*9880d681SAndroid Build Coastguard Worker  %Large = alloca [20 x i8], align 16
67*9880d681SAndroid Build Coastguard Worker  %0 = getelementptr inbounds [10 x i8], [10 x i8]* %Small, i64 0, i64 0
68*9880d681SAndroid Build Coastguard Worker  call void @llvm.lifetime.start(i64 10, i8* %0)
69*9880d681SAndroid Build Coastguard Worker  %1 = getelementptr inbounds [20 x i8], [20 x i8]* %Large, i64 0, i64 0
70*9880d681SAndroid Build Coastguard Worker  call void @llvm.lifetime.start(i64 20, i8* %1)
71*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %n, 0
72*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds [20 x i8], [20 x i8]* %Large, i64 0, i64 19
73*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %tobool, i8* %0, i8* %add.ptr
74*9880d681SAndroid Build Coastguard Worker  %2 = call i64 @llvm.objectsize.i64.p0i8(i8* %cond, i1 false)
75*9880d681SAndroid Build Coastguard Worker  call void @llvm.lifetime.end(i64 20, i8* %1)
76*9880d681SAndroid Build Coastguard Worker  call void @llvm.lifetime.end(i64 10, i8* %0)
77*9880d681SAndroid Build Coastguard Worker  ret i64 %2
78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo2
79*9880d681SAndroid Build Coastguard Worker; CHECK:  ret i64 10
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerdefine void @foo() {
83*9880d681SAndroid Build Coastguard Workerentry:
84*9880d681SAndroid Build Coastguard Worker  %call = tail call i64 @foo1(i32 0)
85*9880d681SAndroid Build Coastguard Worker  %call1 = tail call i64 @foo2(i32 0)
86*9880d681SAndroid Build Coastguard Worker  %call2 = tail call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i64 0, i64 0), i64 %call, i64 %call1)
87*9880d681SAndroid Build Coastguard Worker  ret void
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workerdeclare i32 @printf(i8* nocapture readonly, ...)