680 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv64 -mattr=+c -verify-machineinstrs < %s \3; RUN: | FileCheck -check-prefix=NOCMOV %s4; RUN: llc -mtriple=riscv64 -mattr=+conditional-cmv-fusion,+c -verify-machineinstrs < %s \5; RUN: | FileCheck -check-prefixes=CMOV,CMOV-NOZICOND %s6; RUN: llc -mtriple=riscv64 -mattr=+conditional-cmv-fusion,+c,+zicond -verify-machineinstrs < %s \7; RUN: | FileCheck -check-prefixes=CMOV,CMOV-ZICOND %s8; RUN: llc -mtriple=riscv64 -mattr=+short-forward-branch-ialu -verify-machineinstrs < %s \9; RUN: | FileCheck -check-prefixes=SHORT_FORWARD,SFB-NOZICOND,SFB-NOZICOND-NOC %s10; RUN: llc -mtriple=riscv64 -mattr=+short-forward-branch-ialu,+c -verify-machineinstrs < %s \11; RUN: | FileCheck -check-prefixes=SHORT_FORWARD,SFB-NOZICOND,SFB-NOZICOND-C %s12; RUN: llc -mtriple=riscv64 -mattr=+short-forward-branch-ialu,+zicond -verify-machineinstrs < %s \13; RUN: | FileCheck -check-prefixes=SHORT_FORWARD,SFB-ZICOND %s14; RUN: llc -mtriple=riscv32 -mattr=+experimental-xqcicm,+experimental-xqcics,+experimental-xqcicli,+zca,+short-forward-branch-ialu,+conditional-cmv-fusion -verify-machineinstrs < %s \15; RUN: | FileCheck %s --check-prefixes=RV32IXQCI16 17; The conditional move optimization in sifive-p450 requires that only a18; single c.mv instruction appears in the branch shadow.19 20; The sifive-7-series can predicate an xor.21 22define signext i32 @test1(i32 signext %x, i32 signext %y, i32 signext %z) {23; NOCMOV-LABEL: test1:24; NOCMOV: # %bb.0:25; NOCMOV-NEXT: snez a2, a226; NOCMOV-NEXT: addi a2, a2, -127; NOCMOV-NEXT: and a1, a1, a228; NOCMOV-NEXT: xor a0, a0, a129; NOCMOV-NEXT: ret30;31; CMOV-LABEL: test1:32; CMOV: # %bb.0:33; CMOV-NEXT: xor a1, a1, a034; CMOV-NEXT: bnez a2, .LBB0_235; CMOV-NEXT: # %bb.1:36; CMOV-NEXT: mv a0, a137; CMOV-NEXT: .LBB0_2:38; CMOV-NEXT: ret39;40; SHORT_FORWARD-LABEL: test1:41; SHORT_FORWARD: # %bb.0:42; SHORT_FORWARD-NEXT: bnez a2, .LBB0_243; SHORT_FORWARD-NEXT: # %bb.1:44; SHORT_FORWARD-NEXT: xor a0, a0, a145; SHORT_FORWARD-NEXT: .LBB0_2:46; SHORT_FORWARD-NEXT: ret47;48; RV32IXQCI-LABEL: test1:49; RV32IXQCI: # %bb.0:50; RV32IXQCI-NEXT: bnez a2, .LBB0_251; RV32IXQCI-NEXT: # %bb.1:52; RV32IXQCI-NEXT: xor a0, a0, a153; RV32IXQCI-NEXT: .LBB0_2:54; RV32IXQCI-NEXT: ret55 %c = icmp eq i32 %z, 056 %a = xor i32 %x, %y57 %b = select i1 %c, i32 %a, i32 %x58 ret i32 %b59}60 61define signext i32 @test2(i32 signext %x, i32 signext %y, i32 signext %z) {62; NOCMOV-LABEL: test2:63; NOCMOV: # %bb.0:64; NOCMOV-NEXT: seqz a2, a265; NOCMOV-NEXT: addi a2, a2, -166; NOCMOV-NEXT: and a1, a1, a267; NOCMOV-NEXT: xor a0, a0, a168; NOCMOV-NEXT: ret69;70; CMOV-LABEL: test2:71; CMOV: # %bb.0:72; CMOV-NEXT: xor a1, a1, a073; CMOV-NEXT: beqz a2, .LBB1_274; CMOV-NEXT: # %bb.1:75; CMOV-NEXT: mv a0, a176; CMOV-NEXT: .LBB1_2:77; CMOV-NEXT: ret78;79; SHORT_FORWARD-LABEL: test2:80; SHORT_FORWARD: # %bb.0:81; SHORT_FORWARD-NEXT: beqz a2, .LBB1_282; SHORT_FORWARD-NEXT: # %bb.1:83; SHORT_FORWARD-NEXT: xor a0, a0, a184; SHORT_FORWARD-NEXT: .LBB1_2:85; SHORT_FORWARD-NEXT: ret86;87; RV32IXQCI-LABEL: test2:88; RV32IXQCI: # %bb.0:89; RV32IXQCI-NEXT: beqz a2, .LBB1_290; RV32IXQCI-NEXT: # %bb.1:91; RV32IXQCI-NEXT: xor a0, a0, a192; RV32IXQCI-NEXT: .LBB1_2:93; RV32IXQCI-NEXT: ret94 %c = icmp eq i32 %z, 095 %a = xor i32 %x, %y96 %b = select i1 %c, i32 %x, i32 %a97 ret i32 %b98}99 100; Make sure we don't share the same basic block for two selects with the same101; condition.102define signext i32 @test3(i32 signext %v, i32 signext %w, i32 signext %x, i32 signext %y, i32 signext %z) {103; NOCMOV-LABEL: test3:104; NOCMOV: # %bb.0:105; NOCMOV-NEXT: seqz a4, a4106; NOCMOV-NEXT: addi a4, a4, -1107; NOCMOV-NEXT: and a1, a1, a4108; NOCMOV-NEXT: and a3, a3, a4109; NOCMOV-NEXT: xor a0, a0, a1110; NOCMOV-NEXT: xor a2, a2, a3111; NOCMOV-NEXT: addw a0, a0, a2112; NOCMOV-NEXT: ret113;114; CMOV-LABEL: test3:115; CMOV: # %bb.0:116; CMOV-NEXT: xor a1, a1, a0117; CMOV-NEXT: xor a3, a3, a2118; CMOV-NEXT: bnez a4, .LBB2_2119; CMOV-NEXT: # %bb.1:120; CMOV-NEXT: mv a1, a0121; CMOV-NEXT: .LBB2_2:122; CMOV-NEXT: bnez a4, .LBB2_4123; CMOV-NEXT: # %bb.3:124; CMOV-NEXT: mv a3, a2125; CMOV-NEXT: .LBB2_4:126; CMOV-NEXT: addw a0, a1, a3127; CMOV-NEXT: ret128;129; SHORT_FORWARD-LABEL: test3:130; SHORT_FORWARD: # %bb.0:131; SHORT_FORWARD-NEXT: beqz a4, .LBB2_2132; SHORT_FORWARD-NEXT: # %bb.1:133; SHORT_FORWARD-NEXT: xor a0, a0, a1134; SHORT_FORWARD-NEXT: .LBB2_2:135; SHORT_FORWARD-NEXT: beqz a4, .LBB2_4136; SHORT_FORWARD-NEXT: # %bb.3:137; SHORT_FORWARD-NEXT: xor a2, a2, a3138; SHORT_FORWARD-NEXT: .LBB2_4:139; SHORT_FORWARD-NEXT: addw a0, a0, a2140; SHORT_FORWARD-NEXT: ret141;142; RV32IXQCI-LABEL: test3:143; RV32IXQCI: # %bb.0:144; RV32IXQCI-NEXT: beqz a4, .LBB2_2145; RV32IXQCI-NEXT: # %bb.1:146; RV32IXQCI-NEXT: xor a0, a0, a1147; RV32IXQCI-NEXT: .LBB2_2:148; RV32IXQCI-NEXT: beqz a4, .LBB2_4149; RV32IXQCI-NEXT: # %bb.3:150; RV32IXQCI-NEXT: xor a2, a2, a3151; RV32IXQCI-NEXT: .LBB2_4:152; RV32IXQCI-NEXT: add a0, a0, a2153; RV32IXQCI-NEXT: ret154 %c = icmp eq i32 %z, 0155 %a = xor i32 %v, %w156 %b = select i1 %c, i32 %v, i32 %a157 %d = xor i32 %x, %y158 %e = select i1 %c, i32 %x, i32 %d159 %f = add i32 %b, %e160 ret i32 %f161}162 163define signext i32 @test4(i32 signext %x, i32 signext %y, i32 signext %z) {164; NOCMOV-LABEL: test4:165; NOCMOV: # %bb.0:166; NOCMOV-NEXT: snez a0, a2167; NOCMOV-NEXT: addi a0, a0, -1168; NOCMOV-NEXT: andi a0, a0, 3169; NOCMOV-NEXT: ret170;171; CMOV-NOZICOND-LABEL: test4:172; CMOV-NOZICOND: # %bb.0:173; CMOV-NOZICOND-NEXT: li a1, 0174; CMOV-NOZICOND-NEXT: li a0, 3175; CMOV-NOZICOND-NEXT: beqz a2, .LBB3_2176; CMOV-NOZICOND-NEXT: # %bb.1:177; CMOV-NOZICOND-NEXT: mv a0, a1178; CMOV-NOZICOND-NEXT: .LBB3_2:179; CMOV-NOZICOND-NEXT: ret180;181; CMOV-ZICOND-LABEL: test4:182; CMOV-ZICOND: # %bb.0:183; CMOV-ZICOND-NEXT: li a0, 3184; CMOV-ZICOND-NEXT: czero.nez a0, a0, a2185; CMOV-ZICOND-NEXT: ret186;187; SFB-NOZICOND-LABEL: test4:188; SFB-NOZICOND: # %bb.0:189; SFB-NOZICOND-NEXT: li a0, 3190; SFB-NOZICOND-NEXT: beqz a2, .LBB3_2191; SFB-NOZICOND-NEXT: # %bb.1:192; SFB-NOZICOND-NEXT: li a0, 0193; SFB-NOZICOND-NEXT: .LBB3_2:194; SFB-NOZICOND-NEXT: ret195;196; SFB-ZICOND-LABEL: test4:197; SFB-ZICOND: # %bb.0:198; SFB-ZICOND-NEXT: li a0, 3199; SFB-ZICOND-NEXT: czero.nez a0, a0, a2200; SFB-ZICOND-NEXT: ret201;202; RV32IXQCI-LABEL: test4:203; RV32IXQCI: # %bb.0:204; RV32IXQCI-NEXT: mv a0, a2205; RV32IXQCI-NEXT: li a1, 3206; RV32IXQCI-NEXT: qc.selectieqi a0, 0, a1, 0207; RV32IXQCI-NEXT: ret208 %c = icmp eq i32 %z, 0209 %a = select i1 %c, i32 3, i32 0210 ret i32 %a211}212 213define i16 @select_xor_1(i16 %A, i8 %cond) {214; NOCMOV-LABEL: select_xor_1:215; NOCMOV: # %bb.0: # %entry216; NOCMOV-NEXT: slli a1, a1, 63217; NOCMOV-NEXT: srai a1, a1, 63218; NOCMOV-NEXT: andi a1, a1, 43219; NOCMOV-NEXT: xor a0, a0, a1220; NOCMOV-NEXT: ret221;222; CMOV-LABEL: select_xor_1:223; CMOV: # %bb.0: # %entry224; CMOV-NEXT: andi a1, a1, 1225; CMOV-NEXT: xori a2, a0, 43226; CMOV-NEXT: beqz a1, .LBB4_2227; CMOV-NEXT: # %bb.1: # %entry228; CMOV-NEXT: mv a0, a2229; CMOV-NEXT: .LBB4_2: # %entry230; CMOV-NEXT: ret231;232; SHORT_FORWARD-LABEL: select_xor_1:233; SHORT_FORWARD: # %bb.0: # %entry234; SHORT_FORWARD-NEXT: andi a1, a1, 1235; SHORT_FORWARD-NEXT: beqz a1, .LBB4_2236; SHORT_FORWARD-NEXT: # %bb.1: # %entry237; SHORT_FORWARD-NEXT: xori a0, a0, 43238; SHORT_FORWARD-NEXT: .LBB4_2: # %entry239; SHORT_FORWARD-NEXT: ret240;241; RV32IXQCI-LABEL: select_xor_1:242; RV32IXQCI: # %bb.0: # %entry243; RV32IXQCI-NEXT: andi a1, a1, 1244; RV32IXQCI-NEXT: beqz a1, .LBB4_2245; RV32IXQCI-NEXT: # %bb.1: # %entry246; RV32IXQCI-NEXT: xori a0, a0, 43247; RV32IXQCI-NEXT: .LBB4_2: # %entry248; RV32IXQCI-NEXT: ret249entry:250 %and = and i8 %cond, 1251 %cmp10 = icmp eq i8 %and, 0252 %0 = xor i16 %A, 43253 %1 = select i1 %cmp10, i16 %A, i16 %0254 ret i16 %1255}256 257; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of258; icmp eq (and %cond, 1), 0259define i16 @select_xor_1b(i16 %A, i8 %cond) {260; NOCMOV-LABEL: select_xor_1b:261; NOCMOV: # %bb.0: # %entry262; NOCMOV-NEXT: slli a1, a1, 63263; NOCMOV-NEXT: srai a1, a1, 63264; NOCMOV-NEXT: andi a1, a1, 43265; NOCMOV-NEXT: xor a0, a0, a1266; NOCMOV-NEXT: ret267;268; CMOV-LABEL: select_xor_1b:269; CMOV: # %bb.0: # %entry270; CMOV-NEXT: andi a1, a1, 1271; CMOV-NEXT: xori a2, a0, 43272; CMOV-NEXT: beqz a1, .LBB5_2273; CMOV-NEXT: # %bb.1: # %entry274; CMOV-NEXT: mv a0, a2275; CMOV-NEXT: .LBB5_2: # %entry276; CMOV-NEXT: ret277;278; SHORT_FORWARD-LABEL: select_xor_1b:279; SHORT_FORWARD: # %bb.0: # %entry280; SHORT_FORWARD-NEXT: andi a1, a1, 1281; SHORT_FORWARD-NEXT: beqz a1, .LBB5_2282; SHORT_FORWARD-NEXT: # %bb.1: # %entry283; SHORT_FORWARD-NEXT: xori a0, a0, 43284; SHORT_FORWARD-NEXT: .LBB5_2: # %entry285; SHORT_FORWARD-NEXT: ret286;287; RV32IXQCI-LABEL: select_xor_1b:288; RV32IXQCI: # %bb.0: # %entry289; RV32IXQCI-NEXT: andi a1, a1, 1290; RV32IXQCI-NEXT: beqz a1, .LBB5_2291; RV32IXQCI-NEXT: # %bb.1: # %entry292; RV32IXQCI-NEXT: xori a0, a0, 43293; RV32IXQCI-NEXT: .LBB5_2: # %entry294; RV32IXQCI-NEXT: ret295entry:296 %and = and i8 %cond, 1297 %cmp10 = icmp ne i8 %and, 1298 %0 = xor i16 %A, 43299 %1 = select i1 %cmp10, i16 %A, i16 %0300 ret i16 %1301}302 303define i32 @select_xor_2(i32 %A, i32 %B, i8 %cond) {304; NOCMOV-LABEL: select_xor_2:305; NOCMOV: # %bb.0: # %entry306; NOCMOV-NEXT: slli a2, a2, 63307; NOCMOV-NEXT: srai a2, a2, 63308; NOCMOV-NEXT: and a1, a1, a2309; NOCMOV-NEXT: xor a0, a0, a1310; NOCMOV-NEXT: ret311;312; CMOV-LABEL: select_xor_2:313; CMOV: # %bb.0: # %entry314; CMOV-NEXT: andi a2, a2, 1315; CMOV-NEXT: xor a1, a1, a0316; CMOV-NEXT: beqz a2, .LBB6_2317; CMOV-NEXT: # %bb.1: # %entry318; CMOV-NEXT: mv a0, a1319; CMOV-NEXT: .LBB6_2: # %entry320; CMOV-NEXT: ret321;322; SFB-NOZICOND-NOC-LABEL: select_xor_2:323; SFB-NOZICOND-NOC: # %bb.0: # %entry324; SFB-NOZICOND-NOC-NEXT: andi a2, a2, 1325; SFB-NOZICOND-NOC-NEXT: beqz a2, .LBB6_2326; SFB-NOZICOND-NOC-NEXT: # %bb.1: # %entry327; SFB-NOZICOND-NOC-NEXT: xor a0, a1, a0328; SFB-NOZICOND-NOC-NEXT: .LBB6_2: # %entry329; SFB-NOZICOND-NOC-NEXT: ret330;331; SFB-NOZICOND-C-LABEL: select_xor_2:332; SFB-NOZICOND-C: # %bb.0: # %entry333; SFB-NOZICOND-C-NEXT: andi a2, a2, 1334; SFB-NOZICOND-C-NEXT: beqz a2, .LBB6_2335; SFB-NOZICOND-C-NEXT: # %bb.1: # %entry336; SFB-NOZICOND-C-NEXT: xor a0, a0, a1337; SFB-NOZICOND-C-NEXT: .LBB6_2: # %entry338; SFB-NOZICOND-C-NEXT: ret339;340; SFB-ZICOND-LABEL: select_xor_2:341; SFB-ZICOND: # %bb.0: # %entry342; SFB-ZICOND-NEXT: andi a2, a2, 1343; SFB-ZICOND-NEXT: beqz a2, .LBB6_2344; SFB-ZICOND-NEXT: # %bb.1: # %entry345; SFB-ZICOND-NEXT: xor a0, a1, a0346; SFB-ZICOND-NEXT: .LBB6_2: # %entry347; SFB-ZICOND-NEXT: ret348;349; RV32IXQCI-LABEL: select_xor_2:350; RV32IXQCI: # %bb.0: # %entry351; RV32IXQCI-NEXT: andi a2, a2, 1352; RV32IXQCI-NEXT: beqz a2, .LBB6_2353; RV32IXQCI-NEXT: # %bb.1: # %entry354; RV32IXQCI-NEXT: xor a0, a0, a1355; RV32IXQCI-NEXT: .LBB6_2: # %entry356; RV32IXQCI-NEXT: ret357entry:358 %and = and i8 %cond, 1359 %cmp10 = icmp eq i8 %and, 0360 %0 = xor i32 %B, %A361 %1 = select i1 %cmp10, i32 %A, i32 %0362 ret i32 %1363}364 365; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of366; icmp eq (and %cond, 1), 0367define i32 @select_xor_2b(i32 %A, i32 %B, i8 %cond) {368; NOCMOV-LABEL: select_xor_2b:369; NOCMOV: # %bb.0: # %entry370; NOCMOV-NEXT: slli a2, a2, 63371; NOCMOV-NEXT: srai a2, a2, 63372; NOCMOV-NEXT: and a1, a1, a2373; NOCMOV-NEXT: xor a0, a0, a1374; NOCMOV-NEXT: ret375;376; CMOV-LABEL: select_xor_2b:377; CMOV: # %bb.0: # %entry378; CMOV-NEXT: andi a2, a2, 1379; CMOV-NEXT: xor a1, a1, a0380; CMOV-NEXT: beqz a2, .LBB7_2381; CMOV-NEXT: # %bb.1: # %entry382; CMOV-NEXT: mv a0, a1383; CMOV-NEXT: .LBB7_2: # %entry384; CMOV-NEXT: ret385;386; SFB-NOZICOND-NOC-LABEL: select_xor_2b:387; SFB-NOZICOND-NOC: # %bb.0: # %entry388; SFB-NOZICOND-NOC-NEXT: andi a2, a2, 1389; SFB-NOZICOND-NOC-NEXT: beqz a2, .LBB7_2390; SFB-NOZICOND-NOC-NEXT: # %bb.1: # %entry391; SFB-NOZICOND-NOC-NEXT: xor a0, a1, a0392; SFB-NOZICOND-NOC-NEXT: .LBB7_2: # %entry393; SFB-NOZICOND-NOC-NEXT: ret394;395; SFB-NOZICOND-C-LABEL: select_xor_2b:396; SFB-NOZICOND-C: # %bb.0: # %entry397; SFB-NOZICOND-C-NEXT: andi a2, a2, 1398; SFB-NOZICOND-C-NEXT: beqz a2, .LBB7_2399; SFB-NOZICOND-C-NEXT: # %bb.1: # %entry400; SFB-NOZICOND-C-NEXT: xor a0, a0, a1401; SFB-NOZICOND-C-NEXT: .LBB7_2: # %entry402; SFB-NOZICOND-C-NEXT: ret403;404; SFB-ZICOND-LABEL: select_xor_2b:405; SFB-ZICOND: # %bb.0: # %entry406; SFB-ZICOND-NEXT: andi a2, a2, 1407; SFB-ZICOND-NEXT: beqz a2, .LBB7_2408; SFB-ZICOND-NEXT: # %bb.1: # %entry409; SFB-ZICOND-NEXT: xor a0, a1, a0410; SFB-ZICOND-NEXT: .LBB7_2: # %entry411; SFB-ZICOND-NEXT: ret412;413; RV32IXQCI-LABEL: select_xor_2b:414; RV32IXQCI: # %bb.0: # %entry415; RV32IXQCI-NEXT: andi a2, a2, 1416; RV32IXQCI-NEXT: beqz a2, .LBB7_2417; RV32IXQCI-NEXT: # %bb.1: # %entry418; RV32IXQCI-NEXT: xor a0, a0, a1419; RV32IXQCI-NEXT: .LBB7_2: # %entry420; RV32IXQCI-NEXT: ret421entry:422 %and = and i8 %cond, 1423 %cmp10 = icmp ne i8 %and, 1424 %0 = xor i32 %B, %A425 %1 = select i1 %cmp10, i32 %A, i32 %0426 ret i32 %1427}428 429define i32 @select_or(i32 %A, i32 %B, i8 %cond) {430; NOCMOV-LABEL: select_or:431; NOCMOV: # %bb.0: # %entry432; NOCMOV-NEXT: slli a2, a2, 63433; NOCMOV-NEXT: srai a2, a2, 63434; NOCMOV-NEXT: and a1, a1, a2435; NOCMOV-NEXT: or a0, a0, a1436; NOCMOV-NEXT: ret437;438; CMOV-LABEL: select_or:439; CMOV: # %bb.0: # %entry440; CMOV-NEXT: andi a2, a2, 1441; CMOV-NEXT: or a1, a1, a0442; CMOV-NEXT: beqz a2, .LBB8_2443; CMOV-NEXT: # %bb.1: # %entry444; CMOV-NEXT: mv a0, a1445; CMOV-NEXT: .LBB8_2: # %entry446; CMOV-NEXT: ret447;448; SFB-NOZICOND-NOC-LABEL: select_or:449; SFB-NOZICOND-NOC: # %bb.0: # %entry450; SFB-NOZICOND-NOC-NEXT: andi a2, a2, 1451; SFB-NOZICOND-NOC-NEXT: beqz a2, .LBB8_2452; SFB-NOZICOND-NOC-NEXT: # %bb.1: # %entry453; SFB-NOZICOND-NOC-NEXT: or a0, a1, a0454; SFB-NOZICOND-NOC-NEXT: .LBB8_2: # %entry455; SFB-NOZICOND-NOC-NEXT: ret456;457; SFB-NOZICOND-C-LABEL: select_or:458; SFB-NOZICOND-C: # %bb.0: # %entry459; SFB-NOZICOND-C-NEXT: andi a2, a2, 1460; SFB-NOZICOND-C-NEXT: beqz a2, .LBB8_2461; SFB-NOZICOND-C-NEXT: # %bb.1: # %entry462; SFB-NOZICOND-C-NEXT: or a0, a0, a1463; SFB-NOZICOND-C-NEXT: .LBB8_2: # %entry464; SFB-NOZICOND-C-NEXT: ret465;466; SFB-ZICOND-LABEL: select_or:467; SFB-ZICOND: # %bb.0: # %entry468; SFB-ZICOND-NEXT: andi a2, a2, 1469; SFB-ZICOND-NEXT: beqz a2, .LBB8_2470; SFB-ZICOND-NEXT: # %bb.1: # %entry471; SFB-ZICOND-NEXT: or a0, a1, a0472; SFB-ZICOND-NEXT: .LBB8_2: # %entry473; SFB-ZICOND-NEXT: ret474;475; RV32IXQCI-LABEL: select_or:476; RV32IXQCI: # %bb.0: # %entry477; RV32IXQCI-NEXT: andi a2, a2, 1478; RV32IXQCI-NEXT: beqz a2, .LBB8_2479; RV32IXQCI-NEXT: # %bb.1: # %entry480; RV32IXQCI-NEXT: or a0, a0, a1481; RV32IXQCI-NEXT: .LBB8_2: # %entry482; RV32IXQCI-NEXT: ret483entry:484 %and = and i8 %cond, 1485 %cmp10 = icmp eq i8 %and, 0486 %0 = or i32 %B, %A487 %1 = select i1 %cmp10, i32 %A, i32 %0488 ret i32 %1489}490 491; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of492; icmp eq (and %cond, 1), 0493define i32 @select_or_b(i32 %A, i32 %B, i8 %cond) {494; NOCMOV-LABEL: select_or_b:495; NOCMOV: # %bb.0: # %entry496; NOCMOV-NEXT: slli a2, a2, 63497; NOCMOV-NEXT: srai a2, a2, 63498; NOCMOV-NEXT: and a1, a1, a2499; NOCMOV-NEXT: or a0, a0, a1500; NOCMOV-NEXT: ret501;502; CMOV-LABEL: select_or_b:503; CMOV: # %bb.0: # %entry504; CMOV-NEXT: andi a2, a2, 1505; CMOV-NEXT: or a1, a1, a0506; CMOV-NEXT: beqz a2, .LBB9_2507; CMOV-NEXT: # %bb.1: # %entry508; CMOV-NEXT: mv a0, a1509; CMOV-NEXT: .LBB9_2: # %entry510; CMOV-NEXT: ret511;512; SFB-NOZICOND-NOC-LABEL: select_or_b:513; SFB-NOZICOND-NOC: # %bb.0: # %entry514; SFB-NOZICOND-NOC-NEXT: andi a2, a2, 1515; SFB-NOZICOND-NOC-NEXT: beqz a2, .LBB9_2516; SFB-NOZICOND-NOC-NEXT: # %bb.1: # %entry517; SFB-NOZICOND-NOC-NEXT: or a0, a1, a0518; SFB-NOZICOND-NOC-NEXT: .LBB9_2: # %entry519; SFB-NOZICOND-NOC-NEXT: ret520;521; SFB-NOZICOND-C-LABEL: select_or_b:522; SFB-NOZICOND-C: # %bb.0: # %entry523; SFB-NOZICOND-C-NEXT: andi a2, a2, 1524; SFB-NOZICOND-C-NEXT: beqz a2, .LBB9_2525; SFB-NOZICOND-C-NEXT: # %bb.1: # %entry526; SFB-NOZICOND-C-NEXT: or a0, a0, a1527; SFB-NOZICOND-C-NEXT: .LBB9_2: # %entry528; SFB-NOZICOND-C-NEXT: ret529;530; SFB-ZICOND-LABEL: select_or_b:531; SFB-ZICOND: # %bb.0: # %entry532; SFB-ZICOND-NEXT: andi a2, a2, 1533; SFB-ZICOND-NEXT: beqz a2, .LBB9_2534; SFB-ZICOND-NEXT: # %bb.1: # %entry535; SFB-ZICOND-NEXT: or a0, a1, a0536; SFB-ZICOND-NEXT: .LBB9_2: # %entry537; SFB-ZICOND-NEXT: ret538;539; RV32IXQCI-LABEL: select_or_b:540; RV32IXQCI: # %bb.0: # %entry541; RV32IXQCI-NEXT: andi a2, a2, 1542; RV32IXQCI-NEXT: beqz a2, .LBB9_2543; RV32IXQCI-NEXT: # %bb.1: # %entry544; RV32IXQCI-NEXT: or a0, a0, a1545; RV32IXQCI-NEXT: .LBB9_2: # %entry546; RV32IXQCI-NEXT: ret547entry:548 %and = and i8 %cond, 1549 %cmp10 = icmp ne i8 %and, 1550 %0 = or i32 %B, %A551 %1 = select i1 %cmp10, i32 %A, i32 %0552 ret i32 %1553}554 555define i32 @select_or_1(i32 %A, i32 %B, i32 %cond) {556; NOCMOV-LABEL: select_or_1:557; NOCMOV: # %bb.0: # %entry558; NOCMOV-NEXT: slli a2, a2, 63559; NOCMOV-NEXT: srai a2, a2, 63560; NOCMOV-NEXT: and a1, a1, a2561; NOCMOV-NEXT: or a0, a0, a1562; NOCMOV-NEXT: ret563;564; CMOV-LABEL: select_or_1:565; CMOV: # %bb.0: # %entry566; CMOV-NEXT: andi a2, a2, 1567; CMOV-NEXT: or a1, a1, a0568; CMOV-NEXT: beqz a2, .LBB10_2569; CMOV-NEXT: # %bb.1: # %entry570; CMOV-NEXT: mv a0, a1571; CMOV-NEXT: .LBB10_2: # %entry572; CMOV-NEXT: ret573;574; SFB-NOZICOND-NOC-LABEL: select_or_1:575; SFB-NOZICOND-NOC: # %bb.0: # %entry576; SFB-NOZICOND-NOC-NEXT: andi a2, a2, 1577; SFB-NOZICOND-NOC-NEXT: beqz a2, .LBB10_2578; SFB-NOZICOND-NOC-NEXT: # %bb.1: # %entry579; SFB-NOZICOND-NOC-NEXT: or a0, a1, a0580; SFB-NOZICOND-NOC-NEXT: .LBB10_2: # %entry581; SFB-NOZICOND-NOC-NEXT: ret582;583; SFB-NOZICOND-C-LABEL: select_or_1:584; SFB-NOZICOND-C: # %bb.0: # %entry585; SFB-NOZICOND-C-NEXT: andi a2, a2, 1586; SFB-NOZICOND-C-NEXT: beqz a2, .LBB10_2587; SFB-NOZICOND-C-NEXT: # %bb.1: # %entry588; SFB-NOZICOND-C-NEXT: or a0, a0, a1589; SFB-NOZICOND-C-NEXT: .LBB10_2: # %entry590; SFB-NOZICOND-C-NEXT: ret591;592; SFB-ZICOND-LABEL: select_or_1:593; SFB-ZICOND: # %bb.0: # %entry594; SFB-ZICOND-NEXT: andi a2, a2, 1595; SFB-ZICOND-NEXT: beqz a2, .LBB10_2596; SFB-ZICOND-NEXT: # %bb.1: # %entry597; SFB-ZICOND-NEXT: or a0, a1, a0598; SFB-ZICOND-NEXT: .LBB10_2: # %entry599; SFB-ZICOND-NEXT: ret600;601; RV32IXQCI-LABEL: select_or_1:602; RV32IXQCI: # %bb.0: # %entry603; RV32IXQCI-NEXT: andi a2, a2, 1604; RV32IXQCI-NEXT: beqz a2, .LBB10_2605; RV32IXQCI-NEXT: # %bb.1: # %entry606; RV32IXQCI-NEXT: or a0, a0, a1607; RV32IXQCI-NEXT: .LBB10_2: # %entry608; RV32IXQCI-NEXT: ret609entry:610 %and = and i32 %cond, 1611 %cmp10 = icmp eq i32 %and, 0612 %0 = or i32 %B, %A613 %1 = select i1 %cmp10, i32 %A, i32 %0614 ret i32 %1615}616 617; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of618; icmp eq (and %cond, 1), 0619define i32 @select_or_1b(i32 %A, i32 %B, i32 %cond) {620; NOCMOV-LABEL: select_or_1b:621; NOCMOV: # %bb.0: # %entry622; NOCMOV-NEXT: slli a2, a2, 63623; NOCMOV-NEXT: srai a2, a2, 63624; NOCMOV-NEXT: and a1, a1, a2625; NOCMOV-NEXT: or a0, a0, a1626; NOCMOV-NEXT: ret627;628; CMOV-LABEL: select_or_1b:629; CMOV: # %bb.0: # %entry630; CMOV-NEXT: andi a2, a2, 1631; CMOV-NEXT: or a1, a1, a0632; CMOV-NEXT: beqz a2, .LBB11_2633; CMOV-NEXT: # %bb.1: # %entry634; CMOV-NEXT: mv a0, a1635; CMOV-NEXT: .LBB11_2: # %entry636; CMOV-NEXT: ret637;638; SFB-NOZICOND-NOC-LABEL: select_or_1b:639; SFB-NOZICOND-NOC: # %bb.0: # %entry640; SFB-NOZICOND-NOC-NEXT: andi a2, a2, 1641; SFB-NOZICOND-NOC-NEXT: beqz a2, .LBB11_2642; SFB-NOZICOND-NOC-NEXT: # %bb.1: # %entry643; SFB-NOZICOND-NOC-NEXT: or a0, a1, a0644; SFB-NOZICOND-NOC-NEXT: .LBB11_2: # %entry645; SFB-NOZICOND-NOC-NEXT: ret646;647; SFB-NOZICOND-C-LABEL: select_or_1b:648; SFB-NOZICOND-C: # %bb.0: # %entry649; SFB-NOZICOND-C-NEXT: andi a2, a2, 1650; SFB-NOZICOND-C-NEXT: beqz a2, .LBB11_2651; SFB-NOZICOND-C-NEXT: # %bb.1: # %entry652; SFB-NOZICOND-C-NEXT: or a0, a0, a1653; SFB-NOZICOND-C-NEXT: .LBB11_2: # %entry654; SFB-NOZICOND-C-NEXT: ret655;656; SFB-ZICOND-LABEL: select_or_1b:657; SFB-ZICOND: # %bb.0: # %entry658; SFB-ZICOND-NEXT: andi a2, a2, 1659; SFB-ZICOND-NEXT: beqz a2, .LBB11_2660; SFB-ZICOND-NEXT: # %bb.1: # %entry661; SFB-ZICOND-NEXT: or a0, a1, a0662; SFB-ZICOND-NEXT: .LBB11_2: # %entry663; SFB-ZICOND-NEXT: ret664;665; RV32IXQCI-LABEL: select_or_1b:666; RV32IXQCI: # %bb.0: # %entry667; RV32IXQCI-NEXT: andi a2, a2, 1668; RV32IXQCI-NEXT: beqz a2, .LBB11_2669; RV32IXQCI-NEXT: # %bb.1: # %entry670; RV32IXQCI-NEXT: or a0, a0, a1671; RV32IXQCI-NEXT: .LBB11_2: # %entry672; RV32IXQCI-NEXT: ret673entry:674 %and = and i32 %cond, 1675 %cmp10 = icmp ne i32 %and, 1676 %0 = or i32 %B, %A677 %1 = select i1 %cmp10, i32 %A, i32 %0678 ret i32 %1679}680