diff --git a/llvm/test/Transforms/InstCombine/icmp-mul.ll b/llvm/test/Transforms/InstCombine/icmp-mul.ll index 24709a235baa3..45c50c325b968 100644 --- a/llvm/test/Transforms/InstCombine/icmp-mul.ll +++ b/llvm/test/Transforms/InstCombine/icmp-mul.ll @@ -1,6 +1,8 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -instcombine -S | FileCheck %s +declare void @use(i8) + ; Tests for slt/ult define i1 @slt_positive_multip_rem_zero(i8 %x) { @@ -117,43 +119,161 @@ define i1 @ugt_rem_nz(i8 %x) { ; Tests for eq/ne -define i1 @eq_rem_zero(i8 %x) { -; CHECK-LABEL: @eq_rem_zero( -; CHECK-NEXT: [[A:%.*]] = mul nuw i8 [[X:%.*]], 5 +define i1 @eq_nsw_rem_zero(i8 %x) { +; CHECK-LABEL: @eq_nsw_rem_zero( +; CHECK-NEXT: [[A:%.*]] = mul nsw i8 [[X:%.*]], -5 ; CHECK-NEXT: [[B:%.*]] = icmp eq i8 [[A]], 20 ; CHECK-NEXT: ret i1 [[B]] ; - %a = mul nuw i8 %x, 5 + %a = mul nsw i8 %x, -5 + %b = icmp eq i8 %a, 20 + ret i1 %b +} + +define <2 x i1> @ne_nsw_rem_zero(<2 x i8> %x) { +; CHECK-LABEL: @ne_nsw_rem_zero( +; CHECK-NEXT: [[A:%.*]] = mul nsw <2 x i8> [[X:%.*]], +; CHECK-NEXT: [[B:%.*]] = icmp ne <2 x i8> [[A]], +; CHECK-NEXT: ret <2 x i1> [[B]] +; + %a = mul nsw <2 x i8> %x, + %b = icmp ne <2 x i8> %a, + ret <2 x i1> %b +} + +define <2 x i1> @ne_nsw_rem_zero_undef1(<2 x i8> %x) { +; CHECK-LABEL: @ne_nsw_rem_zero_undef1( +; CHECK-NEXT: [[A:%.*]] = mul nsw <2 x i8> [[X:%.*]], +; CHECK-NEXT: [[B:%.*]] = icmp ne <2 x i8> [[A]], +; CHECK-NEXT: ret <2 x i1> [[B]] +; + %a = mul nsw <2 x i8> %x, + %b = icmp ne <2 x i8> %a, + ret <2 x i1> %b +} + +define <2 x i1> @ne_nsw_rem_zero_undef2(<2 x i8> %x) { +; CHECK-LABEL: @ne_nsw_rem_zero_undef2( +; CHECK-NEXT: [[A:%.*]] = mul nsw <2 x i8> [[X:%.*]], +; CHECK-NEXT: [[B:%.*]] = icmp ne <2 x i8> [[A]], +; CHECK-NEXT: ret <2 x i1> [[B]] +; + %a = mul nsw <2 x i8> %x, + %b = icmp ne <2 x i8> %a, + ret <2 x i1> %b +} + +define i1 @eq_nsw_rem_zero_uses(i8 %x) { +; CHECK-LABEL: @eq_nsw_rem_zero_uses( +; CHECK-NEXT: [[A:%.*]] = mul nsw i8 [[X:%.*]], -5 +; CHECK-NEXT: call void @use(i8 [[A]]) +; CHECK-NEXT: [[B:%.*]] = icmp eq i8 [[A]], 20 +; CHECK-NEXT: ret i1 [[B]] +; + %a = mul nsw i8 %x, -5 + call void @use(i8 %a) %b = icmp eq i8 %a, 20 ret i1 %b } -define i1 @ne_rem_zero(i8 %x) { -; CHECK-LABEL: @ne_rem_zero( +; Impossible multiple should be handled by instsimplify. + +define i1 @eq_nsw_rem_nz(i8 %x) { +; CHECK-LABEL: @eq_nsw_rem_nz( +; CHECK-NEXT: ret i1 false +; + %a = mul nsw i8 %x, 5 + %b = icmp eq i8 %a, 245 + ret i1 %b +} + +; Impossible multiple should be handled by instsimplify. + +define i1 @ne_nsw_rem_nz(i8 %x) { +; CHECK-LABEL: @ne_nsw_rem_nz( +; CHECK-NEXT: ret i1 true +; + %a = mul nsw i8 %x, 5 + %b = icmp ne i8 %a, 130 + ret i1 %b +} + +define <2 x i1> @eq_nuw_rem_zero(<2 x i8> %x) { +; CHECK-LABEL: @eq_nuw_rem_zero( +; CHECK-NEXT: [[A:%.*]] = mul nuw <2 x i8> [[X:%.*]], +; CHECK-NEXT: [[B:%.*]] = icmp eq <2 x i8> [[A]], +; CHECK-NEXT: ret <2 x i1> [[B]] +; + %a = mul nuw <2 x i8> %x, + %b = icmp eq <2 x i8> %a, + ret <2 x i1> %b +} + +define <2 x i1> @eq_nuw_rem_zero_undef1(<2 x i8> %x) { +; CHECK-LABEL: @eq_nuw_rem_zero_undef1( +; CHECK-NEXT: [[A:%.*]] = mul nuw <2 x i8> [[X:%.*]], +; CHECK-NEXT: [[B:%.*]] = icmp eq <2 x i8> [[A]], +; CHECK-NEXT: ret <2 x i1> [[B]] +; + %a = mul nuw <2 x i8> %x, + %b = icmp eq <2 x i8> %a, + ret <2 x i1> %b +} + +define <2 x i1> @eq_nuw_rem_zero_undef2(<2 x i8> %x) { +; CHECK-LABEL: @eq_nuw_rem_zero_undef2( +; CHECK-NEXT: [[A:%.*]] = mul nuw <2 x i8> [[X:%.*]], +; CHECK-NEXT: [[B:%.*]] = icmp eq <2 x i8> [[A]], +; CHECK-NEXT: ret <2 x i1> [[B]] +; + %a = mul nuw <2 x i8> %x, + %b = icmp eq <2 x i8> %a, + ret <2 x i1> %b +} + +define i1 @ne_nuw_rem_zero(i8 %x) { +; CHECK-LABEL: @ne_nuw_rem_zero( ; CHECK-NEXT: [[A:%.*]] = mul nuw i8 [[X:%.*]], 5 -; CHECK-NEXT: [[B:%.*]] = icmp ne i8 [[A]], 30 +; CHECK-NEXT: [[B:%.*]] = icmp ne i8 [[A]], -126 ; CHECK-NEXT: ret i1 [[B]] ; %a = mul nuw i8 %x, 5 - %b = icmp ne i8 %a, 30 + %b = icmp ne i8 %a, 130 ret i1 %b } -define i1 @eq_rem_nz(i8 %x) { -; CHECK-LABEL: @eq_rem_nz( -; CHECK-NEXT: ret i1 false +define i1 @ne_nuw_rem_zero_uses(i8 %x) { +; CHECK-LABEL: @ne_nuw_rem_zero_uses( +; CHECK-NEXT: [[A:%.*]] = mul nuw i8 [[X:%.*]], 5 +; CHECK-NEXT: call void @use(i8 [[A]]) +; CHECK-NEXT: [[B:%.*]] = icmp ne i8 [[A]], -126 +; CHECK-NEXT: ret i1 [[B]] ; %a = mul nuw i8 %x, 5 - %b = icmp eq i8 %a, 31 + call void @use(i8 %a) + %b = icmp ne i8 %a, 130 ret i1 %b } -define i1 @ne_rem_nz(i8 %x) { -; CHECK-LABEL: @ne_rem_nz( +; Impossible multiple should be handled by instsimplify. + +define i1 @eq_nuw_rem_nz(i8 %x) { +; CHECK-LABEL: @eq_nuw_rem_nz( +; CHECK-NEXT: ret i1 false +; + %a = mul nuw i8 %x, -5 + %b = icmp eq i8 %a, 20 + ret i1 %b +} + +; Impossible multiple should be handled by instsimplify. + +define i1 @ne_nuw_rem_nz(i8 %x) { +; CHECK-LABEL: @ne_nuw_rem_nz( ; CHECK-NEXT: ret i1 true ; %a = mul nuw i8 %x, 5 - %b = icmp ne i8 %a, 31 + %b = icmp ne i8 %a, -30 ret i1 %b }