1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4@hello = constant [6 x i8] c"hello\00" 5@null = constant [1 x i8] zeroinitializer 6 7declare ptr @strndup(ptr, i64) 8 9define ptr @test1() { 10; CHECK-LABEL: @test1( 11; CHECK-NEXT: [[STRDUP:%.*]] = call dereferenceable_or_null(1) ptr @strdup(ptr nonnull @null) 12; CHECK-NEXT: ret ptr [[STRDUP]] 13; 14 %ret = call ptr @strndup(ptr @null, i64 0) 15 ret ptr %ret 16} 17 18define ptr @test2() { 19; CHECK-LABEL: @test2( 20; CHECK-NEXT: [[RET:%.*]] = call dereferenceable_or_null(5) ptr @strndup(ptr nonnull dereferenceable(6) @hello, i64 4) 21; CHECK-NEXT: ret ptr [[RET]] 22; 23 %ret = call ptr @strndup(ptr @hello, i64 4) 24 ret ptr %ret 25} 26 27define ptr @test3() { 28; CHECK-LABEL: @test3( 29; CHECK-NEXT: [[STRDUP:%.*]] = call dereferenceable_or_null(6) ptr @strdup(ptr nonnull @hello) 30; CHECK-NEXT: ret ptr [[STRDUP]] 31; 32 %ret = call ptr @strndup(ptr @hello, i64 5) 33 ret ptr %ret 34} 35 36define ptr @test4() { 37; CHECK-LABEL: @test4( 38; CHECK-NEXT: [[STRDUP:%.*]] = call dereferenceable_or_null(6) ptr @strdup(ptr nonnull @hello) 39; CHECK-NEXT: ret ptr [[STRDUP]] 40; 41 %ret = call ptr @strndup(ptr @hello, i64 6) 42 ret ptr %ret 43} 44 45define ptr @test5() { 46; CHECK-LABEL: @test5( 47; CHECK-NEXT: [[STRDUP:%.*]] = call dereferenceable_or_null(6) ptr @strdup(ptr nonnull @hello) 48; CHECK-NEXT: ret ptr [[STRDUP]] 49; 50 %ret = call ptr @strndup(ptr @hello, i64 7) 51 ret ptr %ret 52} 53 54define ptr @test6(i64 %n) { 55; CHECK-LABEL: @test6( 56; CHECK-NEXT: [[RET:%.*]] = call ptr @strndup(ptr nonnull @hello, i64 [[N:%.*]]) 57; CHECK-NEXT: ret ptr [[RET]] 58; 59 %ret = call ptr @strndup(ptr @hello, i64 %n) 60 ret ptr %ret 61} 62