376 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- -verify-machineinstrs | FileCheck %s3; RUN: llc < %s -mtriple=x86_64-- -mattr=slow-incdec -verify-machineinstrs | FileCheck %s --check-prefix SLOW_INC4 5; rdar://71037046 7define void @sub1(ptr nocapture %p, i32 %v) nounwind ssp {8; CHECK-LABEL: sub1:9; CHECK: # %bb.0: # %entry10; CHECK-NEXT: lock subl %esi, (%rdi)11; CHECK-NEXT: retq12;13; SLOW_INC-LABEL: sub1:14; SLOW_INC: # %bb.0: # %entry15; SLOW_INC-NEXT: lock subl %esi, (%rdi)16; SLOW_INC-NEXT: retq17entry:18 %0 = atomicrmw sub ptr %p, i32 %v monotonic19 ret void20}21 22define void @inc4(ptr nocapture %p) nounwind ssp {23; CHECK-LABEL: inc4:24; CHECK: # %bb.0: # %entry25; CHECK-NEXT: lock incq (%rdi)26; CHECK-NEXT: retq27;28; SLOW_INC-LABEL: inc4:29; SLOW_INC: # %bb.0: # %entry30; SLOW_INC-NEXT: lock addq $1, (%rdi)31; SLOW_INC-NEXT: retq32entry:33 %0 = atomicrmw add ptr %p, i64 1 monotonic34 ret void35}36 37define void @add8(ptr nocapture %p) nounwind ssp {38; CHECK-LABEL: add8:39; CHECK: # %bb.0: # %entry40; CHECK-NEXT: lock addq $2, (%rdi)41; CHECK-NEXT: retq42;43; SLOW_INC-LABEL: add8:44; SLOW_INC: # %bb.0: # %entry45; SLOW_INC-NEXT: lock addq $2, (%rdi)46; SLOW_INC-NEXT: retq47entry:48 %0 = atomicrmw add ptr %p, i64 2 monotonic49 ret void50}51 52define void @add4(ptr nocapture %p, i32 %v) nounwind ssp {53; CHECK-LABEL: add4:54; CHECK: # %bb.0: # %entry55; CHECK-NEXT: movslq %esi, %rax56; CHECK-NEXT: lock addq %rax, (%rdi)57; CHECK-NEXT: retq58;59; SLOW_INC-LABEL: add4:60; SLOW_INC: # %bb.0: # %entry61; SLOW_INC-NEXT: movslq %esi, %rax62; SLOW_INC-NEXT: lock addq %rax, (%rdi)63; SLOW_INC-NEXT: retq64entry:65 %0 = sext i32 %v to i64 ; <i64> [#uses=1]66 %1 = atomicrmw add ptr %p, i64 %0 monotonic67 ret void68}69 70define void @inc3(ptr nocapture %p) nounwind ssp {71; CHECK-LABEL: inc3:72; CHECK: # %bb.0: # %entry73; CHECK-NEXT: lock incb (%rdi)74; CHECK-NEXT: retq75;76; SLOW_INC-LABEL: inc3:77; SLOW_INC: # %bb.0: # %entry78; SLOW_INC-NEXT: lock addb $1, (%rdi)79; SLOW_INC-NEXT: retq80entry:81 %0 = atomicrmw add ptr %p, i8 1 monotonic82 ret void83}84 85define void @add7(ptr nocapture %p) nounwind ssp {86; CHECK-LABEL: add7:87; CHECK: # %bb.0: # %entry88; CHECK-NEXT: lock addb $2, (%rdi)89; CHECK-NEXT: retq90;91; SLOW_INC-LABEL: add7:92; SLOW_INC: # %bb.0: # %entry93; SLOW_INC-NEXT: lock addb $2, (%rdi)94; SLOW_INC-NEXT: retq95entry:96 %0 = atomicrmw add ptr %p, i8 2 monotonic97 ret void98}99 100define void @add3(ptr nocapture %p, i32 %v) nounwind ssp {101; CHECK-LABEL: add3:102; CHECK: # %bb.0: # %entry103; CHECK-NEXT: lock addb %sil, (%rdi)104; CHECK-NEXT: retq105;106; SLOW_INC-LABEL: add3:107; SLOW_INC: # %bb.0: # %entry108; SLOW_INC-NEXT: lock addb %sil, (%rdi)109; SLOW_INC-NEXT: retq110entry:111 %0 = trunc i32 %v to i8 ; <i8> [#uses=1]112 %1 = atomicrmw add ptr %p, i8 %0 monotonic113 ret void114}115 116define void @inc2(ptr nocapture %p) nounwind ssp {117; CHECK-LABEL: inc2:118; CHECK: # %bb.0: # %entry119; CHECK-NEXT: lock incw (%rdi)120; CHECK-NEXT: retq121;122; SLOW_INC-LABEL: inc2:123; SLOW_INC: # %bb.0: # %entry124; SLOW_INC-NEXT: lock addw $1, (%rdi)125; SLOW_INC-NEXT: retq126entry:127 %0 = atomicrmw add ptr %p, i16 1 monotonic128 ret void129}130 131define void @add6(ptr nocapture %p) nounwind ssp {132; CHECK-LABEL: add6:133; CHECK: # %bb.0: # %entry134; CHECK-NEXT: lock addw $2, (%rdi)135; CHECK-NEXT: retq136;137; SLOW_INC-LABEL: add6:138; SLOW_INC: # %bb.0: # %entry139; SLOW_INC-NEXT: lock addw $2, (%rdi)140; SLOW_INC-NEXT: retq141entry:142 %0 = atomicrmw add ptr %p, i16 2 monotonic143 ret void144}145 146define void @add2(ptr nocapture %p, i32 %v) nounwind ssp {147; CHECK-LABEL: add2:148; CHECK: # %bb.0: # %entry149; CHECK-NEXT: lock addw %si, (%rdi)150; CHECK-NEXT: retq151;152; SLOW_INC-LABEL: add2:153; SLOW_INC: # %bb.0: # %entry154; SLOW_INC-NEXT: lock addw %si, (%rdi)155; SLOW_INC-NEXT: retq156entry:157 %0 = trunc i32 %v to i16 ; <i16> [#uses=1]158 %1 = atomicrmw add ptr %p, i16 %0 monotonic159 ret void160}161 162define void @inc1(ptr nocapture %p) nounwind ssp {163; CHECK-LABEL: inc1:164; CHECK: # %bb.0: # %entry165; CHECK-NEXT: lock incl (%rdi)166; CHECK-NEXT: retq167;168; SLOW_INC-LABEL: inc1:169; SLOW_INC: # %bb.0: # %entry170; SLOW_INC-NEXT: lock addl $1, (%rdi)171; SLOW_INC-NEXT: retq172entry:173 %0 = atomicrmw add ptr %p, i32 1 monotonic174 ret void175}176 177define void @add5(ptr nocapture %p) nounwind ssp {178; CHECK-LABEL: add5:179; CHECK: # %bb.0: # %entry180; CHECK-NEXT: lock addl $2, (%rdi)181; CHECK-NEXT: retq182;183; SLOW_INC-LABEL: add5:184; SLOW_INC: # %bb.0: # %entry185; SLOW_INC-NEXT: lock addl $2, (%rdi)186; SLOW_INC-NEXT: retq187entry:188 %0 = atomicrmw add ptr %p, i32 2 monotonic189 ret void190}191 192define void @add1(ptr nocapture %p, i32 %v) nounwind ssp {193; CHECK-LABEL: add1:194; CHECK: # %bb.0: # %entry195; CHECK-NEXT: lock addl %esi, (%rdi)196; CHECK-NEXT: retq197;198; SLOW_INC-LABEL: add1:199; SLOW_INC: # %bb.0: # %entry200; SLOW_INC-NEXT: lock addl %esi, (%rdi)201; SLOW_INC-NEXT: retq202entry:203 %0 = atomicrmw add ptr %p, i32 %v monotonic204 ret void205}206 207define void @dec4(ptr nocapture %p) nounwind ssp {208; CHECK-LABEL: dec4:209; CHECK: # %bb.0: # %entry210; CHECK-NEXT: lock decq (%rdi)211; CHECK-NEXT: retq212;213; SLOW_INC-LABEL: dec4:214; SLOW_INC: # %bb.0: # %entry215; SLOW_INC-NEXT: lock subq $1, (%rdi)216; SLOW_INC-NEXT: retq217entry:218 %0 = atomicrmw sub ptr %p, i64 1 monotonic219 ret void220}221 222define void @sub8(ptr nocapture %p) nounwind ssp {223; CHECK-LABEL: sub8:224; CHECK: # %bb.0: # %entry225; CHECK-NEXT: lock subq $2, (%rdi)226; CHECK-NEXT: retq227;228; SLOW_INC-LABEL: sub8:229; SLOW_INC: # %bb.0: # %entry230; SLOW_INC-NEXT: lock subq $2, (%rdi)231; SLOW_INC-NEXT: retq232entry:233 %0 = atomicrmw sub ptr %p, i64 2 monotonic234 ret void235}236 237define void @sub4(ptr nocapture %p, i32 %v) nounwind ssp {238; CHECK-LABEL: sub4:239; CHECK: # %bb.0: # %entry240; CHECK-NEXT: movslq %esi, %rax241; CHECK-NEXT: lock subq %rax, (%rdi)242; CHECK-NEXT: retq243;244; SLOW_INC-LABEL: sub4:245; SLOW_INC: # %bb.0: # %entry246; SLOW_INC-NEXT: movslq %esi, %rax247; SLOW_INC-NEXT: lock subq %rax, (%rdi)248; SLOW_INC-NEXT: retq249entry:250 %0 = sext i32 %v to i64 ; <i64> [#uses=1]251 %1 = atomicrmw sub ptr %p, i64 %0 monotonic252 ret void253}254 255define void @dec3(ptr nocapture %p) nounwind ssp {256; CHECK-LABEL: dec3:257; CHECK: # %bb.0: # %entry258; CHECK-NEXT: lock decb (%rdi)259; CHECK-NEXT: retq260;261; SLOW_INC-LABEL: dec3:262; SLOW_INC: # %bb.0: # %entry263; SLOW_INC-NEXT: lock subb $1, (%rdi)264; SLOW_INC-NEXT: retq265entry:266 %0 = atomicrmw sub ptr %p, i8 1 monotonic267 ret void268}269 270define void @sub7(ptr nocapture %p) nounwind ssp {271; CHECK-LABEL: sub7:272; CHECK: # %bb.0: # %entry273; CHECK-NEXT: lock subb $2, (%rdi)274; CHECK-NEXT: retq275;276; SLOW_INC-LABEL: sub7:277; SLOW_INC: # %bb.0: # %entry278; SLOW_INC-NEXT: lock subb $2, (%rdi)279; SLOW_INC-NEXT: retq280entry:281 %0 = atomicrmw sub ptr %p, i8 2 monotonic282 ret void283}284 285define void @sub3(ptr nocapture %p, i32 %v) nounwind ssp {286; CHECK-LABEL: sub3:287; CHECK: # %bb.0: # %entry288; CHECK-NEXT: lock subb %sil, (%rdi)289; CHECK-NEXT: retq290;291; SLOW_INC-LABEL: sub3:292; SLOW_INC: # %bb.0: # %entry293; SLOW_INC-NEXT: lock subb %sil, (%rdi)294; SLOW_INC-NEXT: retq295entry:296 %0 = trunc i32 %v to i8 ; <i8> [#uses=1]297 %1 = atomicrmw sub ptr %p, i8 %0 monotonic298 ret void299}300 301define void @dec2(ptr nocapture %p) nounwind ssp {302; CHECK-LABEL: dec2:303; CHECK: # %bb.0: # %entry304; CHECK-NEXT: lock decw (%rdi)305; CHECK-NEXT: retq306;307; SLOW_INC-LABEL: dec2:308; SLOW_INC: # %bb.0: # %entry309; SLOW_INC-NEXT: lock subw $1, (%rdi)310; SLOW_INC-NEXT: retq311entry:312 %0 = atomicrmw sub ptr %p, i16 1 monotonic313 ret void314}315 316define void @sub6(ptr nocapture %p) nounwind ssp {317; CHECK-LABEL: sub6:318; CHECK: # %bb.0: # %entry319; CHECK-NEXT: lock subw $2, (%rdi)320; CHECK-NEXT: retq321;322; SLOW_INC-LABEL: sub6:323; SLOW_INC: # %bb.0: # %entry324; SLOW_INC-NEXT: lock subw $2, (%rdi)325; SLOW_INC-NEXT: retq326entry:327 %0 = atomicrmw sub ptr %p, i16 2 monotonic328 ret void329}330 331define void @sub2(ptr nocapture %p, i32 %v) nounwind ssp {332; CHECK-LABEL: sub2:333; CHECK: # %bb.0: # %entry334; CHECK-NEXT: lock subw %si, (%rdi)335; CHECK-NEXT: retq336;337; SLOW_INC-LABEL: sub2:338; SLOW_INC: # %bb.0: # %entry339; SLOW_INC-NEXT: lock subw %si, (%rdi)340; SLOW_INC-NEXT: retq341entry:342 %0 = trunc i32 %v to i16 ; <i16> [#uses=1]343 %1 = atomicrmw sub ptr %p, i16 %0 monotonic344 ret void345}346 347define void @dec1(ptr nocapture %p) nounwind ssp {348; CHECK-LABEL: dec1:349; CHECK: # %bb.0: # %entry350; CHECK-NEXT: lock decl (%rdi)351; CHECK-NEXT: retq352;353; SLOW_INC-LABEL: dec1:354; SLOW_INC: # %bb.0: # %entry355; SLOW_INC-NEXT: lock subl $1, (%rdi)356; SLOW_INC-NEXT: retq357entry:358 %0 = atomicrmw sub ptr %p, i32 1 monotonic359 ret void360}361 362define void @sub5(ptr nocapture %p) nounwind ssp {363; CHECK-LABEL: sub5:364; CHECK: # %bb.0: # %entry365; CHECK-NEXT: lock subl $2, (%rdi)366; CHECK-NEXT: retq367;368; SLOW_INC-LABEL: sub5:369; SLOW_INC: # %bb.0: # %entry370; SLOW_INC-NEXT: lock subl $2, (%rdi)371; SLOW_INC-NEXT: retq372entry:373 %0 = atomicrmw sub ptr %p, i32 2 monotonic374 ret void375}376