Skip to content

Commit 82d8760

Browse files
committed
[InstCombine] Add extra tests for mul nuw inference (NFC)
1 parent 0d288e5 commit 82d8760

File tree

1 file changed

+70
-10
lines changed
  • llvm/test/Transforms/InstCombine

1 file changed

+70
-10
lines changed

llvm/test/Transforms/InstCombine/mul.ll

Lines changed: 70 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2061,8 +2061,8 @@ define i32 @mul_sext_icmp_with_zero(i32 %x) {
20612061

20622062
define i32 @test_mul_sext_bool(i1 %x, i32 %y) {
20632063
; CHECK-LABEL: @test_mul_sext_bool(
2064-
; CHECK-NEXT: [[Y_NEG:%.*]] = sub i32 0, [[Y:%.*]]
2065-
; CHECK-NEXT: [[MUL:%.*]] = select i1 [[X:%.*]], i32 [[Y_NEG]], i32 0
2064+
; CHECK-NEXT: [[TMP1:%.*]] = sub i32 0, [[Y:%.*]]
2065+
; CHECK-NEXT: [[MUL:%.*]] = select i1 [[X:%.*]], i32 [[TMP1]], i32 0
20662066
; CHECK-NEXT: ret i32 [[MUL]]
20672067
;
20682068
%sext = sext i1 %x to i32
@@ -2072,8 +2072,8 @@ define i32 @test_mul_sext_bool(i1 %x, i32 %y) {
20722072

20732073
define i32 @test_mul_sext_bool_nuw(i1 %x, i32 %y) {
20742074
; CHECK-LABEL: @test_mul_sext_bool_nuw(
2075-
; CHECK-NEXT: [[Y_NEG:%.*]] = sub i32 0, [[Y:%.*]]
2076-
; CHECK-NEXT: [[MUL:%.*]] = select i1 [[X:%.*]], i32 [[Y_NEG]], i32 0
2075+
; CHECK-NEXT: [[TMP1:%.*]] = sub i32 0, [[Y:%.*]]
2076+
; CHECK-NEXT: [[MUL:%.*]] = select i1 [[X:%.*]], i32 [[TMP1]], i32 0
20772077
; CHECK-NEXT: ret i32 [[MUL]]
20782078
;
20792079
%sext = sext i1 %x to i32
@@ -2083,8 +2083,8 @@ define i32 @test_mul_sext_bool_nuw(i1 %x, i32 %y) {
20832083

20842084
define i32 @test_mul_sext_bool_nsw(i1 %x, i32 %y) {
20852085
; CHECK-LABEL: @test_mul_sext_bool_nsw(
2086-
; CHECK-NEXT: [[Y_NEG:%.*]] = sub nsw i32 0, [[Y:%.*]]
2087-
; CHECK-NEXT: [[MUL:%.*]] = select i1 [[X:%.*]], i32 [[Y_NEG]], i32 0
2086+
; CHECK-NEXT: [[TMP1:%.*]] = sub nsw i32 0, [[Y:%.*]]
2087+
; CHECK-NEXT: [[MUL:%.*]] = select i1 [[X:%.*]], i32 [[TMP1]], i32 0
20882088
; CHECK-NEXT: ret i32 [[MUL]]
20892089
;
20902090
%sext = sext i1 %x to i32
@@ -2094,8 +2094,8 @@ define i32 @test_mul_sext_bool_nsw(i1 %x, i32 %y) {
20942094

20952095
define i32 @test_mul_sext_bool_nuw_nsw(i1 %x, i32 %y) {
20962096
; CHECK-LABEL: @test_mul_sext_bool_nuw_nsw(
2097-
; CHECK-NEXT: [[Y_NEG:%.*]] = sub nsw i32 0, [[Y:%.*]]
2098-
; CHECK-NEXT: [[MUL:%.*]] = select i1 [[X:%.*]], i32 [[Y_NEG]], i32 0
2097+
; CHECK-NEXT: [[TMP1:%.*]] = sub nsw i32 0, [[Y:%.*]]
2098+
; CHECK-NEXT: [[MUL:%.*]] = select i1 [[X:%.*]], i32 [[TMP1]], i32 0
20992099
; CHECK-NEXT: ret i32 [[MUL]]
21002100
;
21012101
%sext = sext i1 %x to i32
@@ -2106,8 +2106,8 @@ define i32 @test_mul_sext_bool_nuw_nsw(i1 %x, i32 %y) {
21062106
define i32 @test_mul_sext_bool_commuted(i1 %x, i32 %y) {
21072107
; CHECK-LABEL: @test_mul_sext_bool_commuted(
21082108
; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y:%.*]], -2
2109-
; CHECK-NEXT: [[YY_NEG1:%.*]] = add i32 [[TMP1]], 1
2110-
; CHECK-NEXT: [[MUL:%.*]] = select i1 [[X:%.*]], i32 [[YY_NEG1]], i32 0
2109+
; CHECK-NEXT: [[YY_NEG:%.*]] = add i32 [[TMP1]], 1
2110+
; CHECK-NEXT: [[MUL:%.*]] = select i1 [[X:%.*]], i32 [[YY_NEG]], i32 0
21112111
; CHECK-NEXT: ret i32 [[MUL]]
21122112
;
21132113
%yy = xor i32 %y, 1
@@ -2139,3 +2139,63 @@ define i32 @test_mul_sext_multiuse(i1 %x, i32 %y) {
21392139
%mul = mul i32 %sext, %y
21402140
ret i32 %mul
21412141
}
2142+
2143+
define i8 @mul_nsw_nonneg(i8 %x, i8 %y) {
2144+
; CHECK-LABEL: @mul_nsw_nonneg(
2145+
; CHECK-NEXT: [[X_NNEG:%.*]] = icmp sgt i8 [[X:%.*]], -1
2146+
; CHECK-NEXT: call void @llvm.assume(i1 [[X_NNEG]])
2147+
; CHECK-NEXT: [[Y_NNEG:%.*]] = icmp sgt i8 [[Y:%.*]], -1
2148+
; CHECK-NEXT: call void @llvm.assume(i1 [[Y_NNEG]])
2149+
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i8 [[X]], [[Y]]
2150+
; CHECK-NEXT: ret i8 [[MUL]]
2151+
;
2152+
%x.nneg = icmp sge i8 %x, 0
2153+
call void @llvm.assume(i1 %x.nneg)
2154+
%y.nneg = icmp sge i8 %y, 0
2155+
call void @llvm.assume(i1 %y.nneg)
2156+
%mul = mul nsw i8 %x, %y
2157+
ret i8 %mul
2158+
}
2159+
2160+
define i8 @mul_nsw_not_nonneg1(i8 %x, i8 %y) {
2161+
; CHECK-LABEL: @mul_nsw_not_nonneg1(
2162+
; CHECK-NEXT: [[Y_NNEG:%.*]] = icmp sgt i8 [[Y:%.*]], -1
2163+
; CHECK-NEXT: call void @llvm.assume(i1 [[Y_NNEG]])
2164+
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i8 [[X:%.*]], [[Y]]
2165+
; CHECK-NEXT: ret i8 [[MUL]]
2166+
;
2167+
%y.nneg = icmp sge i8 %y, 0
2168+
call void @llvm.assume(i1 %y.nneg)
2169+
%mul = mul nsw i8 %x, %y
2170+
ret i8 %mul
2171+
}
2172+
2173+
define i8 @mul_nsw_not_nonneg2(i8 %x, i8 %y) {
2174+
; CHECK-LABEL: @mul_nsw_not_nonneg2(
2175+
; CHECK-NEXT: [[X_NNEG:%.*]] = icmp sgt i8 [[X:%.*]], -1
2176+
; CHECK-NEXT: call void @llvm.assume(i1 [[X_NNEG]])
2177+
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i8 [[X]], [[Y:%.*]]
2178+
; CHECK-NEXT: ret i8 [[MUL]]
2179+
;
2180+
%x.nneg = icmp sge i8 %x, 0
2181+
call void @llvm.assume(i1 %x.nneg)
2182+
%mul = mul nsw i8 %x, %y
2183+
ret i8 %mul
2184+
}
2185+
2186+
define i8 @mul_not_nsw_nonneg(i8 %x, i8 %y) {
2187+
; CHECK-LABEL: @mul_not_nsw_nonneg(
2188+
; CHECK-NEXT: [[X_NNEG:%.*]] = icmp sgt i8 [[X:%.*]], -1
2189+
; CHECK-NEXT: call void @llvm.assume(i1 [[X_NNEG]])
2190+
; CHECK-NEXT: [[Y_NNEG:%.*]] = icmp sgt i8 [[Y:%.*]], -1
2191+
; CHECK-NEXT: call void @llvm.assume(i1 [[Y_NNEG]])
2192+
; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[X]], [[Y]]
2193+
; CHECK-NEXT: ret i8 [[MUL]]
2194+
;
2195+
%x.nneg = icmp sge i8 %x, 0
2196+
call void @llvm.assume(i1 %x.nneg)
2197+
%y.nneg = icmp sge i8 %y, 0
2198+
call void @llvm.assume(i1 %y.nneg)
2199+
%mul = mul i8 %x, %y
2200+
ret i8 %mul
2201+
}

0 commit comments

Comments
 (0)