1b24b6c4aSArthur Eubanks; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 2b24b6c4aSArthur Eubanks 3b24b6c4aSArthur Eubanks; RUN: opt -O3 -S < %s | FileCheck %s 4b24b6c4aSArthur Eubanks 5b24b6c4aSArthur Eubanksdefine internal i32 @loop(ptr %arg, ptr %arg1) { 6b24b6c4aSArthur Eubanksbb: 7b24b6c4aSArthur Eubanks br label %bb2 8b24b6c4aSArthur Eubanks 9b24b6c4aSArthur Eubanksbb2: 10b24b6c4aSArthur Eubanks %phi = phi ptr [ %arg, %bb ], [ %phi8, %bb11 ] 11b24b6c4aSArthur Eubanks %phi3 = phi i32 [ 0, %bb ], [ %add, %bb11 ] 12b24b6c4aSArthur Eubanks %icmp = icmp ne ptr %arg1, null 13b24b6c4aSArthur Eubanks %icmp4 = icmp eq ptr %phi, %arg1 14b24b6c4aSArthur Eubanks br i1 %icmp4, label %bb7, label %bb5 15b24b6c4aSArthur Eubanks 16b24b6c4aSArthur Eubanksbb5: 17b24b6c4aSArthur Eubanks %getelementptr = getelementptr inbounds i32, ptr %phi, i64 1 18b24b6c4aSArthur Eubanks br label %bb7 19b24b6c4aSArthur Eubanks 20b24b6c4aSArthur Eubanksbb7: 21b24b6c4aSArthur Eubanks %phi8 = phi ptr [ %phi, %bb2 ], [ %getelementptr, %bb5 ] 22b24b6c4aSArthur Eubanks %phi9 = phi ptr [ null, %bb2 ], [ %phi, %bb5 ] 23b24b6c4aSArthur Eubanks %icmp10 = icmp eq ptr %phi9, null 24b24b6c4aSArthur Eubanks br i1 %icmp10, label %bb12, label %bb11 25b24b6c4aSArthur Eubanks 26b24b6c4aSArthur Eubanksbb11: 27b24b6c4aSArthur Eubanks %load = load i32, ptr %phi9, align 4 28b24b6c4aSArthur Eubanks %add = add i32 %load, %phi3 29b24b6c4aSArthur Eubanks br label %bb2 30b24b6c4aSArthur Eubanks 31b24b6c4aSArthur Eubanksbb12: 32b24b6c4aSArthur Eubanks ret i32 %phi3 33b24b6c4aSArthur Eubanks} 34b24b6c4aSArthur Eubanks 35b24b6c4aSArthur Eubanksdefine i32 @using_alloca() { 36*1228becfSYingwei Zheng; CHECK-LABEL: define noundef i32 @using_alloca 37b24b6c4aSArthur Eubanks; CHECK-SAME: () local_unnamed_addr #[[ATTR0:[0-9]+]] { 38b24b6c4aSArthur Eubanks; CHECK-NEXT: bb: 39b24b6c4aSArthur Eubanks; CHECK-NEXT: ret i32 6 40b24b6c4aSArthur Eubanks; 41b24b6c4aSArthur Eubanksbb: 42b24b6c4aSArthur Eubanks %alloca = alloca [3 x i32], align 4 43b24b6c4aSArthur Eubanks store i32 1, ptr %alloca, align 4 44b24b6c4aSArthur Eubanks %getelementptr = getelementptr i32, ptr %alloca, i32 1 45b24b6c4aSArthur Eubanks store i32 2, ptr %getelementptr, align 4 46b24b6c4aSArthur Eubanks %getelementptr1 = getelementptr i32, ptr %alloca, i32 2 47b24b6c4aSArthur Eubanks store i32 3, ptr %getelementptr1, align 4 48b24b6c4aSArthur Eubanks %getelementptr2 = getelementptr i32, ptr %alloca, i32 3 49b24b6c4aSArthur Eubanks %call = call i32 @loop(ptr %alloca, ptr %getelementptr2) 50b24b6c4aSArthur Eubanks ret i32 %call 51b24b6c4aSArthur Eubanks} 52b24b6c4aSArthur Eubanks 53b24b6c4aSArthur Eubanksdefine i32 @using_malloc() { 54*1228becfSYingwei Zheng; CHECK-LABEL: define noundef i32 @using_malloc 55336d7281SNikita Popov; CHECK-SAME: () local_unnamed_addr #[[ATTR0]] { 56b24b6c4aSArthur Eubanks; CHECK-NEXT: bb: 57336d7281SNikita Popov; CHECK-NEXT: ret i32 6 58b24b6c4aSArthur Eubanks; 59b24b6c4aSArthur Eubanksbb: 60b24b6c4aSArthur Eubanks %alloc = call dereferenceable_or_null(64) ptr @malloc(i64 64) 61b24b6c4aSArthur Eubanks store i32 1, ptr %alloc, align 4 62b24b6c4aSArthur Eubanks %getelementptr = getelementptr i32, ptr %alloc, i64 1 63b24b6c4aSArthur Eubanks store i32 2, ptr %getelementptr, align 4 64b24b6c4aSArthur Eubanks %getelementptr1 = getelementptr i32, ptr %alloc, i64 2 65b24b6c4aSArthur Eubanks store i32 3, ptr %getelementptr1, align 4 66b24b6c4aSArthur Eubanks %getelementptr2 = getelementptr i32, ptr %alloc, i64 3 67b24b6c4aSArthur Eubanks %call = call i32 @loop(ptr %alloc, ptr %getelementptr2) 68b24b6c4aSArthur Eubanks ret i32 %call 69b24b6c4aSArthur Eubanks} 70b24b6c4aSArthur Eubanks 71b24b6c4aSArthur Eubanksdeclare ptr @malloc(i64) 72b24b6c4aSArthur Eubanks 73b24b6c4aSArthur Eubanksdeclare void @free(ptr) 74