diff --git a/llvm/test/Transforms/InstCombine/icmp-sdiv-sdiv.ll b/llvm/test/Transforms/InstCombine/icmp-sdiv-sdiv.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/icmp-sdiv-sdiv.ll @@ -0,0 +1,176 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -passes=instcombine -S | FileCheck %s + +declare void @llvm.assume(i1) +declare void @use.i7(i7) +declare void @use.i14(i14) + +define i1 @icmp_sdiv_sdiv_normal_i8(i8 %x, i8 %C) { +; CHECK-LABEL: @icmp_sdiv_sdiv_normal_i8( +; CHECK-NEXT: [[PRECOND:%.*]] = icmp ne i8 [[C:%.*]], -128 +; CHECK-NEXT: call void @llvm.assume(i1 [[PRECOND]]) +; CHECK-NEXT: [[NEGC:%.*]] = sub i8 0, [[C]] +; CHECK-NEXT: [[D1:%.*]] = sdiv i8 [[X:%.*]], [[NEGC]] +; CHECK-NEXT: [[D2:%.*]] = sdiv i8 [[X]], [[C]] +; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[D1]], [[D2]] +; CHECK-NEXT: ret i1 [[C]] +; + %precond = icmp ne i8 %C, -128 + call void @llvm.assume(i1 %precond) + %negC = sub i8 0, %C + %d1 = sdiv i8 %x, %negC + %d2 = sdiv i8 %x, %C + %c = icmp eq i8 %d1, %d2 + ret i1 %c +} + +define i1 @icmp_sdiv_sdiv_normal_i64(i64 %x, i64 %C) { +; CHECK-LABEL: @icmp_sdiv_sdiv_normal_i64( +; CHECK-NEXT: [[PRECOND:%.*]] = icmp ne i64 [[C:%.*]], -9223372036854775808 +; CHECK-NEXT: call void @llvm.assume(i1 [[PRECOND]]) +; CHECK-NEXT: [[NEGC:%.*]] = sub i64 0, [[C]] +; CHECK-NEXT: [[D1:%.*]] = sdiv i64 [[X:%.*]], [[NEGC]] +; CHECK-NEXT: [[D2:%.*]] = sdiv i64 [[X]], [[C]] +; CHECK-NEXT: [[C:%.*]] = icmp eq i64 [[D1]], [[D2]] +; CHECK-NEXT: ret i1 [[C]] +; + %precond = icmp ne i64 %C, -9223372036854775808 + call void @llvm.assume(i1 %precond) + %negC = sub i64 0, %C + %d1 = sdiv i64 %x, %negC + %d2 = sdiv i64 %x, %C + %c = icmp eq i64 %d1, %d2 + ret i1 %c +} + +define i1 @icmp_sdiv_sdiv_negative_no_precond(i17 %x, i17 %C) { +; CHECK-LABEL: @icmp_sdiv_sdiv_negative_no_precond( +; CHECK-NEXT: [[NEGC:%.*]] = sub i17 0, [[C:%.*]] +; CHECK-NEXT: [[D1:%.*]] = sdiv i17 [[X:%.*]], [[NEGC]] +; CHECK-NEXT: [[D2:%.*]] = sdiv i17 [[X]], [[C]] +; CHECK-NEXT: [[C:%.*]] = icmp eq i17 [[D1]], [[D2]] +; CHECK-NEXT: ret i1 [[C]] +; + %negC = sub i17 0, %C + %d1 = sdiv i17 %x, %negC + %d2 = sdiv i17 %x, %C + %c = icmp eq i17 %d1, %d2 + ret i1 %c +} + +define i1 @icmp_sdiv_sdiv_negative_precond_failure1(i24 %x, i24 %C) { +; CHECK-LABEL: @icmp_sdiv_sdiv_negative_precond_failure1( +; CHECK-NEXT: [[PRECOND:%.*]] = icmp ne i24 [[C:%.*]], -8388607 +; CHECK-NEXT: call void @llvm.assume(i1 [[PRECOND]]) +; CHECK-NEXT: [[NEGC:%.*]] = sub i24 0, [[C]] +; CHECK-NEXT: [[D1:%.*]] = sdiv i24 [[X:%.*]], [[NEGC]] +; CHECK-NEXT: [[D2:%.*]] = sdiv i24 [[X]], [[C]] +; CHECK-NEXT: [[C:%.*]] = icmp eq i24 [[D1]], [[D2]] +; CHECK-NEXT: ret i1 [[C]] +; + %precond = icmp ne i24 %C, -8388607 ; off by one + call void @llvm.assume(i1 %precond) + %negC = sub i24 0, %C + %d1 = sdiv i24 %x, %negC + %d2 = sdiv i24 %x, %C + %c = icmp eq i24 %d1, %d2 + ret i1 %c +} + +define i1 @icmp_sdiv_sdiv_negative_precond_failure2(i24 %x, i24 %C) { +; CHECK-LABEL: @icmp_sdiv_sdiv_negative_precond_failure2( +; CHECK-NEXT: [[PRECOND:%.*]] = icmp eq i24 [[C:%.*]], -8388608 +; CHECK-NEXT: call void @llvm.assume(i1 [[PRECOND]]) +; CHECK-NEXT: [[D1:%.*]] = sdiv i24 [[X:%.*]], [[C]] +; CHECK-NEXT: [[D2:%.*]] = sdiv i24 [[X]], [[C]] +; CHECK-NEXT: [[C:%.*]] = icmp eq i24 [[D1]], [[D2]] +; CHECK-NEXT: ret i1 [[C]] +; + %precond = icmp eq i24 %C, -8388608 + call void @llvm.assume(i1 %precond) + %negC = sub i24 0, %C + %d1 = sdiv i24 %x, %negC + %d2 = sdiv i24 %x, %C + %c = icmp eq i24 %d1, %d2 + ret i1 %c +} + +define i1 @icmp_sdiv_sdiv_negative_icmp_ne(i6 %x, i6 %C) { +; CHECK-LABEL: @icmp_sdiv_sdiv_negative_icmp_ne( +; CHECK-NEXT: [[PRECOND:%.*]] = icmp ne i6 [[C:%.*]], -31 +; CHECK-NEXT: call void @llvm.assume(i1 [[PRECOND]]) +; CHECK-NEXT: [[NEGC:%.*]] = sub i6 0, [[C]] +; CHECK-NEXT: [[D1:%.*]] = sdiv i6 [[X:%.*]], [[NEGC]] +; CHECK-NEXT: [[D2:%.*]] = sdiv i6 [[X]], [[C]] +; CHECK-NEXT: [[C:%.*]] = icmp ne i6 [[D1]], [[D2]] +; CHECK-NEXT: ret i1 [[C]] +; + %precond = icmp ne i6 %C, -31 + call void @llvm.assume(i1 %precond) + %negC = sub i6 0, %C + %d1 = sdiv i6 %x, %negC + %d2 = sdiv i6 %x, %C + %c = icmp ne i6 %d1, %d2 + ret i1 %c +} + +define i1 @icmp_sdiv_sdiv_negative_udiv(i9 %x, i9 %C) { +; CHECK-LABEL: @icmp_sdiv_sdiv_negative_udiv( +; CHECK-NEXT: [[PRECOND:%.*]] = icmp ne i9 [[C:%.*]], -256 +; CHECK-NEXT: call void @llvm.assume(i1 [[PRECOND]]) +; CHECK-NEXT: [[NEGC:%.*]] = sub i9 0, [[C]] +; CHECK-NEXT: [[D1:%.*]] = udiv i9 [[X:%.*]], [[NEGC]] +; CHECK-NEXT: [[D2:%.*]] = sdiv i9 [[X]], [[C]] +; CHECK-NEXT: [[C:%.*]] = icmp eq i9 [[D1]], [[D2]] +; CHECK-NEXT: ret i1 [[C]] +; + %precond = icmp ne i9 %C, -256 + call void @llvm.assume(i1 %precond) + %negC = sub i9 0, %C + %d1 = udiv i9 %x, %negC + %d2 = sdiv i9 %x, %C + %c = icmp eq i9 %d1, %d2 + ret i1 %c +} + +define i1 @icmp_sdiv_sdiv_negative_multiple_uses_neg(i7 %x, i7 %C) { +; CHECK-LABEL: @icmp_sdiv_sdiv_negative_multiple_uses_neg( +; CHECK-NEXT: [[PRECOND:%.*]] = icmp ne i7 [[C:%.*]], -64 +; CHECK-NEXT: call void @llvm.assume(i1 [[PRECOND]]) +; CHECK-NEXT: [[NEGC:%.*]] = sub i7 0, [[C]] +; CHECK-NEXT: [[D1:%.*]] = sdiv i7 [[X:%.*]], [[NEGC]] +; CHECK-NEXT: [[D2:%.*]] = sdiv i7 [[X]], [[C]] +; CHECK-NEXT: [[C:%.*]] = icmp eq i7 [[D1]], [[D2]] +; CHECK-NEXT: call void @use.i7(i7 [[NEGC]]) +; CHECK-NEXT: ret i1 [[C]] +; + %precond = icmp ne i7 %C, -64 + call void @llvm.assume(i1 %precond) + %negC = sub i7 0, %C + %d1 = sdiv i7 %x, %negC + %d2 = sdiv i7 %x, %C + %c = icmp eq i7 %d1, %d2 + call void @use.i7(i7 %negC) + ret i1 %c +} + +define i1 @icmp_sdiv_sdiv_negative_multiple_uses_sdiv(i14 %x, i14 %C) { +; CHECK-LABEL: @icmp_sdiv_sdiv_negative_multiple_uses_sdiv( +; CHECK-NEXT: [[PRECOND:%.*]] = icmp ne i14 [[C:%.*]], -8192 +; CHECK-NEXT: call void @llvm.assume(i1 [[PRECOND]]) +; CHECK-NEXT: [[NEGC:%.*]] = sub i14 0, [[C]] +; CHECK-NEXT: [[D1:%.*]] = sdiv i14 [[X:%.*]], [[NEGC]] +; CHECK-NEXT: call void @use.i14(i14 [[D1]]) +; CHECK-NEXT: [[D2:%.*]] = sdiv i14 [[X]], [[C]] +; CHECK-NEXT: [[C:%.*]] = icmp eq i14 [[D1]], [[D2]] +; CHECK-NEXT: ret i1 [[C]] +; + %precond = icmp ne i14 %C, -8192 + call void @llvm.assume(i1 %precond) + %negC = sub i14 0, %C + %d1 = sdiv i14 %x, %negC + call void @use.i14(i14 %d1) + %d2 = sdiv i14 %x, %C + %c = icmp eq i14 %d1, %d2 + ret i1 %c +}