305 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc < %s -mtriple=bpf -mcpu=v1 | FileCheck %s3 4; test that we can expand CTTZ & CTLZ5 6declare i32 @llvm.cttz.i32(i32, i1)7 8define i32 @cttz_i32_zdef(i32 %a) {9; CHECK-LABEL: cttz_i32_zdef:10; CHECK: # %bb.0:11; CHECK-NEXT: r2 = r112; CHECK-NEXT: r2 = -r213; CHECK-NEXT: r1 &= r214; CHECK-NEXT: r1 *= 12561336115; CHECK-NEXT: r2 = 4160749568 ll16; CHECK-NEXT: r1 &= r217; CHECK-NEXT: r1 >>= 2718; CHECK-NEXT: r2 = {{\.?LCPI[0-9]+_[0-9]+}} ll19; CHECK-NEXT: r2 += r120; CHECK-NEXT: r0 = *(u8 *)(r2 + 0)21; CHECK-NEXT: exit22 %ret = call i32 @llvm.cttz.i32(i32 %a, i1 1)23 ret i32 %ret24}25 26 27define i32 @cttz_i32(i32 %a) {28; CHECK-LABEL: cttz_i32:29; CHECK: # %bb.0:30; CHECK-NEXT: r0 = 3231; CHECK-NEXT: r2 = r132; CHECK-NEXT: r2 <<= 3233; CHECK-NEXT: r2 >>= 3234; CHECK-NEXT: if r2 == 0 goto LBB1_235; CHECK-NEXT: # %bb.1: # %cond.false36; CHECK-NEXT: r2 = r137; CHECK-NEXT: r2 = -r238; CHECK-NEXT: r1 &= r239; CHECK-NEXT: r1 *= 12561336140; CHECK-NEXT: r2 = 4160749568 ll41; CHECK-NEXT: r1 &= r242; CHECK-NEXT: r1 >>= 2743; CHECK-NEXT: r2 = {{\.?LCPI[0-9]+_[0-9]+}} ll44; CHECK-NEXT: r2 += r145; CHECK-NEXT: r0 = *(u8 *)(r2 + 0)46; CHECK-NEXT: LBB1_2: # %cond.end47; CHECK-NEXT: exit48 %ret = call i32 @llvm.cttz.i32(i32 %a, i1 0)49 ret i32 %ret50}51 52declare i64 @llvm.cttz.i64(i64, i1)53 54define i64 @cttz_i64_zdef(i64 %a) {55; CHECK-LABEL: cttz_i64_zdef:56; CHECK: # %bb.0:57; CHECK-NEXT: r2 = r158; CHECK-NEXT: r2 = -r259; CHECK-NEXT: r1 &= r260; CHECK-NEXT: r2 = 151050438420815295 ll61; CHECK-NEXT: r1 *= r262; CHECK-NEXT: r1 >>= 5863; CHECK-NEXT: r2 = {{\.?LCPI[0-9]+_[0-9]+}} ll64; CHECK-NEXT: r2 += r165; CHECK-NEXT: r0 = *(u8 *)(r2 + 0)66; CHECK-NEXT: exit67 %ret = call i64 @llvm.cttz.i64(i64 %a, i1 1)68 ret i64 %ret69}70 71 72define i64 @cttz_i64(i64 %a) {73; CHECK-LABEL: cttz_i64:74; CHECK: # %bb.0:75; CHECK-NEXT: r0 = 6476; CHECK-NEXT: if r1 == 0 goto LBB3_277; CHECK-NEXT: # %bb.1: # %cond.false78; CHECK-NEXT: r2 = r179; CHECK-NEXT: r2 = -r280; CHECK-NEXT: r1 &= r281; CHECK-NEXT: r2 = 151050438420815295 ll82; CHECK-NEXT: r1 *= r283; CHECK-NEXT: r1 >>= 5884; CHECK-NEXT: r2 = {{\.?LCPI[0-9]+_[0-9]+}} ll85; CHECK-NEXT: r2 += r186; CHECK-NEXT: r0 = *(u8 *)(r2 + 0)87; CHECK-NEXT: LBB3_2: # %cond.end88; CHECK-NEXT: exit89 %ret = call i64 @llvm.cttz.i64(i64 %a, i1 0)90 ret i64 %ret91}92 93 94declare i32 @llvm.ctlz.i32(i32, i1)95 96define i32 @ctlz_i32_zdef(i32 %a) {97; CHECK-LABEL: ctlz_i32_zdef:98; CHECK: # %bb.0:99; CHECK-NEXT: r2 = 4294967294 ll100; CHECK-NEXT: r3 = r1101; CHECK-NEXT: r3 &= r2102; CHECK-NEXT: r3 >>= 1103; CHECK-NEXT: r1 |= r3104; CHECK-NEXT: r2 = 4294967292 ll105; CHECK-NEXT: r3 = r1106; CHECK-NEXT: r3 &= r2107; CHECK-NEXT: r3 >>= 2108; CHECK-NEXT: r1 |= r3109; CHECK-NEXT: r2 = 4294967280 ll110; CHECK-NEXT: r3 = r1111; CHECK-NEXT: r3 &= r2112; CHECK-NEXT: r3 >>= 4113; CHECK-NEXT: r1 |= r3114; CHECK-NEXT: r2 = 4294967040 ll115; CHECK-NEXT: r3 = r1116; CHECK-NEXT: r3 &= r2117; CHECK-NEXT: r3 >>= 8118; CHECK-NEXT: r1 |= r3119; CHECK-NEXT: r2 = 4294901760 ll120; CHECK-NEXT: r3 = r1121; CHECK-NEXT: r3 &= r2122; CHECK-NEXT: r3 >>= 16123; CHECK-NEXT: r1 |= r3124; CHECK-NEXT: r1 ^= -1125; CHECK-NEXT: r2 = r1126; CHECK-NEXT: r2 >>= 1127; CHECK-NEXT: r2 &= 1431655765128; CHECK-NEXT: r1 -= r2129; CHECK-NEXT: r0 = r1130; CHECK-NEXT: r0 &= 858993459131; CHECK-NEXT: r1 >>= 2132; CHECK-NEXT: r1 &= 858993459133; CHECK-NEXT: r0 += r1134; CHECK-NEXT: r1 = r0135; CHECK-NEXT: r1 >>= 4136; CHECK-NEXT: r0 += r1137; CHECK-NEXT: r0 &= 252645135138; CHECK-NEXT: r0 *= 16843009139; CHECK-NEXT: r1 = 4278190080 ll140; CHECK-NEXT: r0 &= r1141; CHECK-NEXT: r0 >>= 24142; CHECK-NEXT: exit143 %ret = call i32 @llvm.ctlz.i32(i32 %a, i1 1)144 ret i32 %ret145}146 147 148define i32 @ctlz_i32(i32 %a) {149; CHECK-LABEL: ctlz_i32:150; CHECK: # %bb.0:151; CHECK-NEXT: r0 = 32152; CHECK-NEXT: r2 = r1153; CHECK-NEXT: r2 <<= 32154; CHECK-NEXT: r2 >>= 32155; CHECK-NEXT: if r2 == 0 goto LBB5_2156; CHECK-NEXT: # %bb.1: # %cond.false157; CHECK-NEXT: r2 = 4294967294 ll158; CHECK-NEXT: r3 = r1159; CHECK-NEXT: r3 &= r2160; CHECK-NEXT: r3 >>= 1161; CHECK-NEXT: r1 |= r3162; CHECK-NEXT: r2 = 4294967292 ll163; CHECK-NEXT: r3 = r1164; CHECK-NEXT: r3 &= r2165; CHECK-NEXT: r3 >>= 2166; CHECK-NEXT: r1 |= r3167; CHECK-NEXT: r2 = 4294967280 ll168; CHECK-NEXT: r3 = r1169; CHECK-NEXT: r3 &= r2170; CHECK-NEXT: r3 >>= 4171; CHECK-NEXT: r1 |= r3172; CHECK-NEXT: r2 = 4294967040 ll173; CHECK-NEXT: r3 = r1174; CHECK-NEXT: r3 &= r2175; CHECK-NEXT: r3 >>= 8176; CHECK-NEXT: r1 |= r3177; CHECK-NEXT: r2 = 4294901760 ll178; CHECK-NEXT: r3 = r1179; CHECK-NEXT: r3 &= r2180; CHECK-NEXT: r3 >>= 16181; CHECK-NEXT: r1 |= r3182; CHECK-NEXT: r1 ^= -1183; CHECK-NEXT: r2 = r1184; CHECK-NEXT: r2 >>= 1185; CHECK-NEXT: r2 &= 1431655765186; CHECK-NEXT: r1 -= r2187; CHECK-NEXT: r0 = r1188; CHECK-NEXT: r0 &= 858993459189; CHECK-NEXT: r1 >>= 2190; CHECK-NEXT: r1 &= 858993459191; CHECK-NEXT: r0 += r1192; CHECK-NEXT: r1 = r0193; CHECK-NEXT: r1 >>= 4194; CHECK-NEXT: r0 += r1195; CHECK-NEXT: r0 &= 252645135196; CHECK-NEXT: r0 *= 16843009197; CHECK-NEXT: r1 = 4278190080 ll198; CHECK-NEXT: r0 &= r1199; CHECK-NEXT: r0 >>= 24200; CHECK-NEXT: LBB5_2: # %cond.end201; CHECK-NEXT: exit202 %ret = call i32 @llvm.ctlz.i32(i32 %a, i1 0)203 ret i32 %ret204}205 206declare i64 @llvm.ctlz.i64(i64, i1)207 208define i64 @ctlz_i64_zdef(i64 %a) {209; CHECK-LABEL: ctlz_i64_zdef:210; CHECK: # %bb.0:211; CHECK-NEXT: r2 = r1212; CHECK-NEXT: r2 >>= 1213; CHECK-NEXT: r1 |= r2214; CHECK-NEXT: r2 = r1215; CHECK-NEXT: r2 >>= 2216; CHECK-NEXT: r1 |= r2217; CHECK-NEXT: r2 = r1218; CHECK-NEXT: r2 >>= 4219; CHECK-NEXT: r1 |= r2220; CHECK-NEXT: r2 = r1221; CHECK-NEXT: r2 >>= 8222; CHECK-NEXT: r1 |= r2223; CHECK-NEXT: r2 = r1224; CHECK-NEXT: r2 >>= 16225; CHECK-NEXT: r1 |= r2226; CHECK-NEXT: r2 = r1227; CHECK-NEXT: r2 >>= 32228; CHECK-NEXT: r1 |= r2229; CHECK-NEXT: r1 ^= -1230; CHECK-NEXT: r2 = 6148914691236517205 ll231; CHECK-NEXT: r3 = r1232; CHECK-NEXT: r3 >>= 1233; CHECK-NEXT: r3 &= r2234; CHECK-NEXT: r1 -= r3235; CHECK-NEXT: r2 = 3689348814741910323 ll236; CHECK-NEXT: r0 = r1237; CHECK-NEXT: r0 &= r2238; CHECK-NEXT: r1 >>= 2239; CHECK-NEXT: r1 &= r2240; CHECK-NEXT: r0 += r1241; CHECK-NEXT: r1 = r0242; CHECK-NEXT: r1 >>= 4243; CHECK-NEXT: r0 += r1244; CHECK-NEXT: r1 = 1085102592571150095 ll245; CHECK-NEXT: r0 &= r1246; CHECK-NEXT: r1 = 72340172838076673 ll247; CHECK-NEXT: r0 *= r1248; CHECK-NEXT: r0 >>= 56249; CHECK-NEXT: exit250 %ret = call i64 @llvm.ctlz.i64(i64 %a, i1 1)251 ret i64 %ret252}253 254 255define i64 @ctlz_i64(i64 %a) {256; CHECK-LABEL: ctlz_i64:257; CHECK: # %bb.0:258; CHECK-NEXT: r0 = 64259; CHECK-NEXT: if r1 == 0 goto LBB7_2260; CHECK-NEXT: # %bb.1: # %cond.false261; CHECK-NEXT: r2 = r1262; CHECK-NEXT: r2 >>= 1263; CHECK-NEXT: r1 |= r2264; CHECK-NEXT: r2 = r1265; CHECK-NEXT: r2 >>= 2266; CHECK-NEXT: r1 |= r2267; CHECK-NEXT: r2 = r1268; CHECK-NEXT: r2 >>= 4269; CHECK-NEXT: r1 |= r2270; CHECK-NEXT: r2 = r1271; CHECK-NEXT: r2 >>= 8272; CHECK-NEXT: r1 |= r2273; CHECK-NEXT: r2 = r1274; CHECK-NEXT: r2 >>= 16275; CHECK-NEXT: r1 |= r2276; CHECK-NEXT: r2 = r1277; CHECK-NEXT: r2 >>= 32278; CHECK-NEXT: r1 |= r2279; CHECK-NEXT: r1 ^= -1280; CHECK-NEXT: r2 = 6148914691236517205 ll281; CHECK-NEXT: r3 = r1282; CHECK-NEXT: r3 >>= 1283; CHECK-NEXT: r3 &= r2284; CHECK-NEXT: r1 -= r3285; CHECK-NEXT: r2 = 3689348814741910323 ll286; CHECK-NEXT: r0 = r1287; CHECK-NEXT: r0 &= r2288; CHECK-NEXT: r1 >>= 2289; CHECK-NEXT: r1 &= r2290; CHECK-NEXT: r0 += r1291; CHECK-NEXT: r1 = r0292; CHECK-NEXT: r1 >>= 4293; CHECK-NEXT: r0 += r1294; CHECK-NEXT: r1 = 1085102592571150095 ll295; CHECK-NEXT: r0 &= r1296; CHECK-NEXT: r1 = 72340172838076673 ll297; CHECK-NEXT: r0 *= r1298; CHECK-NEXT: r0 >>= 56299; CHECK-NEXT: LBB7_2: # %cond.end300; CHECK-NEXT: exit301 %ret = call i64 @llvm.ctlz.i64(i64 %a, i1 0)302 ret i64 %ret303}304 305