brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.4 KiB · 051466f Raw
57 lines · plain
1; RUN: opt -passes=instcombine -S < %s | FileCheck %s2 3; #include <stdlib.h>4; #include <stdio.h>5;6; int foo1(int N) {7;   char Big[20];8;   char Small[10];9;   char *Ptr = N ? Big + 10 : Small;10;   return __builtin_object_size(Ptr, 0);11; }12;13; void foo() {14;   size_t ret;15;   ret = foo1(0);16;   printf("\n %d", ret);17; }18 19target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"20target triple = "x86_64-unknown-linux-gnu"21 22@.str = private unnamed_addr constant [5 x i8] c"\0A %d\00", align 123 24define i32 @foo1(i32 %N) {25entry:26  %Big = alloca [20 x i8], align 1627  %Small = alloca [10 x i8], align 128  call void @llvm.lifetime.start.p0(ptr %Big)29  call void @llvm.lifetime.start.p0(ptr %Small)30  %tobool = icmp ne i32 %N, 031  %add.ptr = getelementptr inbounds [20 x i8], ptr %Big, i64 0, i64 1032  %cond = select i1 %tobool, ptr %add.ptr, ptr %Small33  %0 = call i64 @llvm.objectsize.i64.p0(ptr %cond, i1 false)34  %conv = trunc i64 %0 to i3235  call void @llvm.lifetime.end.p0(ptr %Small)36  call void @llvm.lifetime.end.p0(ptr %Big)37  ret i32 %conv38; CHECK: ret i32 10 39}40 41declare void @llvm.lifetime.start.p0(ptr nocapture)42 43declare i64 @llvm.objectsize.i64.p0(ptr, i1)44 45declare void @llvm.lifetime.end.p0(ptr nocapture)46 47define void @foo() {48entry:49  %call = tail call i32 @foo1(i32 0)50  %conv = sext i32 %call to i6451  %call1 = tail call i32 (ptr, ...) @printf(ptr @.str, i64 %conv)52  ret void53}54 55declare i32 @printf(ptr nocapture readonly, ...)56 57