251 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; Test memset 0 with variable length3;4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s5 6define void @fun0(ptr %Addr, i64 %Len) {7; CHECK-LABEL: fun0:8; CHECK: # %bb.0:9; CHECK-NEXT: aghi %r3, -110; CHECK-NEXT: cgibe %r3, -1, 0(%r14)11; CHECK-NEXT: .LBB0_1:12; CHECK-NEXT: srlg %r0, %r3, 813; CHECK-NEXT: cgije %r0, 0, .LBB0_314; CHECK-NEXT: .LBB0_2: # =>This Inner Loop Header: Depth=115; CHECK-NEXT: xc 0(256,%r2), 0(%r2)16; CHECK-NEXT: la %r2, 256(%r2)17; CHECK-NEXT: brctg %r0, .LBB0_218; CHECK-NEXT: .LBB0_3:19; CHECK-NEXT: exrl %r3, .Ltmp020; CHECK-NEXT: br %r1421 tail call void @llvm.memset.p0.i64(ptr %Addr, i8 0, i64 %Len, i1 false)22 ret void23}24 25define void @fun1(ptr %Addr, i32 %Len) {26; CHECK-LABEL: fun1:27; CHECK: # %bb.0:28; CHECK-NEXT: llgfr %r1, %r329; CHECK-NEXT: aghi %r1, -130; CHECK-NEXT: cgibe %r1, -1, 0(%r14)31; CHECK-NEXT: .LBB1_1:32; CHECK-NEXT: srlg %r0, %r1, 833; CHECK-NEXT: cgije %r0, 0, .LBB1_334; CHECK-NEXT: .LBB1_2: # =>This Inner Loop Header: Depth=135; CHECK-NEXT: xc 0(256,%r2), 0(%r2)36; CHECK-NEXT: la %r2, 256(%r2)37; CHECK-NEXT: brctg %r0, .LBB1_238; CHECK-NEXT: .LBB1_3:39; CHECK-NEXT: exrl %r1, .Ltmp040; CHECK-NEXT: br %r1441 tail call void @llvm.memset.p0.i32(ptr %Addr, i8 0, i32 %Len, i1 false)42 ret void43}44 45; Test that identical target instructions get reused.46define void @fun2(ptr %Addr, i32 %Len) {47; CHECK-LABEL: fun2:48; CHECK: # %bb.0:49; CHECK-NEXT: llgfr %r1, %r350; CHECK-NEXT: aghi %r1, -151; CHECK-NEXT: cgije %r1, -1, .LBB2_452; CHECK-NEXT: # %bb.1:53; CHECK-NEXT: srlg %r0, %r1, 854; CHECK-NEXT: lgr %r3, %r255; CHECK-NEXT: cgije %r0, 0, .LBB2_356; CHECK-NEXT: .LBB2_2: # =>This Inner Loop Header: Depth=157; CHECK-NEXT: xc 0(256,%r3), 0(%r3)58; CHECK-NEXT: la %r3, 256(%r3)59; CHECK-NEXT: brctg %r0, .LBB2_260; CHECK-NEXT: .LBB2_3:61; CHECK-NEXT: exrl %r1, .Ltmp162; CHECK-NEXT: .LBB2_4:63; CHECK-NEXT: cgije %r1, -1, .LBB2_864; CHECK-NEXT: # %bb.5:65; CHECK-NEXT: srlg %r0, %r1, 866; CHECK-NEXT: lgr %r3, %r267; CHECK-NEXT: cgije %r0, 0, .LBB2_768; CHECK-NEXT: .LBB2_6: # =>This Inner Loop Header: Depth=169; CHECK-NEXT: xc 0(256,%r3), 0(%r3)70; CHECK-NEXT: la %r3, 256(%r3)71; CHECK-NEXT: brctg %r0, .LBB2_672; CHECK-NEXT: .LBB2_7:73; CHECK-NEXT: exrl %r1, .Ltmp174; CHECK-NEXT: .LBB2_8:75; CHECK-NEXT: cgibe %r1, -1, 0(%r14)76; CHECK-NEXT: .LBB2_9:77; CHECK-NEXT: srlg %r0, %r1, 878; CHECK-NEXT: cgije %r0, 0, .LBB2_1179; CHECK-NEXT: .LBB2_10: # =>This Inner Loop Header: Depth=180; CHECK-NEXT: xc 0(256,%r2), 0(%r2)81; CHECK-NEXT: la %r2, 256(%r2)82; CHECK-NEXT: brctg %r0, .LBB2_1083; CHECK-NEXT: .LBB2_11:84; CHECK-NEXT: exrl %r1, .Ltmp085; CHECK-NEXT: br %r1486 tail call void @llvm.memset.p0.i32(ptr %Addr, i8 0, i32 %Len, i1 false)87 tail call void @llvm.memset.p0.i32(ptr %Addr, i8 0, i32 %Len, i1 false)88 tail call void @llvm.memset.p0.i32(ptr %Addr, i8 0, i32 %Len, i1 false)89 ret void90}91 92; Test that a memset to nullptr compiles.93define void @fun3(i64 %Len) {94; CHECK-LABEL: fun3:95; CHECK: # %bb.0:96; CHECK-NEXT: aghi %r2, -197; CHECK-NEXT: cgibe %r2, -1, 0(%r14)98; CHECK-NEXT: .LBB3_1:99; CHECK-NEXT: srlg %r0, %r2, 8100; CHECK-NEXT: lghi %r1, 0101; CHECK-NEXT: cgije %r0, 0, .LBB3_3102; CHECK-NEXT: .LBB3_2: # =>This Inner Loop Header: Depth=1103; CHECK-NEXT: xc 0(256,%r1), 0(%r1)104; CHECK-NEXT: la %r1, 256(%r1)105; CHECK-NEXT: brctg %r0, .LBB3_2106; CHECK-NEXT: .LBB3_3:107; CHECK-NEXT: exrl %r2, .Ltmp2108; CHECK-NEXT: br %r14109 call void @llvm.memset.p0.i64(ptr null, i8 0, i64 %Len, i1 false)110 ret void111}112 113; Test that a memset with a length argument that DAGCombiner will convert114; into a constant get the correct number of bytes set.115@Data = external hidden constant [1024 x i8], align 2116define void @fun4() {117; CHECK-LABEL: fun4:118; CHECK: # %bb.0:119; CHECK-NEXT: larl %r1, Data120; CHECK-NEXT: xc 35(256,%r1), 35(%r1)121; CHECK-NEXT: xc 291(256,%r1), 291(%r1)122; CHECK-NEXT: xc 547(256,%r1), 547(%r1)123; CHECK-NEXT: xc 803(221,%r1), 803(%r1)124; CHECK-NEXT: mvghi 0(%r1), 989125; CHECK-NEXT: br %r14126 call void @llvm.memset.p0.i64(127 ptr getelementptr inbounds ([1024 x i8], ptr @Data, i64 0, i64 35),128 i8 0,129 i64 sub (i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],130 ptr @Data, i64 1, i64 0) to i64), i64 1),131 i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],132 ptr @Data, i64 0, i64 35) to i64), i64 1)),133 i1 false)134 %i11 = getelementptr i8, ptr null,135 i64 sub (i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],136 ptr @Data, i64 1, i64 0) to i64), i64 1),137 i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],138 ptr @Data, i64 0, i64 35) to i64), i64 1))139 store ptr %i11, ptr undef, align 8140 ret void141}142 143; The same, with a resulting constant length of 0.144define void @fun5() {145; CHECK-LABEL: fun5:146; CHECK: # %bb.0:147; CHECK-NEXT: mvghi 0(%r1), 0148; CHECK-NEXT: br %r14149 call void @llvm.memset.p0.i64(150 ptr getelementptr inbounds ([1024 x i8], ptr @Data, i64 0, i64 35),151 i8 0,152 i64 sub (i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],153 ptr @Data, i64 1, i64 35) to i64), i64 1),154 i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],155 ptr @Data, i64 1, i64 35) to i64), i64 1)),156 i1 false)157 %i11 = getelementptr i8, ptr null,158 i64 sub (i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],159 ptr @Data, i64 1, i64 35) to i64), i64 1),160 i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],161 ptr @Data, i64 1, i64 35) to i64), i64 1))162 store ptr %i11, ptr undef, align 8163 ret void164}165 166; The same, with a resulting constant length of 1.167define void @fun6() {168; CHECK-LABEL: fun6:169; CHECK: # %bb.0:170; CHECK-NEXT: larl %r1, Data171; CHECK-NEXT: xc 35(1,%r1), 35(%r1)172; CHECK-NEXT: mvghi 0(%r1), 1173; CHECK-NEXT: br %r14174 call void @llvm.memset.p0.i64(175 ptr getelementptr inbounds ([1024 x i8], ptr @Data, i64 0, i64 35),176 i8 0,177 i64 sub (i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],178 ptr @Data, i64 1, i64 36) to i64), i64 1),179 i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],180 ptr @Data, i64 1, i64 35) to i64), i64 1)),181 i1 false)182 %i11 = getelementptr i8, ptr null,183 i64 sub (i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],184 ptr @Data, i64 1, i64 36) to i64), i64 1),185 i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],186 ptr @Data, i64 1, i64 35) to i64), i64 1))187 store ptr %i11, ptr undef, align 8188 ret void189}190 191; The same, with a resulting constant length of 256.192define void @fun7() {193; CHECK-LABEL: fun7:194; CHECK: # %bb.0:195; CHECK-NEXT: larl %r1, Data196; CHECK-NEXT: xc 35(256,%r1), 35(%r1)197; CHECK-NEXT: mvghi 0(%r1), 256198; CHECK-NEXT: br %r14199 call void @llvm.memset.p0.i64(200 ptr getelementptr inbounds ([1024 x i8], ptr @Data, i64 0, i64 35),201 i8 0,202 i64 sub (i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],203 ptr @Data, i64 1, i64 291) to i64), i64 1),204 i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],205 ptr @Data, i64 1, i64 35) to i64), i64 1)),206 i1 false)207 %i11 = getelementptr i8, ptr null,208 i64 sub (i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],209 ptr @Data, i64 1, i64 291) to i64), i64 1),210 i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],211 ptr @Data, i64 1, i64 35) to i64), i64 1))212 store ptr %i11, ptr undef, align 8213 ret void214}215 216; The same, with a resulting constant length of 257.217define void @fun8() {218; CHECK-LABEL: fun8:219; CHECK: # %bb.0:220; CHECK-NEXT: larl %r1, Data221; CHECK-NEXT: xc 35(256,%r1), 35(%r1)222; CHECK-NEXT: xc 291(1,%r1), 291(%r1)223; CHECK-NEXT: mvghi 0(%r1), 257224; CHECK-NEXT: br %r14225 call void @llvm.memset.p0.i64(226 ptr getelementptr inbounds ([1024 x i8], ptr @Data, i64 0, i64 35),227 i8 0,228 i64 sub (i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],229 ptr @Data, i64 1, i64 292) to i64), i64 1),230 i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],231 ptr @Data, i64 1, i64 35) to i64), i64 1)),232 i1 false)233 %i11 = getelementptr i8, ptr null,234 i64 sub (i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],235 ptr @Data, i64 1, i64 292) to i64), i64 1),236 i64 add (i64 ptrtoint (ptr getelementptr inbounds ([1024 x i8],237 ptr @Data, i64 1, i64 35) to i64), i64 1))238 store ptr %i11, ptr undef, align 8239 ret void240}241 242; CHECK: .Ltmp2:243; CHECK-NEXT: xc 0(1,%r1), 0(%r1)244; CHECK-NEXT: .Ltmp0:245; CHECK-NEXT: xc 0(1,%r2), 0(%r2)246; CHECK-NEXT: .Ltmp1:247; CHECK-NEXT: xc 0(1,%r3), 0(%r3)248 249declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg)250declare void @llvm.memset.p0.i32(ptr nocapture writeonly, i8, i32, i1 immarg)251