451 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 -mattr=-32s,+d < %s | FileCheck %s --check-prefixes=ALL,LA32R3; RUN: llc --mtriple=loongarch32 -mattr=+32s,+d < %s | FileCheck %s --check-prefixes=ALL,LA32S4; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefixes=ALL,LA645 6define void @foo() noreturn nounwind {7; ALL-LABEL: foo:8; ALL: # %bb.0: # %entry9; ALL-NEXT: .p2align 4, , 1610; ALL-NEXT: .LBB0_1: # %loop11; ALL-NEXT: # =>This Inner Loop Header: Depth=112; ALL-NEXT: b .LBB0_113entry:14 br label %loop15loop:16 br label %loop17}18 19define void @foo_br_eq(i32 %a, ptr %b) nounwind {20; LA32R-LABEL: foo_br_eq:21; LA32R: # %bb.0:22; LA32R-NEXT: ld.w $a2, $a1, 023; LA32R-NEXT: beq $a2, $a0, .LBB1_224; LA32R-NEXT: # %bb.1: # %test25; LA32R-NEXT: ld.w $zero, $a1, 026; LA32R-NEXT: .LBB1_2: # %end27; LA32R-NEXT: ret28;29; LA32S-LABEL: foo_br_eq:30; LA32S: # %bb.0:31; LA32S-NEXT: ld.w $a2, $a1, 032; LA32S-NEXT: beq $a2, $a0, .LBB1_233; LA32S-NEXT: # %bb.1: # %test34; LA32S-NEXT: ld.w $zero, $a1, 035; LA32S-NEXT: .LBB1_2: # %end36; LA32S-NEXT: ret37;38; LA64-LABEL: foo_br_eq:39; LA64: # %bb.0:40; LA64-NEXT: ld.w $a2, $a1, 041; LA64-NEXT: addi.w $a0, $a0, 042; LA64-NEXT: beq $a2, $a0, .LBB1_243; LA64-NEXT: # %bb.1: # %test44; LA64-NEXT: ld.w $zero, $a1, 045; LA64-NEXT: .LBB1_2: # %end46; LA64-NEXT: ret47 %val = load volatile i32, ptr %b48 %cc = icmp eq i32 %val, %a49 br i1 %cc, label %end, label %test50test:51 %tmp = load volatile i32, ptr %b52 br label %end53 54end:55 ret void56}57 58define void @foo_br_ne(i32 %a, ptr %b) nounwind {59; LA32R-LABEL: foo_br_ne:60; LA32R: # %bb.0:61; LA32R-NEXT: ld.w $a2, $a1, 062; LA32R-NEXT: bne $a2, $a0, .LBB2_263; LA32R-NEXT: # %bb.1: # %test64; LA32R-NEXT: ld.w $zero, $a1, 065; LA32R-NEXT: .LBB2_2: # %end66; LA32R-NEXT: ret67;68; LA32S-LABEL: foo_br_ne:69; LA32S: # %bb.0:70; LA32S-NEXT: ld.w $a2, $a1, 071; LA32S-NEXT: bne $a2, $a0, .LBB2_272; LA32S-NEXT: # %bb.1: # %test73; LA32S-NEXT: ld.w $zero, $a1, 074; LA32S-NEXT: .LBB2_2: # %end75; LA32S-NEXT: ret76;77; LA64-LABEL: foo_br_ne:78; LA64: # %bb.0:79; LA64-NEXT: ld.w $a2, $a1, 080; LA64-NEXT: addi.w $a0, $a0, 081; LA64-NEXT: bne $a2, $a0, .LBB2_282; LA64-NEXT: # %bb.1: # %test83; LA64-NEXT: ld.w $zero, $a1, 084; LA64-NEXT: .LBB2_2: # %end85; LA64-NEXT: ret86 %val = load volatile i32, ptr %b87 %cc = icmp ne i32 %val, %a88 br i1 %cc, label %end, label %test89test:90 %tmp = load volatile i32, ptr %b91 br label %end92 93end:94 ret void95}96 97define void @foo_br_slt(i32 %a, ptr %b) nounwind {98; LA32R-LABEL: foo_br_slt:99; LA32R: # %bb.0:100; LA32R-NEXT: ld.w $a2, $a1, 0101; LA32R-NEXT: blt $a2, $a0, .LBB3_2102; LA32R-NEXT: # %bb.1: # %test103; LA32R-NEXT: ld.w $zero, $a1, 0104; LA32R-NEXT: .LBB3_2: # %end105; LA32R-NEXT: ret106;107; LA32S-LABEL: foo_br_slt:108; LA32S: # %bb.0:109; LA32S-NEXT: ld.w $a2, $a1, 0110; LA32S-NEXT: blt $a2, $a0, .LBB3_2111; LA32S-NEXT: # %bb.1: # %test112; LA32S-NEXT: ld.w $zero, $a1, 0113; LA32S-NEXT: .LBB3_2: # %end114; LA32S-NEXT: ret115;116; LA64-LABEL: foo_br_slt:117; LA64: # %bb.0:118; LA64-NEXT: ld.w $a2, $a1, 0119; LA64-NEXT: addi.w $a0, $a0, 0120; LA64-NEXT: blt $a2, $a0, .LBB3_2121; LA64-NEXT: # %bb.1: # %test122; LA64-NEXT: ld.w $zero, $a1, 0123; LA64-NEXT: .LBB3_2: # %end124; LA64-NEXT: ret125 %val = load volatile i32, ptr %b126 %cc = icmp slt i32 %val, %a127 br i1 %cc, label %end, label %test128test:129 %tmp = load volatile i32, ptr %b130 br label %end131 132end:133 ret void134}135 136define void @foo_br_sge(i32 %a, ptr %b) nounwind {137; LA32R-LABEL: foo_br_sge:138; LA32R: # %bb.0:139; LA32R-NEXT: ld.w $a2, $a1, 0140; LA32R-NEXT: bge $a2, $a0, .LBB4_2141; LA32R-NEXT: # %bb.1: # %test142; LA32R-NEXT: ld.w $zero, $a1, 0143; LA32R-NEXT: .LBB4_2: # %end144; LA32R-NEXT: ret145;146; LA32S-LABEL: foo_br_sge:147; LA32S: # %bb.0:148; LA32S-NEXT: ld.w $a2, $a1, 0149; LA32S-NEXT: bge $a2, $a0, .LBB4_2150; LA32S-NEXT: # %bb.1: # %test151; LA32S-NEXT: ld.w $zero, $a1, 0152; LA32S-NEXT: .LBB4_2: # %end153; LA32S-NEXT: ret154;155; LA64-LABEL: foo_br_sge:156; LA64: # %bb.0:157; LA64-NEXT: ld.w $a2, $a1, 0158; LA64-NEXT: addi.w $a0, $a0, 0159; LA64-NEXT: bge $a2, $a0, .LBB4_2160; LA64-NEXT: # %bb.1: # %test161; LA64-NEXT: ld.w $zero, $a1, 0162; LA64-NEXT: .LBB4_2: # %end163; LA64-NEXT: ret164 %val = load volatile i32, ptr %b165 %cc = icmp sge i32 %val, %a166 br i1 %cc, label %end, label %test167test:168 %tmp = load volatile i32, ptr %b169 br label %end170 171end:172 ret void173}174 175define void @foo_br_ult(i32 %a, ptr %b) nounwind {176; LA32R-LABEL: foo_br_ult:177; LA32R: # %bb.0:178; LA32R-NEXT: ld.w $a2, $a1, 0179; LA32R-NEXT: bltu $a2, $a0, .LBB5_2180; LA32R-NEXT: # %bb.1: # %test181; LA32R-NEXT: ld.w $zero, $a1, 0182; LA32R-NEXT: .LBB5_2: # %end183; LA32R-NEXT: ret184;185; LA32S-LABEL: foo_br_ult:186; LA32S: # %bb.0:187; LA32S-NEXT: ld.w $a2, $a1, 0188; LA32S-NEXT: bltu $a2, $a0, .LBB5_2189; LA32S-NEXT: # %bb.1: # %test190; LA32S-NEXT: ld.w $zero, $a1, 0191; LA32S-NEXT: .LBB5_2: # %end192; LA32S-NEXT: ret193;194; LA64-LABEL: foo_br_ult:195; LA64: # %bb.0:196; LA64-NEXT: ld.w $a2, $a1, 0197; LA64-NEXT: addi.w $a0, $a0, 0198; LA64-NEXT: bltu $a2, $a0, .LBB5_2199; LA64-NEXT: # %bb.1: # %test200; LA64-NEXT: ld.w $zero, $a1, 0201; LA64-NEXT: .LBB5_2: # %end202; LA64-NEXT: ret203 %val = load volatile i32, ptr %b204 %cc = icmp ult i32 %val, %a205 br i1 %cc, label %end, label %test206test:207 %tmp = load volatile i32, ptr %b208 br label %end209 210end:211 ret void212}213 214define void @foo_br_uge(i32 %a, ptr %b) nounwind {215; LA32R-LABEL: foo_br_uge:216; LA32R: # %bb.0:217; LA32R-NEXT: ld.w $a2, $a1, 0218; LA32R-NEXT: bgeu $a2, $a0, .LBB6_2219; LA32R-NEXT: # %bb.1: # %test220; LA32R-NEXT: ld.w $zero, $a1, 0221; LA32R-NEXT: .LBB6_2: # %end222; LA32R-NEXT: ret223;224; LA32S-LABEL: foo_br_uge:225; LA32S: # %bb.0:226; LA32S-NEXT: ld.w $a2, $a1, 0227; LA32S-NEXT: bgeu $a2, $a0, .LBB6_2228; LA32S-NEXT: # %bb.1: # %test229; LA32S-NEXT: ld.w $zero, $a1, 0230; LA32S-NEXT: .LBB6_2: # %end231; LA32S-NEXT: ret232;233; LA64-LABEL: foo_br_uge:234; LA64: # %bb.0:235; LA64-NEXT: ld.w $a2, $a1, 0236; LA64-NEXT: addi.w $a0, $a0, 0237; LA64-NEXT: bgeu $a2, $a0, .LBB6_2238; LA64-NEXT: # %bb.1: # %test239; LA64-NEXT: ld.w $zero, $a1, 0240; LA64-NEXT: .LBB6_2: # %end241; LA64-NEXT: ret242 %val = load volatile i32, ptr %b243 %cc = icmp uge i32 %val, %a244 br i1 %cc, label %end, label %test245test:246 %tmp = load volatile i32, ptr %b247 br label %end248 249end:250 ret void251}252 253;; Check for condition codes that don't have a matching instruction.254define void @foo_br_sgt(i32 %a, ptr %b) nounwind {255; LA32R-LABEL: foo_br_sgt:256; LA32R: # %bb.0:257; LA32R-NEXT: ld.w $a2, $a1, 0258; LA32R-NEXT: blt $a0, $a2, .LBB7_2259; LA32R-NEXT: # %bb.1: # %test260; LA32R-NEXT: ld.w $zero, $a1, 0261; LA32R-NEXT: .LBB7_2: # %end262; LA32R-NEXT: ret263;264; LA32S-LABEL: foo_br_sgt:265; LA32S: # %bb.0:266; LA32S-NEXT: ld.w $a2, $a1, 0267; LA32S-NEXT: blt $a0, $a2, .LBB7_2268; LA32S-NEXT: # %bb.1: # %test269; LA32S-NEXT: ld.w $zero, $a1, 0270; LA32S-NEXT: .LBB7_2: # %end271; LA32S-NEXT: ret272;273; LA64-LABEL: foo_br_sgt:274; LA64: # %bb.0:275; LA64-NEXT: ld.w $a2, $a1, 0276; LA64-NEXT: addi.w $a0, $a0, 0277; LA64-NEXT: blt $a0, $a2, .LBB7_2278; LA64-NEXT: # %bb.1: # %test279; LA64-NEXT: ld.w $zero, $a1, 0280; LA64-NEXT: .LBB7_2: # %end281; LA64-NEXT: ret282 %val = load volatile i32, ptr %b283 %cc = icmp sgt i32 %val, %a284 br i1 %cc, label %end, label %test285test:286 %tmp = load volatile i32, ptr %b287 br label %end288 289end:290 ret void291}292 293define void @foo_br_sle(i32 %a, ptr %b) nounwind {294; LA32R-LABEL: foo_br_sle:295; LA32R: # %bb.0:296; LA32R-NEXT: ld.w $a2, $a1, 0297; LA32R-NEXT: bge $a0, $a2, .LBB8_2298; LA32R-NEXT: # %bb.1: # %test299; LA32R-NEXT: ld.w $zero, $a1, 0300; LA32R-NEXT: .LBB8_2: # %end301; LA32R-NEXT: ret302;303; LA32S-LABEL: foo_br_sle:304; LA32S: # %bb.0:305; LA32S-NEXT: ld.w $a2, $a1, 0306; LA32S-NEXT: bge $a0, $a2, .LBB8_2307; LA32S-NEXT: # %bb.1: # %test308; LA32S-NEXT: ld.w $zero, $a1, 0309; LA32S-NEXT: .LBB8_2: # %end310; LA32S-NEXT: ret311;312; LA64-LABEL: foo_br_sle:313; LA64: # %bb.0:314; LA64-NEXT: ld.w $a2, $a1, 0315; LA64-NEXT: addi.w $a0, $a0, 0316; LA64-NEXT: bge $a0, $a2, .LBB8_2317; LA64-NEXT: # %bb.1: # %test318; LA64-NEXT: ld.w $zero, $a1, 0319; LA64-NEXT: .LBB8_2: # %end320; LA64-NEXT: ret321 %val = load volatile i32, ptr %b322 %cc = icmp sle i32 %val, %a323 br i1 %cc, label %end, label %test324test:325 %tmp = load volatile i32, ptr %b326 br label %end327 328end:329 ret void330}331 332define void @foo_br_ugt(i32 %a, ptr %b) nounwind {333; LA32R-LABEL: foo_br_ugt:334; LA32R: # %bb.0:335; LA32R-NEXT: ld.w $a2, $a1, 0336; LA32R-NEXT: bltu $a0, $a2, .LBB9_2337; LA32R-NEXT: # %bb.1: # %test338; LA32R-NEXT: ld.w $zero, $a1, 0339; LA32R-NEXT: .LBB9_2: # %end340; LA32R-NEXT: ret341;342; LA32S-LABEL: foo_br_ugt:343; LA32S: # %bb.0:344; LA32S-NEXT: ld.w $a2, $a1, 0345; LA32S-NEXT: bltu $a0, $a2, .LBB9_2346; LA32S-NEXT: # %bb.1: # %test347; LA32S-NEXT: ld.w $zero, $a1, 0348; LA32S-NEXT: .LBB9_2: # %end349; LA32S-NEXT: ret350;351; LA64-LABEL: foo_br_ugt:352; LA64: # %bb.0:353; LA64-NEXT: ld.w $a2, $a1, 0354; LA64-NEXT: addi.w $a0, $a0, 0355; LA64-NEXT: bltu $a0, $a2, .LBB9_2356; LA64-NEXT: # %bb.1: # %test357; LA64-NEXT: ld.w $zero, $a1, 0358; LA64-NEXT: .LBB9_2: # %end359; LA64-NEXT: ret360 %val = load volatile i32, ptr %b361 %cc = icmp ugt i32 %val, %a362 br i1 %cc, label %end, label %test363test:364 %tmp = load volatile i32, ptr %b365 br label %end366 367end:368 ret void369}370 371define void @foo_br_ule(i32 %a, ptr %b) nounwind {372; LA32R-LABEL: foo_br_ule:373; LA32R: # %bb.0:374; LA32R-NEXT: ld.w $a2, $a1, 0375; LA32R-NEXT: bgeu $a0, $a2, .LBB10_2376; LA32R-NEXT: # %bb.1: # %test377; LA32R-NEXT: ld.w $zero, $a1, 0378; LA32R-NEXT: .LBB10_2: # %end379; LA32R-NEXT: ret380;381; LA32S-LABEL: foo_br_ule:382; LA32S: # %bb.0:383; LA32S-NEXT: ld.w $a2, $a1, 0384; LA32S-NEXT: bgeu $a0, $a2, .LBB10_2385; LA32S-NEXT: # %bb.1: # %test386; LA32S-NEXT: ld.w $zero, $a1, 0387; LA32S-NEXT: .LBB10_2: # %end388; LA32S-NEXT: ret389;390; LA64-LABEL: foo_br_ule:391; LA64: # %bb.0:392; LA64-NEXT: ld.w $a2, $a1, 0393; LA64-NEXT: addi.w $a0, $a0, 0394; LA64-NEXT: bgeu $a0, $a2, .LBB10_2395; LA64-NEXT: # %bb.1: # %test396; LA64-NEXT: ld.w $zero, $a1, 0397; LA64-NEXT: .LBB10_2: # %end398; LA64-NEXT: ret399 %val = load volatile i32, ptr %b400 %cc = icmp ule i32 %val, %a401 br i1 %cc, label %end, label %test402test:403 %tmp = load volatile i32, ptr %b404 br label %end405 406end:407 ret void408}409 410;; Check the case of a branch where the condition was generated in another411;; function.412define void @foo_br_cc(ptr %a, i1 %cc) nounwind {413; LA32R-LABEL: foo_br_cc:414; LA32R: # %bb.0:415; LA32R-NEXT: ld.w $zero, $a0, 0416; LA32R-NEXT: andi $a1, $a1, 1417; LA32R-NEXT: bne $a1, $zero, .LBB11_2418; LA32R-NEXT: # %bb.1: # %test419; LA32R-NEXT: ld.w $zero, $a0, 0420; LA32R-NEXT: .LBB11_2: # %end421; LA32R-NEXT: ret422;423; LA32S-LABEL: foo_br_cc:424; LA32S: # %bb.0:425; LA32S-NEXT: ld.w $zero, $a0, 0426; LA32S-NEXT: andi $a1, $a1, 1427; LA32S-NEXT: bnez $a1, .LBB11_2428; LA32S-NEXT: # %bb.1: # %test429; LA32S-NEXT: ld.w $zero, $a0, 0430; LA32S-NEXT: .LBB11_2: # %end431; LA32S-NEXT: ret432;433; LA64-LABEL: foo_br_cc:434; LA64: # %bb.0:435; LA64-NEXT: ld.w $zero, $a0, 0436; LA64-NEXT: andi $a1, $a1, 1437; LA64-NEXT: bnez $a1, .LBB11_2438; LA64-NEXT: # %bb.1: # %test439; LA64-NEXT: ld.w $zero, $a0, 0440; LA64-NEXT: .LBB11_2: # %end441; LA64-NEXT: ret442 %val = load volatile i32, ptr %a443 br i1 %cc, label %end, label %test444test:445 %tmp = load volatile i32, ptr %a446 br label %end447 448end:449 ret void450}451