brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.4 KiB · 0eec7f7 Raw
281 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=lower-constant-intrinsics -S < %s | FileCheck %s3 4target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"5target triple = "x86_64-apple-darwin10.0.0"6 7declare i64 @llvm.objectsize.i64(ptr, i1, i1, i1) nounwind readonly8declare i64 @llvm.objectsize.i64.p1(ptr addrspace(1), i1, i1, i1) nounwind readonly9declare void @llvm.trap() nounwind10 11; objectsize should fold to a constant, which causes the branch to fold to an12; uncond branch.13define i32 @test1(ptr %ptr) nounwind ssp noredzone align 2 {14; CHECK-LABEL: @test1(15; CHECK-NEXT:  entry:16; CHECK-NEXT:    br label [[T:%.*]]17; CHECK:       T:18; CHECK-NEXT:    ret i32 419;20entry:21  %0 = tail call i64 @llvm.objectsize.i64(ptr %ptr, i1 false, i1 false, i1 false)22  %1 = icmp ugt i64 %0, 323  br i1 %1, label %T, label %trap24 25 26trap:                                             ; preds = %0, %entry27  tail call void @llvm.trap() noreturn nounwind28  unreachable29 30T:31  ret i32 432}33 34define i64 @test_objectsize_null_flag(ptr %ptr) {35; CHECK-LABEL: @test_objectsize_null_flag(36; CHECK-NEXT:  entry:37; CHECK-NEXT:    ret i64 -138;39entry:40  %0 = tail call i64 @llvm.objectsize.i64(ptr null, i1 false, i1 true, i1 false)41  ret i64 %042}43 44define i64 @test_objectsize_null_flag_min(ptr %ptr) {45; CHECK-LABEL: @test_objectsize_null_flag_min(46; CHECK-NEXT:  entry:47; CHECK-NEXT:    ret i64 048;49entry:50  %0 = tail call i64 @llvm.objectsize.i64(ptr null, i1 true, i1 true, i1 false)51  ret i64 %052}53 54; Test foldable null pointers because we evaluate them with non-exact modes in55; CodeGenPrepare.56define i64 @test_objectsize_null_flag_noas0() {57; CHECK-LABEL: @test_objectsize_null_flag_noas0(58; CHECK-NEXT:  entry:59; CHECK-NEXT:    ret i64 -160;61entry:62  %0 = tail call i64 @llvm.objectsize.i64.p1(ptr addrspace(1) null, i1 false,63  i1 true, i1 false)64  ret i64 %065}66 67define i64 @test_objectsize_null_flag_min_noas0() {68; CHECK-LABEL: @test_objectsize_null_flag_min_noas0(69; CHECK-NEXT:  entry:70; CHECK-NEXT:    ret i64 071;72entry:73  %0 = tail call i64 @llvm.objectsize.i64.p1(ptr addrspace(1) null, i1 true,74  i1 true, i1 false)75  ret i64 %076}77 78define i64 @test_objectsize_null_known_flag_noas0() {79; CHECK-LABEL: @test_objectsize_null_known_flag_noas0(80; CHECK-NEXT:  entry:81; CHECK-NEXT:    ret i64 -182;83entry:84  %0 = tail call i64 @llvm.objectsize.i64.p1(ptr addrspace(1) null, i1 false,85  i1 false, i1 false)86  ret i64 %087}88 89define i64 @test_objectsize_null_known_flag_min_noas0() {90; CHECK-LABEL: @test_objectsize_null_known_flag_min_noas0(91; CHECK-NEXT:  entry:92; CHECK-NEXT:    ret i64 093;94entry:95  %0 = tail call i64 @llvm.objectsize.i64.p1(ptr addrspace(1) null, i1 true,96  i1 false, i1 false)97  ret i64 %098}99 100define i64 @test_objectsize_byval_arg(ptr byval([42 x i8]) %ptr) {101; CHECK-LABEL: @test_objectsize_byval_arg(102; CHECK-NEXT:    ret i64 42103;104  %size = tail call i64 @llvm.objectsize.i64(ptr %ptr, i1 true, i1 false, i1 false)105  ret i64 %size106}107 108define i64 @test_objectsize_byref_arg(ptr byref([42 x i8]) %ptr) {109; CHECK-LABEL: @test_objectsize_byref_arg(110; CHECK-NEXT:    ret i64 42111;112  %size = tail call i64 @llvm.objectsize.i64(ptr %ptr, i1 true, i1 false, i1 false)113  ret i64 %size114}115 116; https://llvm.org/PR50023117; The alloca operand type may not match pointer type size.118 119define i64 @vla_pointer_size_mismatch(i42 %x) {120; CHECK-LABEL: @vla_pointer_size_mismatch(121; CHECK-NEXT:    [[TMP1:%.*]] = zext i42 [[X:%.*]] to i64122; CHECK-NEXT:    [[TMP2:%.*]] = mul i64 1, [[TMP1]]123; CHECK-NEXT:    [[A:%.*]] = alloca i8, i42 [[X]], align 1124; CHECK-NEXT:    [[G1:%.*]] = getelementptr i8, ptr [[A]], i8 17125; CHECK-NEXT:    [[TMP3:%.*]] = sub i64 [[TMP2]], 17126; CHECK-NEXT:    [[TMP4:%.*]] = icmp ult i64 [[TMP2]], 17127; CHECK-NEXT:    [[TMP5:%.*]] = select i1 [[TMP4]], i64 0, i64 [[TMP3]]128; CHECK-NEXT:    [[TMP6:%.*]] = icmp ne i64 [[TMP5]], -1129; CHECK-NEXT:    call void @llvm.assume(i1 [[TMP6]])130; CHECK-NEXT:    ret i64 [[TMP5]]131;132  %A = alloca i8, i42 %x, align 1133  %G1 = getelementptr i8, ptr %A, i8 17134  %objsize = call i64 @llvm.objectsize.i64(ptr %G1, i1 false, i1 true, i1 true)135  ret i64 %objsize136}137 138declare ptr @malloc(i64) allocsize(0)139 140define i64 @test_objectsize_malloc() {141; CHECK-LABEL: @test_objectsize_malloc(142; CHECK-NEXT:    [[PTR:%.*]] = call ptr @malloc(i64 16)143; CHECK-NEXT:    ret i64 16144;145  %ptr = call ptr @malloc(i64 16)146  %objsize = call i64 @llvm.objectsize.i64(ptr %ptr, i1 false, i1 true, i1 true)147  ret i64 %objsize148}149 150@gv_weak = weak global i64 zeroinitializer, align 16151 152define i32 @promote_with_objectsize_min_false() {153; CHECK-LABEL: @promote_with_objectsize_min_false(154; CHECK-NEXT:    ret i32 -1155;156  %size = call i32 @llvm.objectsize.i32.p0(ptr @gv_weak, i1 false, i1 false, i1 false)157  ret i32 %size158}159 160define i32 @promote_with_objectsize_min_true() {161; CHECK-LABEL: @promote_with_objectsize_min_true(162; CHECK-NEXT:    ret i32 8163;164  %size = call i32 @llvm.objectsize.i32.p0(ptr @gv_weak, i1 true, i1 false, i1 false)165  ret i32 %size166}167 168@gv_extern = extern_weak global i64, align 16169 170define i32 @promote_with_objectsize_nullunknown_false() {171; CHECK-LABEL: @promote_with_objectsize_nullunknown_false(172; CHECK-NEXT:    ret i32 0173;174  %size = call i32 @llvm.objectsize.i32.p0(ptr @gv_extern, i1 true, i1 false, i1 false)175  ret i32 %size176}177 178define i32 @promote_with_objectsize_nullunknown_true() {179; CHECK-LABEL: @promote_with_objectsize_nullunknown_true(180; CHECK-NEXT:    ret i32 0181;182  %size = call i32 @llvm.objectsize.i32.p0(ptr @gv_extern, i1 true, i1 true, i1 false)183  ret i32 %size184}185 186define i64 @out_of_bound_gep() {187; CHECK-LABEL: @out_of_bound_gep(188; CHECK-NEXT:    [[OBJ:%.*]] = alloca i8, i32 4, align 1189; CHECK-NEXT:    [[SLIDE:%.*]] = getelementptr i8, ptr [[OBJ]], i8 8190; CHECK-NEXT:    ret i64 0191;192  %obj = alloca i8, i32 4193  %slide = getelementptr i8, ptr %obj, i8 8194  %objsize = call i64 @llvm.objectsize.i64(ptr %slide, i1 false, i1 false, i1 false)195  ret i64 %objsize196}197 198define i64 @wrapping_gep(i1 %c) {199; CHECK-LABEL: @wrapping_gep(200; CHECK-NEXT:    [[OBJ:%.*]] = alloca i8, i64 4, align 1201; CHECK-NEXT:    [[SLIDE:%.*]] = getelementptr i8, ptr [[OBJ]], i64 -9223372036854775807202; CHECK-NEXT:    [[SLIDE_BIS:%.*]] = getelementptr i8, ptr [[SLIDE]], i64 -9223372036854775808203; CHECK-NEXT:    ret i64 3204;205  %obj = alloca i8, i64 4206  %slide = getelementptr i8, ptr %obj, i64 9223372036854775809207  %slide.bis = getelementptr i8, ptr %slide, i64 9223372036854775808208  %objsize = call i64 @llvm.objectsize.i64(ptr %slide.bis, i1 false, i1 false, i1 false)209  ret i64 %objsize210}211 212define i64 @wrapping_gep_neg(i1 %c) {213; CHECK-LABEL: @wrapping_gep_neg(214; CHECK-NEXT:    [[OBJ:%.*]] = alloca i8, i64 4, align 1215; CHECK-NEXT:    [[SLIDE:%.*]] = getelementptr i8, ptr [[OBJ]], i64 9223372036854775807216; CHECK-NEXT:    [[SLIDE_BIS:%.*]] = getelementptr i8, ptr [[SLIDE]], i64 9223372036854775807217; CHECK-NEXT:    ret i64 -1218;219  %obj = alloca i8, i64 4220  %slide = getelementptr i8, ptr %obj, i64 9223372036854775807221  %slide.bis = getelementptr i8, ptr %slide, i64 9223372036854775807222  %objsize = call i64 @llvm.objectsize.i64(ptr %slide.bis, i1 false, i1 false, i1 false)223  ret i64 %objsize224}225 226define i64 @wrapping_gep_large_alloc(i1 %c) {227; CHECK-LABEL: @wrapping_gep_large_alloc(228; CHECK-NEXT:    [[OBJ:%.*]] = alloca i8, i64 9223372036854775807, align 1229; CHECK-NEXT:    [[SLIDE:%.*]] = getelementptr i8, ptr [[OBJ]], i64 9223372036854775807230; CHECK-NEXT:    [[SLIDE_BIS:%.*]] = getelementptr i8, ptr [[SLIDE]], i64 3231; CHECK-NEXT:    [[SLIDE_TER:%.*]] = getelementptr i8, ptr [[SLIDE_BIS]], i64 -4232; CHECK-NEXT:    ret i64 1233;234  %obj = alloca i8, i64 9223372036854775807235  %slide = getelementptr i8, ptr %obj, i64 9223372036854775807236  %slide.bis = getelementptr i8, ptr %slide, i64 3237  %slide.ter = getelementptr i8, ptr %slide.bis, i64 -4238  %objsize = call i64 @llvm.objectsize.i64(ptr %slide.ter, i1 false, i1 false, i1 false)239  ret i64 %objsize240}241 242; We don't analyze allocations larger than platform's ptrdiff_t243define i64 @large_alloca() {244; CHECK-LABEL: @large_alloca(245; CHECK-NEXT:    [[OBJ:%.*]] = alloca i8, i64 -9223372036854775808, align 1246; CHECK-NEXT:    [[SLIDE:%.*]] = getelementptr i8, ptr [[OBJ]], i64 9223372036854775807247; CHECK-NEXT:    ret i64 -1248;249  %obj = alloca i8, i64 9223372036854775808250  %slide = getelementptr i8, ptr %obj, i64 9223372036854775807251  %objsize = call i64 @llvm.objectsize.i64(ptr %slide, i1 false, i1 false, i1 false)252  ret i64 %objsize253}254 255; We don't analyze allocations larger than platform's ptrdiff_t256define i64 @large_malloc() {257; CHECK-LABEL: @large_malloc(258; CHECK-NEXT:    [[OBJ:%.*]] = call ptr @malloc(i64 -9223372036854775808)259; CHECK-NEXT:    [[SLIDE:%.*]] = getelementptr i8, ptr [[OBJ]], i64 9223372036854775807260; CHECK-NEXT:    ret i64 -1261;262  %obj = call ptr @malloc(i64 9223372036854775808)263  %slide = getelementptr i8, ptr %obj, i64 9223372036854775807264  %objsize = call i64 @llvm.objectsize.i64(ptr %slide, i1 false, i1 false, i1 false)265  ret i64 %objsize266}267 268define i64 @out_of_bound_negative_gep(i1 %c) {269; CHECK-LABEL: @out_of_bound_negative_gep(270; CHECK-NEXT:    [[OBJ:%.*]] = alloca i8, i32 4, align 1271; CHECK-NEXT:    [[SLIDE:%.*]] = getelementptr i8, ptr [[OBJ]], i8 -8272; CHECK-NEXT:    ret i64 -1273;274  %obj = alloca i8, i32 4275  %slide = getelementptr i8, ptr %obj, i8 -8276  %objsize = call i64 @llvm.objectsize.i64(ptr %slide, i1 false, i1 false, i1 false)277  ret i64 %objsize278}279 280declare i32 @llvm.objectsize.i32.p0(ptr, i1, i1, i1)281