96 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt < %s -passes=ipsccp -S | FileCheck %s3 4declare void @llvm.assume(i1)5declare i8 @llvm.ctpop.i8(i8)6 7; https://alive2.llvm.org/ce/z/LV_8xy8define i8 @and_add_shl(i8 %x) {9; CHECK-LABEL: define i8 @and_add_shl10; CHECK-SAME: (i8 [[X:%.*]]) {11; CHECK-NEXT: [[OP1_P2:%.*]] = icmp ule i8 [[X]], 512; CHECK-NEXT: call void @llvm.assume(i1 [[OP1_P2]])13; CHECK-NEXT: [[SHIFT:%.*]] = shl nuw nsw i8 1, [[X]]14; CHECK-NEXT: [[SUB:%.*]] = add nsw i8 [[SHIFT]], -115; CHECK-NEXT: ret i8 016;17 %op1_p2 = icmp ule i8 %x, 518 call void @llvm.assume(i1 %op1_p2)19 %shift = shl i8 1, %x20 %sub = add i8 %shift, -121 %r = and i8 %sub, 3222 ret i8 %r23}24 25; https://alive2.llvm.org/ce/z/YNYYdV26define i8 @and_not_shl(i8 %x) {27; CHECK-LABEL: define i8 @and_not_shl28; CHECK-SAME: (i8 [[X:%.*]]) {29; CHECK-NEXT: [[OP1_P2:%.*]] = icmp ule i8 [[X]], 530; CHECK-NEXT: call void @llvm.assume(i1 [[OP1_P2]])31; CHECK-NEXT: [[SHIFT:%.*]] = shl nsw i8 -1, [[X]]32; CHECK-NEXT: [[NOT:%.*]] = xor i8 [[SHIFT]], -133; CHECK-NEXT: ret i8 034;35 %op1_p2 = icmp ule i8 %x, 536 call void @llvm.assume(i1 %op1_p2)37 %shift = shl i8 -1, %x38 %not = xor i8 %shift, -139 %r = and i8 %not, 3240 ret i8 %r41}42 43define i8 @and_not_shl_1(i8 %x) {44; CHECK-LABEL: define i8 @and_not_shl_145; CHECK-SAME: (i8 [[X:%.*]]) {46; CHECK-NEXT: [[OP1_P2:%.*]] = icmp ule i8 [[X]], 447; CHECK-NEXT: call void @llvm.assume(i1 [[OP1_P2]])48; CHECK-NEXT: [[SHIFT:%.*]] = shl nsw i8 -1, [[X]]49; CHECK-NEXT: [[NOT:%.*]] = xor i8 [[SHIFT]], -150; CHECK-NEXT: ret i8 051;52 %op1_p2 = icmp ule i8 %x, 453 call void @llvm.assume(i1 %op1_p2)54 %shift = shl i8 -1, %x55 %not = xor i8 %shift, -156 %r = and i8 %not, 48 ; 3 * 1657 ret i8 %r58}59 60; Negative test: https://alive2.llvm.org/ce/z/Zv4Pyu61define i8 @and_add_shl_overlap(i8 %x) {62; CHECK-LABEL: define range(i8 0, 33) i8 @and_add_shl_overlap63; CHECK-SAME: (i8 [[X:%.*]]) {64; CHECK-NEXT: [[OP1_P2:%.*]] = icmp ule i8 [[X]], 665; CHECK-NEXT: call void @llvm.assume(i1 [[OP1_P2]])66; CHECK-NEXT: [[SHIFT:%.*]] = shl nuw nsw i8 1, [[X]]67; CHECK-NEXT: [[SUB:%.*]] = add nsw i8 [[SHIFT]], -168; CHECK-NEXT: [[R:%.*]] = and i8 [[SUB]], 3269; CHECK-NEXT: ret i8 [[R]]70;71 %op1_p2 = icmp ule i8 %x, 672 call void @llvm.assume(i1 %op1_p2)73 %shift = shl i8 1, %x74 %sub = add i8 %shift, -175 %r = and i8 %sub, 32 ; expect 6476 ret i8 %r77}78 79define i8 @and_not_shl_overlap(i8 %x) {80; CHECK-LABEL: define range(i8 0, 5) i8 @and_not_shl_overlap81; CHECK-SAME: (i8 [[X:%.*]]) {82; CHECK-NEXT: [[OP1_P2:%.*]] = icmp ule i8 [[X]], 383; CHECK-NEXT: call void @llvm.assume(i1 [[OP1_P2]])84; CHECK-NEXT: [[SHIFT:%.*]] = shl nsw i8 -1, [[X]]85; CHECK-NEXT: [[NOT:%.*]] = xor i8 [[SHIFT]], -186; CHECK-NEXT: [[R:%.*]] = and i8 [[NOT]], 487; CHECK-NEXT: ret i8 [[R]]88;89 %op1_p2 = icmp ule i8 %x, 390 call void @llvm.assume(i1 %op1_p2)91 %shift = shl i8 -1, %x92 %not = xor i8 %shift, -193 %r = and i8 %not, 4 ; expect 894 ret i8 %r95}96