brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · 1fa0521 Raw
153 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=dse -enable-dse-partial-store-merging -S < %s | FileCheck %s3target datalayout = "E-m:e-i64:64-i128:128-n32:64-S128"4 5define void @byte_by_byte_replacement(ptr %ptr) {6; CHECK-LABEL: @byte_by_byte_replacement(7; CHECK-NEXT:  entry:8; CHECK-NEXT:    store i32 151653132, ptr [[PTR:%.*]]9; CHECK-NEXT:    ret void10;11entry:12  ;; This store's value should be modified as it should be better to use one13  ;; larger store than several smaller ones.14  ;; store will turn into 0x090A0B0C == 15165313215  store i32 305419896, ptr %ptr  ; 0x1234567816  %bptr1 = getelementptr inbounds i8, ptr %ptr, i64 117  %bptr2 = getelementptr inbounds i8, ptr %ptr, i64 218  %bptr3 = getelementptr inbounds i8, ptr %ptr, i64 319 20  ;; We should be able to merge these four stores with the i32 above21  ; value (and bytes) stored before  ; 0x1234567822  store i8 9, ptr %ptr              ;   0923  store i8 10, ptr %bptr1            ;     0A24  store i8 11, ptr %bptr2            ;       0B25  store i8 12, ptr %bptr3            ;         0C26  ;                                    0x090A0B0C27 28  ret void29}30 31define void @word_replacement(ptr %ptr) {32; CHECK-LABEL: @word_replacement(33; CHECK-NEXT:  entry:34; CHECK-NEXT:    store i64 72638273700655232, ptr [[PTR:%.*]]35; CHECK-NEXT:    ret void36;37entry:38  store i64 72623859790382856, ptr %ptr  ; 0x010203040506070839 40  %wptr1 = getelementptr inbounds i16, ptr %ptr, i64 141  %wptr3 = getelementptr inbounds i16, ptr %ptr, i64 342 43  ;; We should be able to merge these two stores with the i64 one above44  ; value (and bytes) stored before  ; 0x010203040506070845  store i16  4128, ptr %wptr1       ;       102046  store i16 28800, ptr %wptr3       ;               708047  ;                                    0x010210200506708048 49  ret void50}51 52 53define void @differently_sized_replacements(ptr %ptr) {54; CHECK-LABEL: @differently_sized_replacements(55; CHECK-NEXT:  entry:56; CHECK-NEXT:    store i64 289077004501059343, ptr [[PTR:%.*]]57; CHECK-NEXT:    ret void58;59entry:60  store i64 579005069656919567, ptr %ptr  ; 0x08090a0b0c0d0e0f61 62  %bptr6 = getelementptr inbounds i8, ptr %ptr, i64 663  %wptr2 = getelementptr inbounds i16, ptr %ptr, i64 264 65  ;; We should be able to merge all these stores with the i64 one above66  ; value (and bytes) stored before  ; 0x08090a0b0c0d0e0f67  store i8         7, ptr  %bptr6    ;               0768  store i16     1541, ptr %wptr2    ;           060569  store i32 67305985, ptr %ptr     ;   0403020170  ;                                    0x040302010605070f71  ret void72}73 74 75define void @multiple_replacements_to_same_byte(ptr %ptr) {76; CHECK-LABEL: @multiple_replacements_to_same_byte(77; CHECK-NEXT:  entry:78; CHECK-NEXT:    store i64 289077004602248719, ptr [[PTR:%.*]]79; CHECK-NEXT:    ret void80;81entry:82  store i64 579005069656919567, ptr %ptr  ; 0x08090a0b0c0d0e0f83 84  %bptr3 = getelementptr inbounds i8, ptr %ptr, i64 385  %wptr1 = getelementptr inbounds i16, ptr %ptr, i64 186 87  ;; We should be able to merge all these stores with the i64 one above88  ; value (and bytes) stored before  ; 0x08090a0b0c0d0e0f89  store i8         7, ptr  %bptr3    ;         0790  store i16     1541, ptr %wptr1    ;       060591  store i32 67305985, ptr %ptr     ;   0403020192  ;                                    0x040302010c0d0e0f93  ret void94}95 96define void @merged_merges(ptr %ptr) {97; CHECK-LABEL: @merged_merges(98; CHECK-NEXT:  entry:99; CHECK-NEXT:    store i64 289081428418563599, ptr [[PTR:%.*]]100; CHECK-NEXT:    ret void101;102entry:103  store i64 579005069656919567, ptr %ptr  ; 0x08090a0b0c0d0e0f104 105  %bptr3 = getelementptr inbounds i8, ptr %ptr, i64 3106  %wptr1 = getelementptr inbounds i16, ptr %ptr, i64 1107 108  ;; We should be able to merge all these stores with the i64 one above109  ; value (not bytes) stored before  ; 0x08090a0b0c0d0e0f110  store i32 67305985, ptr %ptr     ;   04030201111  store i16     1541, ptr %wptr1    ;       0605112  store i8         7, ptr  %bptr3    ;         07113  ;                                    0x040306070c0d0e0f114  ret void115}116 117define signext i8 @shouldnt_merge_since_theres_a_full_overlap(ptr %ptr) {118; CHECK-LABEL: @shouldnt_merge_since_theres_a_full_overlap(119; CHECK-NEXT:  entry:120; CHECK-NEXT:    [[BPTRM1:%.*]] = getelementptr inbounds i8, ptr [[PTR:%.*]], i64 -1121; CHECK-NEXT:    [[BPTR3:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 3122; CHECK-NEXT:    store i32 1234, ptr [[BPTRM1]], align 1123; CHECK-NEXT:    store i64 5678, ptr [[BPTR3]], align 1124; CHECK-NEXT:    ret i8 0125;126entry:127 128  store i64 0, ptr %ptr129 130  %bptrm1 = getelementptr inbounds i8, ptr %ptr, i64 -1131  %bptr3 = getelementptr inbounds i8, ptr %ptr, i64 3132 133  store i32 1234, ptr %bptrm1, align 1134  store i64 5678, ptr %bptr3, align 1135 136  ret i8 0137}138 139;; Test case from PR31777140%union.U = type { i64 }141 142define void @foo(ptr nocapture %u) {143; CHECK-LABEL: @foo(144; CHECK-NEXT:  entry:145; CHECK-NEXT:    store i64 11821949021847552, ptr [[U:%.*]], align 8146; CHECK-NEXT:    ret void147;148entry:149  store i64 0, ptr %u, align 8150  store i16 42, ptr %u, align 8151  ret void152}153