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