brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.8 KiB · 929919f Raw
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