brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.2 KiB · 64ec54a Raw
179 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -aa-pipeline=basic-aa -passes=dse -S | FileCheck %s3target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"4 5declare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i1) nounwind6declare void @llvm.memset.element.unordered.atomic.p0.i64(ptr nocapture, i8, i64, i32) nounwind7declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind8declare void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i32) nounwind9declare void @llvm.init.trampoline(ptr, ptr, ptr)10 11 12;; Overwrite of memset by memcpy.13define void @test17(ptr %P, ptr noalias %Q) nounwind ssp {14; CHECK-LABEL: @test17(15; CHECK-NEXT:    tail call void @llvm.memcpy.p0.p0.i64(ptr [[P:%.*]], ptr [[Q:%.*]], i64 12, i1 false)16; CHECK-NEXT:    ret void17;18  tail call void @llvm.memset.p0.i64(ptr %P, i8 42, i64 8, i1 false)19  tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)20  ret void21}22 23;; Overwrite of memset by memcpy.24define void @test17_atomic(ptr %P, ptr noalias %Q) nounwind ssp {25; CHECK-LABEL: @test17_atomic(26; CHECK-NEXT:    tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 [[P:%.*]], ptr align 1 [[Q:%.*]], i64 12, i32 1)27; CHECK-NEXT:    ret void28;29  tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 1 %P, i8 42, i64 8, i32 1)30  tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i32 1)31  ret void32}33 34;; Overwrite of memset by memcpy. Overwrite is stronger atomicity. We can35;; remove the memset.36define void @test17_atomic_weaker(ptr %P, ptr noalias %Q) nounwind ssp {37; CHECK-LABEL: @test17_atomic_weaker(38; CHECK-NEXT:    tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 [[P:%.*]], ptr align 1 [[Q:%.*]], i64 12, i32 1)39; CHECK-NEXT:    ret void40;41  tail call void @llvm.memset.p0.i64(ptr align 1 %P, i8 42, i64 8, i1 false)42  tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i32 1)43  ret void44}45 46;; Overwrite of memset by memcpy. Overwrite is weaker atomicity. We can remove47;; the memset.48define void @test17_atomic_weaker_2(ptr %P, ptr noalias %Q) nounwind ssp {49; CHECK-LABEL: @test17_atomic_weaker_2(50; CHECK-NEXT:    tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[P:%.*]], ptr align 1 [[Q:%.*]], i64 12, i1 false)51; CHECK-NEXT:    ret void52;53  tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 1 %P, i8 42, i64 8, i32 1)54  tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i1 false)55  ret void56}57 58; Should not delete the volatile memset.59define void @test17v(ptr %P, ptr %Q) nounwind ssp {60; CHECK-LABEL: @test17v(61; CHECK-NEXT:    tail call void @llvm.memset.p0.i64(ptr [[P:%.*]], i8 42, i64 8, i1 true)62; CHECK-NEXT:    tail call void @llvm.memcpy.p0.p0.i64(ptr [[P]], ptr [[Q:%.*]], i64 12, i1 false)63; CHECK-NEXT:    ret void64;65  tail call void @llvm.memset.p0.i64(ptr %P, i8 42, i64 8, i1 true)66  tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)67  ret void68}69 70; See PR11763 - LLVM allows memcpy's source and destination to be equal (but not71; inequal and overlapping).72define void @test18(ptr %P, ptr %Q, ptr %R) nounwind ssp {73; CHECK-LABEL: @test18(74; CHECK-NEXT:    tail call void @llvm.memcpy.p0.p0.i64(ptr [[P:%.*]], ptr [[Q:%.*]], i64 12, i1 false)75; CHECK-NEXT:    tail call void @llvm.memcpy.p0.p0.i64(ptr [[P]], ptr [[R:%.*]], i64 12, i1 false)76; CHECK-NEXT:    ret void77;78  tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)79  tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %R, i64 12, i1 false)80  ret void81}82 83define void @test18_atomic(ptr %P, ptr %Q, ptr %R) nounwind ssp {84; CHECK-LABEL: @test18_atomic(85; CHECK-NEXT:    tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 [[P:%.*]], ptr align 1 [[Q:%.*]], i64 12, i32 1)86; CHECK-NEXT:    tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 [[P]], ptr align 1 [[R:%.*]], i64 12, i32 1)87; CHECK-NEXT:    ret void88;89  tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i32 1)90  tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %R, i64 12, i32 1)91  ret void92}93 94define void @test_memset_memcpy_inline(ptr noalias %P, ptr noalias %Q) {95; CHECK-LABEL: @test_memset_memcpy_inline(96; CHECK-NEXT:    tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 1 [[P:%.*]], ptr align 1 [[Q:%.*]], i64 12, i1 false)97; CHECK-NEXT:    ret void98;99  tail call void @llvm.memset.p0.i64(ptr %P, i8 42, i64 8, i1 false)100  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i1 false)101  ret void102}103 104define void @test_store_memcpy_inline(ptr noalias %P, ptr noalias %Q) {105; CHECK-LABEL: @test_store_memcpy_inline(106; CHECK-NEXT:    [[P_4:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 4107; CHECK-NEXT:    store i8 4, ptr [[P_4]], align 1108; CHECK-NEXT:    tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 1 [[P]], ptr align 1 [[Q:%.*]], i64 4, i1 false)109; CHECK-NEXT:    ret void110;111  store i8 0, ptr %P112  %P.1 = getelementptr i8, ptr %P, i64 1113  store i8 1, ptr %P.1114  %P.4 = getelementptr i8, ptr %P, i64 4115  store i8 4, ptr %P.4116  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 4, i1 false)117  ret void118}119 120;; Overwrite of memset.pattern by memcpy.121define void @memset_pattern_overwrite(ptr %P, ptr noalias %Q) nounwind ssp {122; CHECK-LABEL: @memset_pattern_overwrite(123; CHECK-NEXT:    tail call void @llvm.memcpy.p0.p0.i64(ptr [[P:%.*]], ptr [[Q:%.*]], i64 12, i1 false)124; CHECK-NEXT:    ret void125;126  tail call void @llvm.experimental.memset.pattern.p0.i64(ptr %P, i8 42, i64 8, i1 false)127  tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)128  ret void129}130 131define void @memset_pattern_overwrite2(ptr %P, ptr noalias %Q) nounwind ssp {132; CHECK-LABEL: @memset_pattern_overwrite2(133; CHECK-NEXT:    tail call void @llvm.memcpy.p0.p0.i64(ptr [[P:%.*]], ptr [[Q:%.*]], i64 12, i1 false)134; CHECK-NEXT:    ret void135;136  tail call void @llvm.experimental.memset.pattern(ptr %P, i16 270, i64 4, i1 false)137  tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)138  ret void139}140 141define void @memset_pattern_value_noalias(ptr %P, ptr noalias %Q) nounwind ssp {142; CHECK-LABEL: @memset_pattern_value_noalias(143; CHECK-NEXT:    tail call void @llvm.experimental.memset.pattern.p0.p0.i64(ptr [[Q:%.*]], ptr [[P:%.*]], i64 8, i1 false)144; CHECK-NEXT:    tail call void @llvm.memcpy.p0.p0.i64(ptr [[P]], ptr [[Q]], i64 12, i1 false)145; CHECK-NEXT:    ret void146;147  tail call void @llvm.memset.p0.i64(ptr %P, i8 42, i64 8, i1 false)148  tail call void @llvm.experimental.memset.pattern.p0.i64(ptr %Q, ptr %P, i64 8, i1 false)149  tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)150  ret void151}152 153define void @memset_pattern_value_noalias2(ptr %P) nounwind ssp {;154; CHECK-LABEL: @memset_pattern_value_noalias2(155; CHECK-NEXT:    tail call void @llvm.experimental.memset.pattern.p0.p0.i64(ptr [[P:%.*]], ptr [[P]], i64 8, i1 false)156; CHECK-NEXT:    tail call void @llvm.memset.p0.i64(ptr [[P]], i8 42, i64 200, i1 false)157; CHECK-NEXT:    ret void158;159  tail call void @llvm.experimental.memset.pattern.p0.i64(ptr %P, ptr %P, i64 8, i1 false)160  tail call void @llvm.memset.p0.i64(ptr %P, i8 42, i64 200, i1 false)161  ret void162}163 164define void @memset_pattern_value_noalias3(ptr %P) nounwind ssp {165; CHECK-LABEL: @memset_pattern_value_noalias3(166; CHECK-NEXT:    [[Q:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 8167; CHECK-NEXT:    tail call void @llvm.experimental.memset.pattern.p0.p0.i64(ptr [[Q]], ptr [[P]], i64 8, i1 false)168; CHECK-NEXT:    tail call void @llvm.memset.p0.i64(ptr [[Q]], i8 42, i64 200, i1 false)169; CHECK-NEXT:    ret void170;171  %q = getelementptr i8, ptr %P, i32 8172  tail call void @llvm.experimental.memset.pattern.p0.i64(ptr %q, ptr %P, i64 8, i1 false)173  tail call void @llvm.memset.p0.i64(ptr %q, i8 42, i64 200, i1 false)174  ret void175}176 177 178declare void @llvm.memcpy.inline.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64 immarg, i1 immarg)179