358 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2 3; RUN: llc %s -o - -mtriple=aarch64 -O0 -global-isel=1 -global-isel-abort=1 -mattr=+mops,+mte | FileCheck %s --check-prefix=GISel-O04; RUN: llc %s -o - -mtriple=aarch64 -global-isel=1 -global-isel-abort=1 -mattr=+mops,+mte | FileCheck %s --check-prefix=GISel5; RUN: llc %s -o - -mtriple=aarch64 -O2 -mattr=+mops,+mte | FileCheck %s --check-prefix=SDAG6 7declare ptr @llvm.aarch64.mops.memset.tag(ptr, i8, i64)8 9define ptr @memset_tagged_0_zeroval(ptr %dst, i64 %size) {10; GISel-O0-LABEL: memset_tagged_0_zeroval:11; GISel-O0: // %bb.0: // %entry12; GISel-O0-NEXT: mov x8, xzr13; GISel-O0-NEXT: setgp [x0]!, x8!, x814; GISel-O0-NEXT: setgm [x0]!, x8!, x815; GISel-O0-NEXT: setge [x0]!, x8!, x816; GISel-O0-NEXT: ret17;18; GISel-LABEL: memset_tagged_0_zeroval:19; GISel: // %bb.0: // %entry20; GISel-NEXT: mov x8, xzr21; GISel-NEXT: setgp [x0]!, x8!, xzr22; GISel-NEXT: setgm [x0]!, x8!, xzr23; GISel-NEXT: setge [x0]!, x8!, xzr24; GISel-NEXT: ret25;26; SDAG-LABEL: memset_tagged_0_zeroval:27; SDAG: // %bb.0: // %entry28; SDAG-NEXT: mov x8, xzr29; SDAG-NEXT: setgp [x0]!, x8!, xzr30; SDAG-NEXT: setgm [x0]!, x8!, xzr31; SDAG-NEXT: setge [x0]!, x8!, xzr32; SDAG-NEXT: ret33entry:34 %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 0, i64 0)35 ret ptr %r36}37 38define ptr @memset_tagged_1_zeroval(ptr %dst, i64 %size) {39; GISel-O0-LABEL: memset_tagged_1_zeroval:40; GISel-O0: // %bb.0: // %entry41; GISel-O0-NEXT: mov w8, #142; GISel-O0-NEXT: // kill: def $x8 killed $w843; GISel-O0-NEXT: mov x9, xzr44; GISel-O0-NEXT: setgp [x0]!, x8!, x945; GISel-O0-NEXT: setgm [x0]!, x8!, x946; GISel-O0-NEXT: setge [x0]!, x8!, x947; GISel-O0-NEXT: ret48;49; GISel-LABEL: memset_tagged_1_zeroval:50; GISel: // %bb.0: // %entry51; GISel-NEXT: mov w8, #152; GISel-NEXT: setgp [x0]!, x8!, xzr53; GISel-NEXT: setgm [x0]!, x8!, xzr54; GISel-NEXT: setge [x0]!, x8!, xzr55; GISel-NEXT: ret56;57; SDAG-LABEL: memset_tagged_1_zeroval:58; SDAG: // %bb.0: // %entry59; SDAG-NEXT: mov w8, #160; SDAG-NEXT: setgp [x0]!, x8!, xzr61; SDAG-NEXT: setgm [x0]!, x8!, xzr62; SDAG-NEXT: setge [x0]!, x8!, xzr63; SDAG-NEXT: ret64entry:65 %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 0, i64 1)66 ret ptr %r67}68 69define ptr @memset_tagged_10_zeroval(ptr %dst, i64 %size) {70; GISel-O0-LABEL: memset_tagged_10_zeroval:71; GISel-O0: // %bb.0: // %entry72; GISel-O0-NEXT: mov w8, #1073; GISel-O0-NEXT: // kill: def $x8 killed $w874; GISel-O0-NEXT: mov x9, xzr75; GISel-O0-NEXT: setgp [x0]!, x8!, x976; GISel-O0-NEXT: setgm [x0]!, x8!, x977; GISel-O0-NEXT: setge [x0]!, x8!, x978; GISel-O0-NEXT: ret79;80; GISel-LABEL: memset_tagged_10_zeroval:81; GISel: // %bb.0: // %entry82; GISel-NEXT: mov w8, #1083; GISel-NEXT: setgp [x0]!, x8!, xzr84; GISel-NEXT: setgm [x0]!, x8!, xzr85; GISel-NEXT: setge [x0]!, x8!, xzr86; GISel-NEXT: ret87;88; SDAG-LABEL: memset_tagged_10_zeroval:89; SDAG: // %bb.0: // %entry90; SDAG-NEXT: mov w8, #1091; SDAG-NEXT: setgp [x0]!, x8!, xzr92; SDAG-NEXT: setgm [x0]!, x8!, xzr93; SDAG-NEXT: setge [x0]!, x8!, xzr94; SDAG-NEXT: ret95entry:96 %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 0, i64 10)97 ret ptr %r98}99 100define ptr @memset_tagged_10000_zeroval(ptr %dst, i64 %size) {101; GISel-O0-LABEL: memset_tagged_10000_zeroval:102; GISel-O0: // %bb.0: // %entry103; GISel-O0-NEXT: mov w8, #10000104; GISel-O0-NEXT: // kill: def $x8 killed $w8105; GISel-O0-NEXT: mov x9, xzr106; GISel-O0-NEXT: setgp [x0]!, x8!, x9107; GISel-O0-NEXT: setgm [x0]!, x8!, x9108; GISel-O0-NEXT: setge [x0]!, x8!, x9109; GISel-O0-NEXT: ret110;111; GISel-LABEL: memset_tagged_10000_zeroval:112; GISel: // %bb.0: // %entry113; GISel-NEXT: mov w8, #10000114; GISel-NEXT: setgp [x0]!, x8!, xzr115; GISel-NEXT: setgm [x0]!, x8!, xzr116; GISel-NEXT: setge [x0]!, x8!, xzr117; GISel-NEXT: ret118;119; SDAG-LABEL: memset_tagged_10000_zeroval:120; SDAG: // %bb.0: // %entry121; SDAG-NEXT: mov w8, #10000122; SDAG-NEXT: setgp [x0]!, x8!, xzr123; SDAG-NEXT: setgm [x0]!, x8!, xzr124; SDAG-NEXT: setge [x0]!, x8!, xzr125; SDAG-NEXT: ret126entry:127 %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 0, i64 10000)128 ret ptr %r129}130 131define ptr @memset_tagged_size_zeroval(ptr %dst, i64 %size) {132; GISel-O0-LABEL: memset_tagged_size_zeroval:133; GISel-O0: // %bb.0: // %entry134; GISel-O0-NEXT: mov x8, xzr135; GISel-O0-NEXT: setgp [x0]!, x1!, x8136; GISel-O0-NEXT: setgm [x0]!, x1!, x8137; GISel-O0-NEXT: setge [x0]!, x1!, x8138; GISel-O0-NEXT: ret139;140; GISel-LABEL: memset_tagged_size_zeroval:141; GISel: // %bb.0: // %entry142; GISel-NEXT: setgp [x0]!, x1!, xzr143; GISel-NEXT: setgm [x0]!, x1!, xzr144; GISel-NEXT: setge [x0]!, x1!, xzr145; GISel-NEXT: ret146;147; SDAG-LABEL: memset_tagged_size_zeroval:148; SDAG: // %bb.0: // %entry149; SDAG-NEXT: setgp [x0]!, x1!, xzr150; SDAG-NEXT: setgm [x0]!, x1!, xzr151; SDAG-NEXT: setge [x0]!, x1!, xzr152; SDAG-NEXT: ret153entry:154 %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 0, i64 %size)155 ret ptr %r156}157 158define ptr @memset_tagged_0(ptr %dst, i64 %size, i32 %value) {159; GISel-O0-LABEL: memset_tagged_0:160; GISel-O0: // %bb.0: // %entry161; GISel-O0-NEXT: mov x8, xzr162; GISel-O0-NEXT: // implicit-def: $x9163; GISel-O0-NEXT: mov w9, w2164; GISel-O0-NEXT: setgp [x0]!, x8!, x9165; GISel-O0-NEXT: setgm [x0]!, x8!, x9166; GISel-O0-NEXT: setge [x0]!, x8!, x9167; GISel-O0-NEXT: ret168;169; GISel-LABEL: memset_tagged_0:170; GISel: // %bb.0: // %entry171; GISel-NEXT: mov x8, xzr172; GISel-NEXT: // kill: def $w2 killed $w2 def $x2173; GISel-NEXT: setgp [x0]!, x8!, x2174; GISel-NEXT: setgm [x0]!, x8!, x2175; GISel-NEXT: setge [x0]!, x8!, x2176; GISel-NEXT: ret177;178; SDAG-LABEL: memset_tagged_0:179; SDAG: // %bb.0: // %entry180; SDAG-NEXT: mov x8, xzr181; SDAG-NEXT: // kill: def $w2 killed $w2 def $x2182; SDAG-NEXT: setgp [x0]!, x8!, x2183; SDAG-NEXT: setgm [x0]!, x8!, x2184; SDAG-NEXT: setge [x0]!, x8!, x2185; SDAG-NEXT: ret186entry:187 %value_trunc = trunc i32 %value to i8188 %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 %value_trunc, i64 0)189 ret ptr %r190}191 192define ptr @memset_tagged_1(ptr %dst, i64 %size, i32 %value) {193; GISel-O0-LABEL: memset_tagged_1:194; GISel-O0: // %bb.0: // %entry195; GISel-O0-NEXT: mov w8, #1196; GISel-O0-NEXT: // kill: def $x8 killed $w8197; GISel-O0-NEXT: // implicit-def: $x9198; GISel-O0-NEXT: mov w9, w2199; GISel-O0-NEXT: setgp [x0]!, x8!, x9200; GISel-O0-NEXT: setgm [x0]!, x8!, x9201; GISel-O0-NEXT: setge [x0]!, x8!, x9202; GISel-O0-NEXT: ret203;204; GISel-LABEL: memset_tagged_1:205; GISel: // %bb.0: // %entry206; GISel-NEXT: mov w8, #1207; GISel-NEXT: // kill: def $w2 killed $w2 def $x2208; GISel-NEXT: setgp [x0]!, x8!, x2209; GISel-NEXT: setgm [x0]!, x8!, x2210; GISel-NEXT: setge [x0]!, x8!, x2211; GISel-NEXT: ret212;213; SDAG-LABEL: memset_tagged_1:214; SDAG: // %bb.0: // %entry215; SDAG-NEXT: mov w8, #1216; SDAG-NEXT: // kill: def $w2 killed $w2 def $x2217; SDAG-NEXT: setgp [x0]!, x8!, x2218; SDAG-NEXT: setgm [x0]!, x8!, x2219; SDAG-NEXT: setge [x0]!, x8!, x2220; SDAG-NEXT: ret221entry:222 %value_trunc = trunc i32 %value to i8223 %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 %value_trunc, i64 1)224 ret ptr %r225}226 227define ptr @memset_tagged_10(ptr %dst, i64 %size, i32 %value) {228; GISel-O0-LABEL: memset_tagged_10:229; GISel-O0: // %bb.0: // %entry230; GISel-O0-NEXT: mov w8, #10231; GISel-O0-NEXT: // kill: def $x8 killed $w8232; GISel-O0-NEXT: // implicit-def: $x9233; GISel-O0-NEXT: mov w9, w2234; GISel-O0-NEXT: setgp [x0]!, x8!, x9235; GISel-O0-NEXT: setgm [x0]!, x8!, x9236; GISel-O0-NEXT: setge [x0]!, x8!, x9237; GISel-O0-NEXT: ret238;239; GISel-LABEL: memset_tagged_10:240; GISel: // %bb.0: // %entry241; GISel-NEXT: mov w8, #10242; GISel-NEXT: // kill: def $w2 killed $w2 def $x2243; GISel-NEXT: setgp [x0]!, x8!, x2244; GISel-NEXT: setgm [x0]!, x8!, x2245; GISel-NEXT: setge [x0]!, x8!, x2246; GISel-NEXT: ret247;248; SDAG-LABEL: memset_tagged_10:249; SDAG: // %bb.0: // %entry250; SDAG-NEXT: mov w8, #10251; SDAG-NEXT: // kill: def $w2 killed $w2 def $x2252; SDAG-NEXT: setgp [x0]!, x8!, x2253; SDAG-NEXT: setgm [x0]!, x8!, x2254; SDAG-NEXT: setge [x0]!, x8!, x2255; SDAG-NEXT: ret256entry:257 %value_trunc = trunc i32 %value to i8258 %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 %value_trunc, i64 10)259 ret ptr %r260}261 262define ptr @memset_tagged_10000(ptr %dst, i64 %size, i32 %value) {263; GISel-O0-LABEL: memset_tagged_10000:264; GISel-O0: // %bb.0: // %entry265; GISel-O0-NEXT: mov w8, #10000266; GISel-O0-NEXT: // kill: def $x8 killed $w8267; GISel-O0-NEXT: // implicit-def: $x9268; GISel-O0-NEXT: mov w9, w2269; GISel-O0-NEXT: setgp [x0]!, x8!, x9270; GISel-O0-NEXT: setgm [x0]!, x8!, x9271; GISel-O0-NEXT: setge [x0]!, x8!, x9272; GISel-O0-NEXT: ret273;274; GISel-LABEL: memset_tagged_10000:275; GISel: // %bb.0: // %entry276; GISel-NEXT: mov w8, #10000277; GISel-NEXT: // kill: def $w2 killed $w2 def $x2278; GISel-NEXT: setgp [x0]!, x8!, x2279; GISel-NEXT: setgm [x0]!, x8!, x2280; GISel-NEXT: setge [x0]!, x8!, x2281; GISel-NEXT: ret282;283; SDAG-LABEL: memset_tagged_10000:284; SDAG: // %bb.0: // %entry285; SDAG-NEXT: mov w8, #10000286; SDAG-NEXT: // kill: def $w2 killed $w2 def $x2287; SDAG-NEXT: setgp [x0]!, x8!, x2288; SDAG-NEXT: setgm [x0]!, x8!, x2289; SDAG-NEXT: setge [x0]!, x8!, x2290; SDAG-NEXT: ret291entry:292 %value_trunc = trunc i32 %value to i8293 %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 %value_trunc, i64 10000)294 ret ptr %r295}296 297define ptr @memset_tagged_size(ptr %dst, i64 %size, i32 %value) {298; GISel-O0-LABEL: memset_tagged_size:299; GISel-O0: // %bb.0: // %entry300; GISel-O0-NEXT: // implicit-def: $x8301; GISel-O0-NEXT: mov w8, w2302; GISel-O0-NEXT: setgp [x0]!, x1!, x8303; GISel-O0-NEXT: setgm [x0]!, x1!, x8304; GISel-O0-NEXT: setge [x0]!, x1!, x8305; GISel-O0-NEXT: ret306;307; GISel-LABEL: memset_tagged_size:308; GISel: // %bb.0: // %entry309; GISel-NEXT: // kill: def $w2 killed $w2 def $x2310; GISel-NEXT: setgp [x0]!, x1!, x2311; GISel-NEXT: setgm [x0]!, x1!, x2312; GISel-NEXT: setge [x0]!, x1!, x2313; GISel-NEXT: ret314;315; SDAG-LABEL: memset_tagged_size:316; SDAG: // %bb.0: // %entry317; SDAG-NEXT: // kill: def $w2 killed $w2 def $x2318; SDAG-NEXT: setgp [x0]!, x1!, x2319; SDAG-NEXT: setgm [x0]!, x1!, x2320; SDAG-NEXT: setge [x0]!, x1!, x2321; SDAG-NEXT: ret322entry:323 %value_trunc = trunc i32 %value to i8324 %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 %value_trunc, i64 %size)325 ret ptr %r326}327 328define ptr @memset_tagged_size_aligned(ptr %dst, i64 %size, i32 %value) {329; GISel-O0-LABEL: memset_tagged_size_aligned:330; GISel-O0: // %bb.0: // %entry331; GISel-O0-NEXT: // implicit-def: $x8332; GISel-O0-NEXT: mov w8, w2333; GISel-O0-NEXT: setgp [x0]!, x1!, x8334; GISel-O0-NEXT: setgm [x0]!, x1!, x8335; GISel-O0-NEXT: setge [x0]!, x1!, x8336; GISel-O0-NEXT: ret337;338; GISel-LABEL: memset_tagged_size_aligned:339; GISel: // %bb.0: // %entry340; GISel-NEXT: // kill: def $w2 killed $w2 def $x2341; GISel-NEXT: setgp [x0]!, x1!, x2342; GISel-NEXT: setgm [x0]!, x1!, x2343; GISel-NEXT: setge [x0]!, x1!, x2344; GISel-NEXT: ret345;346; SDAG-LABEL: memset_tagged_size_aligned:347; SDAG: // %bb.0: // %entry348; SDAG-NEXT: // kill: def $w2 killed $w2 def $x2349; SDAG-NEXT: setgp [x0]!, x1!, x2350; SDAG-NEXT: setgm [x0]!, x1!, x2351; SDAG-NEXT: setge [x0]!, x1!, x2352; SDAG-NEXT: ret353entry:354 %value_trunc = trunc i32 %value to i8355 %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr align 16 %dst, i8 %value_trunc, i64 %size)356 ret ptr %r357}358