1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=mem2reg -S -o - < %s | FileCheck %s 3 4declare void @llvm.assume(i1) 5declare void @llvm.lifetime.start.p0(i64 %size, ptr nocapture %ptr) 6declare void @llvm.lifetime.end.p0(i64 %size, ptr nocapture %ptr) 7 8define void @positive_assume_uses(ptr %arg) { 9; CHECK-LABEL: @positive_assume_uses( 10; CHECK-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(ptr [[ARG:%.*]]), "ignore"(ptr undef, i64 2) ] 11; CHECK-NEXT: call void @llvm.assume(i1 true) [ "ignore"(ptr undef, i64 8), "nonnull"(ptr [[ARG]]) ] 12; CHECK-NEXT: ret void 13; 14 %A = alloca i32 15 call void @llvm.assume(i1 true) ["nonnull"(ptr %arg), "align"(ptr %A, i64 2)] 16 store i32 1, ptr %A 17 call void @llvm.assume(i1 true) ["align"(ptr %A, i64 8), "nonnull"(ptr %arg)] 18 ret void 19} 20 21define void @negative_assume_condition_use() { 22; CHECK-LABEL: @negative_assume_condition_use( 23; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 24; CHECK-NEXT: [[CND:%.*]] = icmp eq ptr [[A]], null 25; CHECK-NEXT: call void @llvm.assume(i1 [[CND]]) 26; CHECK-NEXT: store i32 1, ptr [[A]], align 4 27; CHECK-NEXT: ret void 28; 29 %A = alloca i32 30 %cnd = icmp eq ptr %A, null 31 call void @llvm.assume(i1 %cnd) 32 store i32 1, ptr %A 33 ret void 34} 35 36define void @positive_multiple_assume_uses() { 37; CHECK-LABEL: @positive_multiple_assume_uses( 38; CHECK-NEXT: call void @llvm.assume(i1 true) [ "ignore"(ptr undef, i64 8), "ignore"(ptr undef, i64 16) ] 39; CHECK-NEXT: call void @llvm.assume(i1 true) [ "ignore"(ptr undef), "ignore"(ptr undef, i64 2) ] 40; CHECK-NEXT: ret void 41; 42 %A = alloca {i8, i16} 43 call void @llvm.assume(i1 true) ["align"(ptr %A, i64 8), "align"(ptr %A, i64 16)] 44 store {i8, i16} zeroinitializer, ptr %A 45 call void @llvm.assume(i1 true) ["nonnull"(ptr %A), "align"(ptr %A, i64 2)] 46 ret void 47} 48 49define void @positive_gep_assume_uses() { 50; CHECK-LABEL: @positive_gep_assume_uses( 51; CHECK-NEXT: call void @llvm.assume(i1 true) [ "ignore"(ptr undef, i64 8), "ignore"(ptr undef, i64 16) ] 52; CHECK-NEXT: call void @llvm.assume(i1 true) [ "ignore"(ptr undef), "ignore"(ptr undef, i64 2) ] 53; CHECK-NEXT: ret void 54; 55 %A = alloca {i8, i16} 56 %B = getelementptr {i8, i16}, ptr %A, i32 0, i32 0 57 call void @llvm.lifetime.start.p0(i64 2, ptr %B) 58 call void @llvm.assume(i1 true) ["align"(ptr %B, i64 8), "align"(ptr %B, i64 16)] 59 store {i8, i16} zeroinitializer, ptr %A 60 call void @llvm.lifetime.end.p0(i64 2, ptr %B) 61 call void @llvm.assume(i1 true) ["nonnull"(ptr %B), "align"(ptr %B, i64 2)] 62 ret void 63} 64 65define void @positive_mixed_assume_uses() { 66; CHECK-LABEL: @positive_mixed_assume_uses( 67; CHECK-NEXT: call void @llvm.assume(i1 true) [ "ignore"(ptr undef), "ignore"(ptr undef, i64 8), "ignore"(ptr undef, i64 16) ] 68; CHECK-NEXT: call void @llvm.assume(i1 true) [ "ignore"(ptr undef), "ignore"(ptr undef, i64 2), "ignore"(ptr undef) ] 69; CHECK-NEXT: call void @llvm.assume(i1 true) [ "ignore"(ptr undef), "ignore"(ptr undef, i64 2), "ignore"(ptr undef) ] 70; CHECK-NEXT: ret void 71; 72 %A = alloca i8 73 call void @llvm.lifetime.start.p0(i64 2, ptr %A) 74 call void @llvm.assume(i1 true) ["nonnull"(ptr %A), "align"(ptr %A, i64 8), "align"(ptr %A, i64 16)] 75 store i8 1, ptr %A 76 call void @llvm.lifetime.end.p0(i64 2, ptr %A) 77 call void @llvm.assume(i1 true) ["nonnull"(ptr %A), "align"(ptr %A, i64 2), "nonnull"(ptr %A)] 78 call void @llvm.assume(i1 true) ["nonnull"(ptr %A), "align"(ptr %A, i64 2), "nonnull"(ptr %A)] 79 ret void 80} 81