brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · f9b5a91 Raw
70 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; Test that the stpcpy library call simplifier works correctly.3; RUN: opt < %s -passes=instcombine -S | FileCheck %s4;5; This transformation requires the pointer size, as it assumes that size_t is6; the size of a pointer.7target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32"8 9@hello = constant [6 x i8] c"hello\00"10@a = common global [32 x i8] zeroinitializer, align 111@b = common global [32 x i8] zeroinitializer, align 112@percent_s = constant [3 x i8] c"%s\00"13 14declare ptr @stpcpy(ptr, ptr)15 16define ptr @test_simplify1() {17; CHECK-LABEL: @test_simplify1(18; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(6) @a, ptr noundef nonnull align 1 dereferenceable(6) @hello, i32 6, i1 false)19; CHECK-NEXT:    ret ptr getelementptr inbounds nuw (i8, ptr @a, i32 5)20;21  %ret = call ptr @stpcpy(ptr @a, ptr @hello)22  ret ptr %ret23}24 25define ptr @test_simplify2() {26; CHECK-LABEL: @test_simplify2(27; CHECK-NEXT:    [[STRLEN:%.*]] = call i32 @strlen(ptr noundef nonnull dereferenceable(1) @a)28; CHECK-NEXT:    [[RET:%.*]] = getelementptr inbounds i8, ptr @a, i32 [[STRLEN]]29; CHECK-NEXT:    ret ptr [[RET]]30;31  %ret = call ptr @stpcpy(ptr @a, ptr @a)32  ret ptr %ret33}34 35define void @test_simplify3(ptr %dst) {36; CHECK-LABEL: @test_simplify3(37; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(6) [[DST:%.*]], ptr noundef nonnull align 1 dereferenceable(6) @hello, i32 6, i1 false)38; CHECK-NEXT:    ret void39;40  call ptr @stpcpy(ptr dereferenceable(80) %dst, ptr @hello)41  ret void42}43 44define ptr @test_no_simplify1() {45; CHECK-LABEL: @test_no_simplify1(46; CHECK-NEXT:    [[RET:%.*]] = call ptr @stpcpy(ptr nonnull @a, ptr nonnull @b)47; CHECK-NEXT:    ret ptr [[RET]]48;49  %ret = call ptr @stpcpy(ptr @a, ptr @b)50  ret ptr %ret51}52 53define ptr @test_no_simplify2(ptr %dst, ptr %src) {54; CHECK-LABEL: @test_no_simplify2(55; CHECK-NEXT:    [[RET:%.*]] = musttail call ptr @stpcpy(ptr [[DST:%.*]], ptr [[SRC:%.*]])56; CHECK-NEXT:    ret ptr [[RET]]57;58  %ret = musttail call ptr @stpcpy(ptr %dst, ptr %src)59  ret ptr %ret60}61 62define ptr @test_no_incompatible_attr() {63; CHECK-LABEL: @test_no_incompatible_attr(64; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(6) @a, ptr noundef nonnull align 1 dereferenceable(6) @hello, i32 6, i1 false)65; CHECK-NEXT:    ret ptr getelementptr inbounds nuw (i8, ptr @a, i32 5)66;67  %ret = call dereferenceable(1) ptr @stpcpy(ptr @a, ptr @hello)68  ret ptr %ret69}70