1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=instcombine -S < %s | FileCheck %s 3 4; int foo() { 5; struct V { char buf1[10]; 6; int b; 7; char buf2[10]; 8; } var; 9; 10; char *p = &var.buf1[1]; 11; return __builtin_object_size (p, 0); 12; } 13 14%struct.V = type { [10 x i8], i32, [10 x i8] } 15 16define i32 @foo() #0 { 17; CHECK-LABEL: @foo( 18; CHECK-NEXT: ret i32 27 19; 20 %var = alloca %struct.V, align 4 21 call void @llvm.lifetime.start.p0(i64 28, ptr %var) #3 22 %arrayidx = getelementptr inbounds [10 x i8], ptr %var, i64 0, i64 1 23 %t1 = call i64 @llvm.objectsize.i64.p0(ptr %arrayidx, i1 false) 24 %conv = trunc i64 %t1 to i32 25 call void @llvm.lifetime.end.p0(i64 28, ptr %var) #3 26 ret i32 %conv 27} 28 29; This used to crash while erasing instructions: 30; https://bugs.llvm.org/show_bug.cgi?id=43723 31 32define void @PR43723() { 33; CHECK-LABEL: @PR43723( 34; CHECK-NEXT: ret void 35; 36 %tab = alloca [10 x i8], align 16 37 call void @llvm.memset.p0.i64(ptr align 16 %tab, i8 9, i64 10, i1 false) 38 %t1 = call ptr @llvm.invariant.start.p0(i64 10, ptr align 16 %tab) 39 call void @llvm.invariant.end.p0(ptr %t1, i64 10, ptr align 16 %tab) 40 ret void 41 42 uselistorder ptr %tab, { 1, 0, 2 } 43} 44 45define void @unknown_use_of_invariant_start(ptr %p) { 46; CHECK-LABEL: @unknown_use_of_invariant_start( 47; CHECK-NEXT: ret void 48; 49 %tab = alloca [10 x i8], align 16 50 call void @llvm.memset.p0.i64(ptr align 16 %tab, i8 9, i64 10, i1 false) 51 %t1 = call ptr @llvm.invariant.start.p0(i64 10, ptr align 16 %tab) 52 call void @llvm.invariant.end.p0(ptr %t1, i64 10, ptr align 16 %tab) 53 store ptr %t1, ptr %p 54 ret void 55} 56 57define ptr @minimal_invariant_start_use(i8 %x) { 58; CHECK-LABEL: @minimal_invariant_start_use( 59; CHECK-NEXT: ret ptr poison 60; 61 %a = alloca i8 62 %i = call ptr @llvm.invariant.start.p0(i64 1, ptr %a) 63 ret ptr %i 64} 65 66declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #1 67declare i64 @llvm.objectsize.i64.p0(ptr, i1) #2 68declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #1 69declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #0 70declare ptr @llvm.invariant.start.p0(i64 immarg, ptr nocapture) #0 71declare void @llvm.invariant.end.p0(ptr, i64 immarg, ptr nocapture) #0 72