brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.5 KiB · a03a532 Raw
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