brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.8 KiB · 70c8fe6 Raw
132 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=globalopt -S %s | FileCheck %s3 4%struct.global.20ptr = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }5 6@global.20ptr = internal unnamed_addr global %struct.global.20ptr zeroinitializer7 8declare i32 @fn0()9 10declare i32 @fn1()11 12declare i32 @fn2()13 14declare i32 @fn3()15 16declare void @llvm.memcpy.p0i8.p0i8.i64(ptr, ptr, i64, i1) local_unnamed_addr17 18define void @stores_single_use_gep_constexpr() {19; CHECK-LABEL: @stores_single_use_gep_constexpr(20; CHECK-NEXT:  entry:21; CHECK-NEXT:    ret void22;23entry:24  store ptr @fn0, ptr @global.20ptr, align 825  store ptr @fn1, ptr getelementptr inbounds (%struct.global.20ptr, ptr @global.20ptr, i64 0, i32 1), align 826  store ptr @fn2, ptr getelementptr inbounds (%struct.global.20ptr, ptr @global.20ptr, i64 0, i32 2), align 827  store ptr @fn3, ptr getelementptr inbounds (%struct.global.20ptr, ptr @global.20ptr, i64 0, i32 3), align 828  store ptr @fn0, ptr getelementptr inbounds (%struct.global.20ptr, ptr @global.20ptr, i64 0, i32 4), align 829  store ptr @fn1, ptr getelementptr inbounds (%struct.global.20ptr, ptr @global.20ptr, i64 0, i32 5), align 830  store ptr @fn2, ptr getelementptr inbounds (%struct.global.20ptr, ptr @global.20ptr, i64 0, i32 6), align 831  store ptr @fn3, ptr getelementptr inbounds (%struct.global.20ptr, ptr @global.20ptr, i64 0, i32 7), align 832  store ptr @fn0, ptr getelementptr inbounds (%struct.global.20ptr, ptr @global.20ptr, i64 0, i32 8), align 833  ret void34}35 36define void @stores_multi_use_gep_constexpr() {37; CHECK-LABEL: @stores_multi_use_gep_constexpr(38; CHECK-NEXT:  entry:39; CHECK-NEXT:    ret void40;41entry:42  store i32 0, ptr getelementptr inbounds (%struct.global.20ptr, ptr @global.20ptr, i64 0, i32 16), align 843  store i32 0, ptr getelementptr inbounds (%struct.global.20ptr, ptr @global.20ptr, i64 0, i32 16), align 844  ret void45}46 47@gv = internal unnamed_addr global [3 x ptr] zeroinitializer, align 1648@gv2 = internal unnamed_addr global i32 0, align 449 50;; This is a negative test which includes a load from @gv. No stores51;; or memintrinsics with destination @gv should be removed.52define i32 @load_from_gv_no_remove() local_unnamed_addr {53; CHECK-LABEL: @load_from_gv_no_remove(54; CHECK-NEXT:  entry:55; CHECK-NEXT:    [[E:%.*]] = alloca i32, align 456; CHECK-NEXT:    store ptr [[E]], ptr getelementptr inbounds ([3 x ptr], ptr @gv, i64 0, i64 2), align 1657; CHECK-NEXT:    [[LOAD_B:%.*]] = load ptr, ptr getelementptr inbounds ([3 x ptr], ptr @gv, i64 0, i64 2), align 1658; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr @gv, ptr @gv2, i64 8, i1 false)59; CHECK-NEXT:    ret i32 060;61entry:62  %e = alloca i32, align 463  store ptr %e, ptr getelementptr inbounds ([3 x ptr], ptr @gv, i64 0, i64 2), align 1664  %load.b = load ptr, ptr getelementptr inbounds ([3 x ptr], ptr @gv, i64 0, i64 2), align 1665  call void @llvm.memcpy.p0i8.p0i8.i64(ptr getelementptr inbounds ([3 x ptr], ptr @gv, i64 0, i64 0), ptr @gv2, i64 8, i1 false)66  ret i32 067}68 69@a = internal unnamed_addr global i32 0, align 470@b = internal unnamed_addr global [3 x ptr] zeroinitializer, align 1671 72;; This test is extracted from the issue reported in #64680, with an73;; additional memcpy and a memset. Ensure all stores and memintrinsics with74;; destination @b are removed as @b is dead.75define i32 @load_gv_from_op_remove_store(ptr %p) local_unnamed_addr {76; CHECK-LABEL: @load_gv_from_op_remove_store(77; CHECK-NEXT:  entry:78; CHECK-NEXT:    [[E:%.*]] = alloca i32, align 479; CHECK-NEXT:    [[DOTPR:%.*]] = load i32, ptr @a, align 480; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[DOTPR]], 381; CHECK-NEXT:    br i1 [[CMP1]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]82; CHECK:       for.body:83; CHECK-NEXT:    store i32 8, ptr [[E]], align 484; CHECK-NEXT:    call void @fn1()85; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[E]], align 486; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 087; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]88; CHECK:       if.then:89; CHECK-NEXT:    call void @fn0()90; CHECK-NEXT:    br label [[IF_END]]91; CHECK:       if.end:92; CHECK-NEXT:    store ptr [[E]], ptr getelementptr inbounds ([3 x ptr], ptr @b, i64 0, i64 2), align 1693; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr @a, align 494; CHECK-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP1]], 195; CHECK-NEXT:    store i32 [[INC]], ptr @a, align 496; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[TMP1]], 297; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END]]98; CHECK:       for.end:99; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr @b, ptr [[P:%.*]], i64 8, i1 false)100; CHECK-NEXT:    ret i32 0101;102entry:103  %e = alloca i32, align 4104  %.pr = load i32, ptr @a, align 4105  %cmp1 = icmp slt i32 %.pr, 3106  br i1 %cmp1, label %for.body, label %for.end107 108for.body:                                         ; preds = %entry, %if.end109  store i32 8, ptr %e, align 4110  call void @fn1()111  %0 = load i32, ptr %e, align 4112  %tobool.not = icmp eq i32 %0, 0113  br i1 %tobool.not, label %if.then, label %if.end114 115if.then:                                          ; preds = %for.body116  call void @fn0()117  br label %if.end118 119if.end:                                           ; preds = %if.then, %for.body120  store ptr %e, ptr getelementptr inbounds ([3 x ptr], ptr @b, i64 0, i64 2), align 16121  %1 = load i32, ptr @a, align 4122  %inc = add nsw i32 %1, 1123  store i32 %inc, ptr @a, align 4124  %cmp = icmp slt i32 %1, 2125  call void @llvm.memset.p0i8.i64(ptr getelementptr inbounds ([3 x ptr], ptr @b, i64 0, i64 0), i8 0, i64 8, i1 false)126  br i1 %cmp, label %for.body, label %for.end127 128for.end:                                          ; preds = %if.end, %entry129  call void @llvm.memcpy.p0i8.p0i8.i64(ptr getelementptr inbounds ([3 x ptr], ptr @b, i64 0, i64 0), ptr %p, i64 8, i1 false)130  ret i32 0131}132