; RUN: opt -codegenprepare -S  < %s | FileCheck %s

; Ensure we act sanely on overflow.
; CHECK-LABEL: define i32 @bar
define i32 @bar() {
entry:
  ; CHECK: ret i32 -1
  %az = alloca [2147483649 x i32], align 16
  %a = alloca i8*, align 8
  %arraydecay = getelementptr inbounds [2147483649 x i32], [2147483649 x i32]* %az, i32 0, i32 0
  %0 = bitcast i32* %arraydecay to i8*
  store i8* %0, i8** %a, align 8
  %1 = load i8*, i8** %a, align 8
  %2 = call i32 @llvm.objectsize.i32.p0i8(i8* %1, i1 false)
  ret i32 %2
}

; CHECK-LABEL: define i32 @baz
define i32 @baz(i32 %n) {
entry:
  ; CHECK: ret i32 -1
  %az = alloca [1 x i32], align 16
  %bz = alloca [4294967297 x i32], align 16
  %tobool = icmp ne i32 %n, 0
  %arraydecay = getelementptr inbounds [1 x i32], [1 x i32]* %az, i64 0, i64 0
  %arraydecay1 = getelementptr inbounds [4294967297 x i32], [4294967297 x i32]* %bz, i64 0, i64 0
  %cond = select i1 %tobool, i32* %arraydecay, i32* %arraydecay1
  %0 = bitcast i32* %cond to i8*
  %1 = call i32 @llvm.objectsize.i32.p0i8(i8* %0, i1 false)
  ret i32 %1
}

declare i32 @llvm.objectsize.i32.p0i8(i8*, i1)

; The following tests were generated by:
; #include<stdlib.h>
; #define STATIC_BUF_SIZE 10
; #define LARGER_BUF_SIZE 30
;
; size_t foo1(int flag) {
;   char *cptr;
;   char chararray[LARGER_BUF_SIZE];
;   char chararray2[STATIC_BUF_SIZE];
;   if(flag)
;     cptr = chararray2;
;    else
;     cptr = chararray;
;
;   return  __builtin_object_size(cptr, 2);
; }
;
; size_t foo2(int n) {
;   char Small[10];
;   char Large[20];
;   char *Ptr = n ? Small : Large + 19;
;   return __builtin_object_size(Ptr, 0);
; }
;
; void foo() {
;   size_t ret;
;   size_t ret1;
;   ret = foo1(0);
;   ret1 = foo2(0);
;   printf("\n%d %d\n", ret, ret1);
; }

target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@.str = private unnamed_addr constant [8 x i8] c"\0A%d %d\0A\00", align 1

define i64 @foo1(i32 %flag) {
entry:
  %chararray = alloca [30 x i8], align 16
  %chararray2 = alloca [10 x i8], align 1
  %0 = getelementptr inbounds [30 x i8], [30 x i8]* %chararray, i64 0, i64 0
  call void @llvm.lifetime.start.p0i8(i64 30, i8* %0)
  %1 = getelementptr inbounds [10 x i8], [10 x i8]* %chararray2, i64 0, i64 0
  call void @llvm.lifetime.start.p0i8(i64 10, i8* %1)
  %tobool = icmp eq i32 %flag, 0
  %cptr.0 = select i1 %tobool, i8* %0, i8* %1
  %2 = call i64 @llvm.objectsize.i64.p0i8(i8* %cptr.0, i1 true)
  call void @llvm.lifetime.end.p0i8(i64 10, i8* %1)
  call void @llvm.lifetime.end.p0i8(i64 30, i8* %0)
  ret i64 %2
; CHECK-LABEL: foo1
; CHECK:  ret i64 10
}

declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)

declare i64 @llvm.objectsize.i64.p0i8(i8*, i1)

declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)

define i64 @foo2(i32 %n) {
entry:
  %Small = alloca [10 x i8], align 1
  %Large = alloca [20 x i8], align 16
  %0 = getelementptr inbounds [10 x i8], [10 x i8]* %Small, i64 0, i64 0
  call void @llvm.lifetime.start.p0i8(i64 10, i8* %0)
  %1 = getelementptr inbounds [20 x i8], [20 x i8]* %Large, i64 0, i64 0
  call void @llvm.lifetime.start.p0i8(i64 20, i8* %1)
  %tobool = icmp ne i32 %n, 0
  %add.ptr = getelementptr inbounds [20 x i8], [20 x i8]* %Large, i64 0, i64 19
  %cond = select i1 %tobool, i8* %0, i8* %add.ptr
  %2 = call i64 @llvm.objectsize.i64.p0i8(i8* %cond, i1 false)
  call void @llvm.lifetime.end.p0i8(i64 20, i8* %1)
  call void @llvm.lifetime.end.p0i8(i64 10, i8* %0)
  ret i64 %2
; CHECK-LABEL: foo2
; CHECK:  ret i64 10
}

define void @foo() {
entry:
  %call = tail call i64 @foo1(i32 0)
  %call1 = tail call i64 @foo2(i32 0)
  %call2 = tail call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i64 0, i64 0), i64 %call, i64 %call1)
  ret void
}

declare i32 @printf(i8* nocapture readonly, ...)
