summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/CodeGenPrepare/builtin-condition.ll
diff options
context:
space:
mode:
authorJoerg Sonnenberger <joerg@bec.de>2019-10-13 23:00:15 +0000
committerJoerg Sonnenberger <joerg@bec.de>2019-10-13 23:00:15 +0000
commite4300c392de28b659749d77b415b4903786caa0c (patch)
treee2932a42e822bdc97da8cc30e6d80dd87c0518ec /llvm/test/Transforms/CodeGenPrepare/builtin-condition.ll
parent529f4ed401ea9761461fb42b1efa552c320c40fb (diff)
downloadbcm5719-llvm-e4300c392de28b659749d77b415b4903786caa0c.tar.gz
bcm5719-llvm-e4300c392de28b659749d77b415b4903786caa0c.zip
Add a pass to lower is.constant and objectsize intrinsics
This pass lowers is.constant and objectsize intrinsics not simplified by earlier constant folding, i.e. if the object given is not constant or if not using the optimized pass chain. The result is recursively simplified and constant conditionals are pruned, so that dead blocks are removed even for -O0. This allows inline asm blocks with operand constraints to work all the time. The new pass replaces the existing lowering in the codegen-prepare pass and fallbacks in SDAG/GlobalISEL and FastISel. The latter now assert on the intrinsics. Differential Revision: https://reviews.llvm.org/D65280 llvm-svn: 374743
Diffstat (limited to 'llvm/test/Transforms/CodeGenPrepare/builtin-condition.ll')
-rw-r--r--llvm/test/Transforms/CodeGenPrepare/builtin-condition.ll123
1 files changed, 0 insertions, 123 deletions
diff --git a/llvm/test/Transforms/CodeGenPrepare/builtin-condition.ll b/llvm/test/Transforms/CodeGenPrepare/builtin-condition.ll
deleted file mode 100644
index e42529a7b9a..00000000000
--- a/llvm/test/Transforms/CodeGenPrepare/builtin-condition.ll
+++ /dev/null
@@ -1,123 +0,0 @@
-; 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, ...)
OpenPOWER on IntegriCloud