brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.9 KiB · dcd3967 Raw
320 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=arm %s -o - | FileCheck %s --check-prefix=CHECK-ARM3; RUN: llc -mtriple=thumb-eabi %s -o - | FileCheck %s --check-prefix=CHECK-T4; RUN: llc -mtriple=thumb-eabi -mcpu=arm1156t2-s -mattr=+thumb2 %s -o - | FileCheck %s --check-prefix=CHECK-T25 6; Check for clipping against 0 that should result in bic7;8; Base tests with different bit widths9 10; x < 0 ? 0 : x11; 32-bit base test12define i32 @sat0_base_32bit(i32 %x) #0 {13; CHECK-ARM-LABEL: sat0_base_32bit:14; CHECK-ARM:       @ %bb.0: @ %entry15; CHECK-ARM-NEXT:    bic r0, r0, r0, asr #3116; CHECK-ARM-NEXT:    mov pc, lr17;18; CHECK-T-LABEL: sat0_base_32bit:19; CHECK-T:       @ %bb.0: @ %entry20; CHECK-T-NEXT:    asrs r1, r0, #3121; CHECK-T-NEXT:    bics r0, r122; CHECK-T-NEXT:    bx lr23;24; CHECK-T2-LABEL: sat0_base_32bit:25; CHECK-T2:       @ %bb.0: @ %entry26; CHECK-T2-NEXT:    bic.w r0, r0, r0, asr #3127; CHECK-T2-NEXT:    bx lr28entry:29  %cmpLow = icmp slt i32 %x, 030  %saturateLow = select i1 %cmpLow, i32 0, i32 %x31  ret i32 %saturateLow32}33 34; x < 0 ? 0 : x35; 16-bit base test36define i16 @sat0_base_16bit(i16 %x) #0 {37; CHECK-ARM-LABEL: sat0_base_16bit:38; CHECK-ARM:       @ %bb.0: @ %entry39; CHECK-ARM-NEXT:    lsl r1, r0, #1640; CHECK-ARM-NEXT:    asrs r1, r1, #1641; CHECK-ARM-NEXT:    movmi r0, #042; CHECK-ARM-NEXT:    mov pc, lr43;44; CHECK-T-LABEL: sat0_base_16bit:45; CHECK-T:       @ %bb.0: @ %entry46; CHECK-T-NEXT:    lsls r1, r0, #1647; CHECK-T-NEXT:    asrs r1, r1, #1648; CHECK-T-NEXT:    bpl .LBB1_249; CHECK-T-NEXT:  @ %bb.1:50; CHECK-T-NEXT:    movs r0, #051; CHECK-T-NEXT:  .LBB1_2: @ %entry52; CHECK-T-NEXT:    bx lr53;54; CHECK-T2-LABEL: sat0_base_16bit:55; CHECK-T2:       @ %bb.0: @ %entry56; CHECK-T2-NEXT:    sxth r1, r057; CHECK-T2-NEXT:    cmp r1, #058; CHECK-T2-NEXT:    it mi59; CHECK-T2-NEXT:    movmi r0, #060; CHECK-T2-NEXT:    bx lr61entry:62  %cmpLow = icmp slt i16 %x, 063  %saturateLow = select i1 %cmpLow, i16 0, i16 %x64  ret i16 %saturateLow65}66 67; x < 0 ? 0 : x68; 8-bit base test69define i8 @sat0_base_8bit(i8 %x) #0 {70; CHECK-ARM-LABEL: sat0_base_8bit:71; CHECK-ARM:       @ %bb.0: @ %entry72; CHECK-ARM-NEXT:    lsl r1, r0, #2473; CHECK-ARM-NEXT:    asrs r1, r1, #2474; CHECK-ARM-NEXT:    movmi r0, #075; CHECK-ARM-NEXT:    mov pc, lr76;77; CHECK-T-LABEL: sat0_base_8bit:78; CHECK-T:       @ %bb.0: @ %entry79; CHECK-T-NEXT:    lsls r1, r0, #2480; CHECK-T-NEXT:    asrs r1, r1, #2481; CHECK-T-NEXT:    bpl .LBB2_282; CHECK-T-NEXT:  @ %bb.1:83; CHECK-T-NEXT:    movs r0, #084; CHECK-T-NEXT:  .LBB2_2: @ %entry85; CHECK-T-NEXT:    bx lr86;87; CHECK-T2-LABEL: sat0_base_8bit:88; CHECK-T2:       @ %bb.0: @ %entry89; CHECK-T2-NEXT:    sxtb r1, r090; CHECK-T2-NEXT:    cmp r1, #091; CHECK-T2-NEXT:    it mi92; CHECK-T2-NEXT:    movmi r0, #093; CHECK-T2-NEXT:    bx lr94entry:95  %cmpLow = icmp slt i8 %x, 096  %saturateLow = select i1 %cmpLow, i8 0, i8 %x97  ret i8 %saturateLow98}99 100; Test where the conditional is formed in a different way101 102; x > 0 ? x : 0103define i32 @sat0_lower_1(i32 %x) #0 {104; CHECK-ARM-LABEL: sat0_lower_1:105; CHECK-ARM:       @ %bb.0: @ %entry106; CHECK-ARM-NEXT:    bic r0, r0, r0, asr #31107; CHECK-ARM-NEXT:    mov pc, lr108;109; CHECK-T-LABEL: sat0_lower_1:110; CHECK-T:       @ %bb.0: @ %entry111; CHECK-T-NEXT:    asrs r1, r0, #31112; CHECK-T-NEXT:    bics r0, r1113; CHECK-T-NEXT:    bx lr114;115; CHECK-T2-LABEL: sat0_lower_1:116; CHECK-T2:       @ %bb.0: @ %entry117; CHECK-T2-NEXT:    bic.w r0, r0, r0, asr #31118; CHECK-T2-NEXT:    bx lr119entry:120  %cmpGt = icmp sgt i32 %x, 0121  %saturateLow = select i1 %cmpGt, i32 %x, i32 0122  ret i32 %saturateLow123}124 125 126; Check for clipping against -1 that should result in orr127;128; Base tests with different bit widths129;130 131; x < -1 ? -1 : x132; 32-bit base test133define i32 @sat1_base_32bit(i32 %x) #0 {134; CHECK-ARM-LABEL: sat1_base_32bit:135; CHECK-ARM:       @ %bb.0: @ %entry136; CHECK-ARM-NEXT:    orr r0, r0, r0, asr #31137; CHECK-ARM-NEXT:    mov pc, lr138;139; CHECK-T-LABEL: sat1_base_32bit:140; CHECK-T:       @ %bb.0: @ %entry141; CHECK-T-NEXT:    asrs r1, r0, #31142; CHECK-T-NEXT:    orrs r0, r1143; CHECK-T-NEXT:    bx lr144;145; CHECK-T2-LABEL: sat1_base_32bit:146; CHECK-T2:       @ %bb.0: @ %entry147; CHECK-T2-NEXT:    orr.w r0, r0, r0, asr #31148; CHECK-T2-NEXT:    bx lr149entry:150  %cmpLow = icmp slt i32 %x, -1151  %saturateLow = select i1 %cmpLow, i32 -1, i32 %x152  ret i32 %saturateLow153}154 155; x < -1 ? -1 : x156; 16-bit base test157define i16 @sat1_base_16bit(i16 %x) #0 {158; CHECK-ARM-LABEL: sat1_base_16bit:159; CHECK-ARM:       @ %bb.0: @ %entry160; CHECK-ARM-NEXT:    lsl r1, r0, #16161; CHECK-ARM-NEXT:    asr r1, r1, #16162; CHECK-ARM-NEXT:    cmn r1, #1163; CHECK-ARM-NEXT:    mvnlt r0, #0164; CHECK-ARM-NEXT:    mov pc, lr165;166; CHECK-T-LABEL: sat1_base_16bit:167; CHECK-T:       @ %bb.0: @ %entry168; CHECK-T-NEXT:    movs r1, #0169; CHECK-T-NEXT:    mvns r1, r1170; CHECK-T-NEXT:    lsls r2, r0, #16171; CHECK-T-NEXT:    asrs r2, r2, #16172; CHECK-T-NEXT:    cmp r2, r1173; CHECK-T-NEXT:    blt .LBB5_2174; CHECK-T-NEXT:  @ %bb.1: @ %entry175; CHECK-T-NEXT:    movs r1, r0176; CHECK-T-NEXT:  .LBB5_2: @ %entry177; CHECK-T-NEXT:    movs r0, r1178; CHECK-T-NEXT:    bx lr179;180; CHECK-T2-LABEL: sat1_base_16bit:181; CHECK-T2:       @ %bb.0: @ %entry182; CHECK-T2-NEXT:    sxth r1, r0183; CHECK-T2-NEXT:    cmp.w r1, #-1184; CHECK-T2-NEXT:    it lt185; CHECK-T2-NEXT:    movlt.w r0, #-1186; CHECK-T2-NEXT:    bx lr187entry:188  %cmpLow = icmp slt i16 %x, -1189  %saturateLow = select i1 %cmpLow, i16 -1, i16 %x190  ret i16 %saturateLow191}192 193; x < -1 ? -1 : x194; 8-bit base test195define i8 @sat1_base_8bit(i8 %x) #0 {196; CHECK-ARM-LABEL: sat1_base_8bit:197; CHECK-ARM:       @ %bb.0: @ %entry198; CHECK-ARM-NEXT:    lsl r1, r0, #24199; CHECK-ARM-NEXT:    asr r1, r1, #24200; CHECK-ARM-NEXT:    cmn r1, #1201; CHECK-ARM-NEXT:    mvnlt r0, #0202; CHECK-ARM-NEXT:    mov pc, lr203;204; CHECK-T-LABEL: sat1_base_8bit:205; CHECK-T:       @ %bb.0: @ %entry206; CHECK-T-NEXT:    movs r1, #0207; CHECK-T-NEXT:    mvns r1, r1208; CHECK-T-NEXT:    lsls r2, r0, #24209; CHECK-T-NEXT:    asrs r2, r2, #24210; CHECK-T-NEXT:    cmp r2, r1211; CHECK-T-NEXT:    blt .LBB6_2212; CHECK-T-NEXT:  @ %bb.1: @ %entry213; CHECK-T-NEXT:    movs r1, r0214; CHECK-T-NEXT:  .LBB6_2: @ %entry215; CHECK-T-NEXT:    movs r0, r1216; CHECK-T-NEXT:    bx lr217;218; CHECK-T2-LABEL: sat1_base_8bit:219; CHECK-T2:       @ %bb.0: @ %entry220; CHECK-T2-NEXT:    sxtb r1, r0221; CHECK-T2-NEXT:    cmp.w r1, #-1222; CHECK-T2-NEXT:    it lt223; CHECK-T2-NEXT:    movlt.w r0, #-1224; CHECK-T2-NEXT:    bx lr225entry:226  %cmpLow = icmp slt i8 %x, -1227  %saturateLow = select i1 %cmpLow, i8 -1, i8 %x228  ret i8 %saturateLow229}230 231; Test where the conditional is formed in a different way232 233; x > -1 ? x : -1234define i32 @sat1_lower_1(i32 %x) #0 {235; CHECK-ARM-LABEL: sat1_lower_1:236; CHECK-ARM:       @ %bb.0: @ %entry237; CHECK-ARM-NEXT:    orr r0, r0, r0, asr #31238; CHECK-ARM-NEXT:    mov pc, lr239;240; CHECK-T-LABEL: sat1_lower_1:241; CHECK-T:       @ %bb.0: @ %entry242; CHECK-T-NEXT:    asrs r1, r0, #31243; CHECK-T-NEXT:    orrs r0, r1244; CHECK-T-NEXT:    bx lr245;246; CHECK-T2-LABEL: sat1_lower_1:247; CHECK-T2:       @ %bb.0: @ %entry248; CHECK-T2-NEXT:    orr.w r0, r0, r0, asr #31249; CHECK-T2-NEXT:    bx lr250entry:251  %cmpGt = icmp sgt i32 %x, -1252  %saturateLow = select i1 %cmpGt, i32 %x, i32 -1253  ret i32 %saturateLow254}255 256; The following tests for patterns that should not transform into bitops257; but that are similar enough that could confuse the selector.258 259; x < 0 ? 0 : y where x and y does not properly match260define i32 @no_sat0_incorrect_variable(i32 %x, i32 %y) #0 {261; CHECK-ARM-LABEL: no_sat0_incorrect_variable:262; CHECK-ARM:       @ %bb.0: @ %entry263; CHECK-ARM-NEXT:    cmp r0, #0264; CHECK-ARM-NEXT:    movmi r1, #0265; CHECK-ARM-NEXT:    mov r0, r1266; CHECK-ARM-NEXT:    mov pc, lr267;268; CHECK-T-LABEL: no_sat0_incorrect_variable:269; CHECK-T:       @ %bb.0: @ %entry270; CHECK-T-NEXT:    cmp r0, #0271; CHECK-T-NEXT:    bpl .LBB8_2272; CHECK-T-NEXT:  @ %bb.1:273; CHECK-T-NEXT:    movs r1, #0274; CHECK-T-NEXT:  .LBB8_2: @ %entry275; CHECK-T-NEXT:    movs r0, r1276; CHECK-T-NEXT:    bx lr277;278; CHECK-T2-LABEL: no_sat0_incorrect_variable:279; CHECK-T2:       @ %bb.0: @ %entry280; CHECK-T2-NEXT:    cmp r0, #0281; CHECK-T2-NEXT:    it mi282; CHECK-T2-NEXT:    movmi r1, #0283; CHECK-T2-NEXT:    mov r0, r1284; CHECK-T2-NEXT:    bx lr285entry:286  %cmpLow = icmp slt i32 %x, 0287  %saturateLow = select i1 %cmpLow, i32 0, i32 %y288  ret i32 %saturateLow289}290 291; x < 0 ? -1 : x292define i32 @no_sat0_incorrect_constant(i32 %x) {293; CHECK-ARM-LABEL: no_sat0_incorrect_constant:294; CHECK-ARM:       @ %bb.0: @ %entry295; CHECK-ARM-NEXT:    cmp r0, #0296; CHECK-ARM-NEXT:    mvnmi r0, #0297; CHECK-ARM-NEXT:    mov pc, lr298;299; CHECK-T-LABEL: no_sat0_incorrect_constant:300; CHECK-T:       @ %bb.0: @ %entry301; CHECK-T-NEXT:    cmp r0, #0302; CHECK-T-NEXT:    bpl .LBB9_2303; CHECK-T-NEXT:  @ %bb.1:304; CHECK-T-NEXT:    movs r0, #0305; CHECK-T-NEXT:    mvns r0, r0306; CHECK-T-NEXT:  .LBB9_2: @ %entry307; CHECK-T-NEXT:    bx lr308;309; CHECK-T2-LABEL: no_sat0_incorrect_constant:310; CHECK-T2:       @ %bb.0: @ %entry311; CHECK-T2-NEXT:    cmp r0, #0312; CHECK-T2-NEXT:    it mi313; CHECK-T2-NEXT:    movmi.w r0, #-1314; CHECK-T2-NEXT:    bx lr315entry:316  %cmpLow = icmp slt i32 %x, 0317  %saturateLow = select i1 %cmpLow, i32 -1, i32 %x318  ret i32 %saturateLow319}320