@@ -2061,8 +2061,8 @@ define i32 @mul_sext_icmp_with_zero(i32 %x) {
20612061
20622062define 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
20732073define 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
20842084define 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
20952095define 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) {
21062106define 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