190 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2 3; FIXME: These were broken when swapping to MSSA(?). So currently XFAIL:ed.4; XFAIL: *5; RUN: opt < %s -aa-pipeline=basic-aa -passes=dse -S | FileCheck %s6target 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"7 8declare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i1) nounwind9declare void @llvm.memset.element.unordered.atomic.p0.i64(ptr nocapture, i8, i64, i32) nounwind10declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind11declare void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i32) nounwind12 13; PR870114 15;; Fully dead overwrite of memcpy.16define void @test15(ptr %P, ptr %Q) nounwind ssp {17; CHECK-LABEL: @test15(18; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[P:%.*]], ptr [[Q:%.*]], i64 12, i1 false)19; CHECK-NEXT: ret void20;21 tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)22 tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)23 ret void24}25 26;; Fully dead overwrite of memcpy.27define void @test15_atomic(ptr %P, ptr %Q) nounwind ssp {28; CHECK-LABEL: @test15_atomic(29; 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)30; CHECK-NEXT: ret void31;32 tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i32 1)33 tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i32 1)34 ret void35}36 37;; Fully dead overwrite of memcpy.38define void @test15_atomic_weaker(ptr %P, ptr %Q) nounwind ssp {39; CHECK-LABEL: @test15_atomic_weaker(40; 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)41; CHECK-NEXT: ret void42;43 tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i1 false)44 tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i32 1)45 ret void46}47 48;; Fully dead overwrite of memcpy.49define void @test15_atomic_weaker_2(ptr %P, ptr %Q) nounwind ssp {50; CHECK-LABEL: @test15_atomic_weaker_2(51; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[P:%.*]], ptr align 1 [[Q:%.*]], i64 12, i1 false)52; CHECK-NEXT: ret void53;54 tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i32 1)55 tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i1 false)56 ret void57}58 59;; Full overwrite of smaller memcpy.60define void @test16(ptr %P, ptr %Q) nounwind ssp {61; CHECK-LABEL: @test16(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.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 8, i1 false)66 tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)67 ret void68}69 70;; Full overwrite of smaller memcpy.71define void @test16_atomic(ptr %P, ptr %Q) nounwind ssp {72; CHECK-LABEL: @test16_atomic(73; 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)74; CHECK-NEXT: ret void75;76 tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 8, i32 1)77 tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i32 1)78 ret void79}80 81;; Full overwrite of smaller memory where overwrite has stronger atomicity82define void @test16_atomic_weaker(ptr %P, ptr %Q) nounwind ssp {83; CHECK-LABEL: @test16_atomic_weaker(84; 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)85; CHECK-NEXT: ret void86;87 tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 8, i1 false)88 tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i32 1)89 ret void90}91 92;; Full overwrite of smaller memory where overwrite has weaker atomicity.93define void @test16_atomic_weaker_2(ptr %P, ptr %Q) nounwind ssp {94; CHECK-LABEL: @test16_atomic_weaker_2(95; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[P:%.*]], ptr align 1 [[Q:%.*]], i64 12, i1 false)96; CHECK-NEXT: ret void97;98 tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 8, i32 1)99 tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i1 false)100 ret void101}102 103;; Overwrite of memset by memcpy.104define void @test17(ptr %P, ptr noalias %Q) nounwind ssp {105; CHECK-LABEL: @test17(106; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[P:%.*]], ptr [[Q:%.*]], i64 12, i1 false)107; CHECK-NEXT: ret void108;109 tail call void @llvm.memset.p0.i64(ptr %P, i8 42, i64 8, i1 false)110 tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)111 ret void112}113 114;; Overwrite of memset by memcpy.115define void @test17_atomic(ptr %P, ptr noalias %Q) nounwind ssp {116; CHECK-LABEL: @test17_atomic(117; 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)118; CHECK-NEXT: ret void119;120 tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 1 %P, i8 42, i64 8, i32 1)121 tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i32 1)122 ret void123}124 125;; Overwrite of memset by memcpy. Overwrite is stronger atomicity. We can126;; remove the memset.127define void @test17_atomic_weaker(ptr %P, ptr noalias %Q) nounwind ssp {128; CHECK-LABEL: @test17_atomic_weaker(129; 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)130; CHECK-NEXT: ret void131;132 tail call void @llvm.memset.p0.i64(ptr align 1 %P, i8 42, i64 8, i1 false)133 tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i32 1)134 ret void135}136 137;; Overwrite of memset by memcpy. Overwrite is weaker atomicity. We can remove138;; the memset.139define void @test17_atomic_weaker_2(ptr %P, ptr noalias %Q) nounwind ssp {140; CHECK-LABEL: @test17_atomic_weaker_2(141; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[P:%.*]], ptr align 1 [[Q:%.*]], i64 12, i1 false)142; CHECK-NEXT: ret void143;144 tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 1 %P, i8 42, i64 8, i32 1)145 tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i1 false)146 ret void147}148 149; Should not delete the volatile memset.150define void @test17v(ptr %P, ptr %Q) nounwind ssp {151; CHECK-LABEL: @test17v(152; CHECK-NEXT: tail call void @llvm.memset.p0.i64(ptr [[P:%.*]], i8 42, i64 8, i1 true)153; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[P]], ptr [[Q:%.*]], i64 12, i1 false)154; CHECK-NEXT: ret void155;156 tail call void @llvm.memset.p0.i64(ptr %P, i8 42, i64 8, i1 true)157 tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)158 ret void159}160 161; PR8728162; Do not delete instruction where possible situation is:163; A = B164; A = A165;166; NB! See PR11763 - currently LLVM allows memcpy's source and destination to be167; equal (but not inequal and overlapping).168define void @test18(ptr %P, ptr %Q, ptr %R) nounwind ssp {169; CHECK-LABEL: @test18(170; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[P:%.*]], ptr [[Q:%.*]], i64 12, i1 false)171; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[P]], ptr [[R:%.*]], i64 12, i1 false)172; CHECK-NEXT: ret void173;174 tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)175 tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %R, i64 12, i1 false)176 ret void177}178 179define void @test18_atomic(ptr %P, ptr %Q, ptr %R) nounwind ssp {180; CHECK-LABEL: @test18_atomic(181; 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)182; 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)183; CHECK-NEXT: ret void184;185 tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i32 1)186 tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %R, i64 12, i32 1)187 ret void188}189 190