[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / Transforms / CodeGenPrepare / builtin-condition.ll
blobe42529a7b9a11981cfe4f52d55e64f65ff682ee4
1 ; RUN: opt -codegenprepare -S  < %s | FileCheck %s
3 ; Ensure we act sanely on overflow.
4 ; CHECK-LABEL: define i32 @bar
5 define i32 @bar() {
6 entry:
7   ; CHECK: ret i32 -1
8   %az = alloca [2147483649 x i32], align 16
9   %a = alloca i8*, align 8
10   %arraydecay = getelementptr inbounds [2147483649 x i32], [2147483649 x i32]* %az, i32 0, i32 0
11   %0 = bitcast i32* %arraydecay to i8*
12   store i8* %0, i8** %a, align 8
13   %1 = load i8*, i8** %a, align 8
14   %2 = call i32 @llvm.objectsize.i32.p0i8(i8* %1, i1 false)
15   ret i32 %2
18 ; CHECK-LABEL: define i32 @baz
19 define i32 @baz(i32 %n) {
20 entry:
21   ; CHECK: ret i32 -1
22   %az = alloca [1 x i32], align 16
23   %bz = alloca [4294967297 x i32], align 16
24   %tobool = icmp ne i32 %n, 0
25   %arraydecay = getelementptr inbounds [1 x i32], [1 x i32]* %az, i64 0, i64 0
26   %arraydecay1 = getelementptr inbounds [4294967297 x i32], [4294967297 x i32]* %bz, i64 0, i64 0
27   %cond = select i1 %tobool, i32* %arraydecay, i32* %arraydecay1
28   %0 = bitcast i32* %cond to i8*
29   %1 = call i32 @llvm.objectsize.i32.p0i8(i8* %0, i1 false)
30   ret i32 %1
33 declare i32 @llvm.objectsize.i32.p0i8(i8*, i1)
35 ; The following tests were generated by:
36 ; #include<stdlib.h>
37 ; #define STATIC_BUF_SIZE 10
38 ; #define LARGER_BUF_SIZE 30
40 ; size_t foo1(int flag) {
41 ;   char *cptr;
42 ;   char chararray[LARGER_BUF_SIZE];
43 ;   char chararray2[STATIC_BUF_SIZE];
44 ;   if(flag)
45 ;     cptr = chararray2;
46 ;    else
47 ;     cptr = chararray;
49 ;   return  __builtin_object_size(cptr, 2);
50 ; }
52 ; size_t foo2(int n) {
53 ;   char Small[10];
54 ;   char Large[20];
55 ;   char *Ptr = n ? Small : Large + 19;
56 ;   return __builtin_object_size(Ptr, 0);
57 ; }
59 ; void foo() {
60 ;   size_t ret;
61 ;   size_t ret1;
62 ;   ret = foo1(0);
63 ;   ret1 = foo2(0);
64 ;   printf("\n%d %d\n", ret, ret1);
65 ; }
67 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
68 target triple = "x86_64-unknown-linux-gnu"
70 @.str = private unnamed_addr constant [8 x i8] c"\0A%d %d\0A\00", align 1
72 define i64 @foo1(i32 %flag) {
73 entry:
74   %chararray = alloca [30 x i8], align 16
75   %chararray2 = alloca [10 x i8], align 1
76   %0 = getelementptr inbounds [30 x i8], [30 x i8]* %chararray, i64 0, i64 0
77   call void @llvm.lifetime.start.p0i8(i64 30, i8* %0)
78   %1 = getelementptr inbounds [10 x i8], [10 x i8]* %chararray2, i64 0, i64 0
79   call void @llvm.lifetime.start.p0i8(i64 10, i8* %1)
80   %tobool = icmp eq i32 %flag, 0
81   %cptr.0 = select i1 %tobool, i8* %0, i8* %1
82   %2 = call i64 @llvm.objectsize.i64.p0i8(i8* %cptr.0, i1 true)
83   call void @llvm.lifetime.end.p0i8(i64 10, i8* %1)
84   call void @llvm.lifetime.end.p0i8(i64 30, i8* %0)
85   ret i64 %2
86 ; CHECK-LABEL: foo1
87 ; CHECK:  ret i64 10
90 declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
92 declare i64 @llvm.objectsize.i64.p0i8(i8*, i1)
94 declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)
96 define i64 @foo2(i32 %n) {
97 entry:
98   %Small = alloca [10 x i8], align 1
99   %Large = alloca [20 x i8], align 16
100   %0 = getelementptr inbounds [10 x i8], [10 x i8]* %Small, i64 0, i64 0
101   call void @llvm.lifetime.start.p0i8(i64 10, i8* %0)
102   %1 = getelementptr inbounds [20 x i8], [20 x i8]* %Large, i64 0, i64 0
103   call void @llvm.lifetime.start.p0i8(i64 20, i8* %1)
104   %tobool = icmp ne i32 %n, 0
105   %add.ptr = getelementptr inbounds [20 x i8], [20 x i8]* %Large, i64 0, i64 19
106   %cond = select i1 %tobool, i8* %0, i8* %add.ptr
107   %2 = call i64 @llvm.objectsize.i64.p0i8(i8* %cond, i1 false)
108   call void @llvm.lifetime.end.p0i8(i64 20, i8* %1)
109   call void @llvm.lifetime.end.p0i8(i64 10, i8* %0)
110   ret i64 %2
111 ; CHECK-LABEL: foo2
112 ; CHECK:  ret i64 10
115 define void @foo() {
116 entry:
117   %call = tail call i64 @foo1(i32 0)
118   %call1 = tail call i64 @foo2(i32 0)
119   %call2 = tail call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i64 0, i64 0), i64 %call, i64 %call1)
120   ret void
123 declare i32 @printf(i8* nocapture readonly, ...)