188 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; Passing select(cond, null, v) as nonnull should be optimized to passing v5 6define nonnull ptr @pr48975(ptr %.0) {7; CHECK-LABEL: @pr48975(8; CHECK-NEXT: ret ptr [[DOT4:%.*]]9;10 %.1 = load ptr, ptr %.0, align 811 %.2 = icmp eq ptr %.1, null12 %.4 = select i1 %.2, ptr null, ptr %.013 ret ptr %.414}15 16define nonnull ptr @nonnull_ret(i1 %cond, ptr %p) {17; CHECK-LABEL: @nonnull_ret(18; CHECK-NEXT: ret ptr [[RES:%.*]]19;20 %res = select i1 %cond, ptr %p, ptr null21 ret ptr %res22}23 24define nonnull ptr @nonnull_ret2(i1 %cond, ptr %p) {25; CHECK-LABEL: @nonnull_ret2(26; CHECK-NEXT: ret ptr [[RES:%.*]]27;28 %res = select i1 %cond, ptr null, ptr %p29 ret ptr %res30}31 32define nonnull noundef ptr @nonnull_noundef_ret(i1 %cond, ptr %p) {33; CHECK-LABEL: @nonnull_noundef_ret(34; CHECK-NEXT: ret ptr [[RES:%.*]]35;36 %res = select i1 %cond, ptr %p, ptr null37 ret ptr %res38}39 40define nonnull noundef ptr @nonnull_noundef_ret2(i1 %cond, ptr %p) {41; CHECK-LABEL: @nonnull_noundef_ret2(42; CHECK-NEXT: ret ptr [[RES:%.*]]43;44 %res = select i1 %cond, ptr null, ptr %p45 ret ptr %res46}47 48 49define void @nonnull_call(i1 %cond, ptr %p) {50; CHECK-LABEL: @nonnull_call(51; CHECK-NEXT: call void @f(ptr nonnull [[RES:%.*]])52; CHECK-NEXT: ret void53;54 %res = select i1 %cond, ptr %p, ptr null55 call void @f(ptr nonnull %res)56 ret void57}58 59define void @nonnull_call2(i1 %cond, ptr %p) {60; CHECK-LABEL: @nonnull_call2(61; CHECK-NEXT: call void @f(ptr nonnull [[RES:%.*]])62; CHECK-NEXT: ret void63;64 %res = select i1 %cond, ptr null, ptr %p65 call void @f(ptr nonnull %res)66 ret void67}68 69define void @nonnull_noundef_call(i1 %cond, ptr %p) {70; CHECK-LABEL: @nonnull_noundef_call(71; CHECK-NEXT: call void @f(ptr noundef nonnull [[RES:%.*]])72; CHECK-NEXT: ret void73;74 %res = select i1 %cond, ptr %p, ptr null75 call void @f(ptr nonnull noundef %res)76 ret void77}78 79define void @nonnull_noundef_call2(i1 %cond, ptr %p) {80; CHECK-LABEL: @nonnull_noundef_call2(81; CHECK-NEXT: call void @f(ptr noundef nonnull [[RES:%.*]])82; CHECK-NEXT: ret void83;84 %res = select i1 %cond, ptr null, ptr %p85 call void @f(ptr nonnull noundef %res)86 ret void87}88 89define void @nonnull_call_gep(i1 %cond, ptr %p, i64 %off) {90; CHECK-LABEL: @nonnull_call_gep(91; CHECK-NEXT: [[PTR:%.*]] = select i1 [[COND:%.*]], ptr null, ptr [[P:%.*]]92; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[OFF:%.*]]93; CHECK-NEXT: call void @f(ptr nonnull [[GEP]])94; CHECK-NEXT: ret void95;96 %ptr = select i1 %cond, ptr null, ptr %p97 %gep = getelementptr i8, ptr %ptr, i64 %off98 call void @f(ptr nonnull %gep)99 ret void100}101 102define void @nonnull_call_gep_multiuse(i1 %cond, ptr %p, i64 %off) {103; CHECK-LABEL: @nonnull_call_gep_multiuse(104; CHECK-NEXT: [[PTR:%.*]] = select i1 [[COND:%.*]], ptr null, ptr [[P:%.*]]105; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 [[OFF:%.*]]106; CHECK-NEXT: call void @f(ptr nonnull [[GEP]])107; CHECK-NEXT: call void @f(ptr [[GEP]])108; CHECK-NEXT: ret void109;110 %ptr = select i1 %cond, ptr null, ptr %p111 %gep = getelementptr inbounds i8, ptr %ptr, i64 %off112 call void @f(ptr nonnull %gep)113 call void @f(ptr %gep)114 ret void115}116 117define void @all_nonnull_call_gep_multiuse(i1 %cond, ptr %p, i64 %off) {118; CHECK-LABEL: @all_nonnull_call_gep_multiuse(119; CHECK-NEXT: [[PTR:%.*]] = select i1 [[COND:%.*]], ptr null, ptr [[P:%.*]]120; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 [[OFF:%.*]]121; CHECK-NEXT: call void @f(ptr nonnull [[GEP]])122; CHECK-NEXT: call void @f(ptr nonnull [[GEP]])123; CHECK-NEXT: ret void124;125 %ptr = select i1 %cond, ptr null, ptr %p126 %gep = getelementptr inbounds i8, ptr %ptr, i64 %off127 call void @f(ptr nonnull %gep)128 call void @f(ptr nonnull %gep)129 ret void130}131 132define void @nonnull_call_gep_inbounds(i1 %cond, ptr %p, i64 %off) {133; CHECK-LABEL: @nonnull_call_gep_inbounds(134; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[PTR:%.*]], i64 [[OFF:%.*]]135; CHECK-NEXT: call void @f(ptr nonnull [[GEP]])136; CHECK-NEXT: ret void137;138 %ptr = select i1 %cond, ptr null, ptr %p139 %gep = getelementptr inbounds i8, ptr %ptr, i64 %off140 call void @f(ptr nonnull %gep)141 ret void142}143 144define void @nonnull_dereferenceable_call_gep(i1 %cond, ptr %p, i64 %off) {145; CHECK-LABEL: @nonnull_dereferenceable_call_gep(146; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[PTR:%.*]], i64 [[OFF:%.*]]147; CHECK-NEXT: call void @f(ptr dereferenceable(1) [[GEP]])148; CHECK-NEXT: ret void149;150 %ptr = select i1 %cond, ptr null, ptr %p151 %gep = getelementptr i8, ptr %ptr, i64 %off152 call void @f(ptr dereferenceable(1) %gep)153 ret void154}155 156define nonnull ptr @nonnull_ret_gep(i1 %cond, ptr %p, i64 %off) {157; CHECK-LABEL: @nonnull_ret_gep(158; CHECK-NEXT: [[PTR:%.*]] = select i1 [[COND:%.*]], ptr null, ptr [[P:%.*]]159; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[OFF:%.*]]160; CHECK-NEXT: ret ptr [[GEP]]161;162 %ptr = select i1 %cond, ptr null, ptr %p163 %gep = getelementptr i8, ptr %ptr, i64 %off164 ret ptr %gep165}166 167define nonnull ptr @nonnull_ret_gep_inbounds(i1 %cond, ptr %p, i64 %off) {168; CHECK-LABEL: @nonnull_ret_gep_inbounds(169; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[PTR:%.*]], i64 [[OFF:%.*]]170; CHECK-NEXT: ret ptr [[GEP]]171;172 %ptr = select i1 %cond, ptr null, ptr %p173 %gep = getelementptr inbounds i8, ptr %ptr, i64 %off174 ret ptr %gep175}176 177define dereferenceable(1) ptr @nonnull_dereferenceable_ret_gep(i1 %cond, ptr %p, i64 %off) {178; CHECK-LABEL: @nonnull_dereferenceable_ret_gep(179; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[PTR:%.*]], i64 [[OFF:%.*]]180; CHECK-NEXT: ret ptr [[GEP]]181;182 %ptr = select i1 %cond, ptr null, ptr %p183 %gep = getelementptr i8, ptr %ptr, i64 %off184 ret ptr %gep185}186 187declare void @f(ptr)188