@@ -2061,8 +2061,8 @@ define i32 @mul_sext_icmp_with_zero(i32 %x) {
2061
2061
2062
2062
define i32 @test_mul_sext_bool (i1 %x , i32 %y ) {
2063
2063
; 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
2066
2066
; CHECK-NEXT: ret i32 [[MUL]]
2067
2067
;
2068
2068
%sext = sext i1 %x to i32
@@ -2072,8 +2072,8 @@ define i32 @test_mul_sext_bool(i1 %x, i32 %y) {
2072
2072
2073
2073
define i32 @test_mul_sext_bool_nuw (i1 %x , i32 %y ) {
2074
2074
; 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
2077
2077
; CHECK-NEXT: ret i32 [[MUL]]
2078
2078
;
2079
2079
%sext = sext i1 %x to i32
@@ -2083,8 +2083,8 @@ define i32 @test_mul_sext_bool_nuw(i1 %x, i32 %y) {
2083
2083
2084
2084
define i32 @test_mul_sext_bool_nsw (i1 %x , i32 %y ) {
2085
2085
; 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
2088
2088
; CHECK-NEXT: ret i32 [[MUL]]
2089
2089
;
2090
2090
%sext = sext i1 %x to i32
@@ -2094,8 +2094,8 @@ define i32 @test_mul_sext_bool_nsw(i1 %x, i32 %y) {
2094
2094
2095
2095
define i32 @test_mul_sext_bool_nuw_nsw (i1 %x , i32 %y ) {
2096
2096
; 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
2099
2099
; CHECK-NEXT: ret i32 [[MUL]]
2100
2100
;
2101
2101
%sext = sext i1 %x to i32
@@ -2106,8 +2106,8 @@ define i32 @test_mul_sext_bool_nuw_nsw(i1 %x, i32 %y) {
2106
2106
define i32 @test_mul_sext_bool_commuted (i1 %x , i32 %y ) {
2107
2107
; CHECK-LABEL: @test_mul_sext_bool_commuted(
2108
2108
; 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
2111
2111
; CHECK-NEXT: ret i32 [[MUL]]
2112
2112
;
2113
2113
%yy = xor i32 %y , 1
@@ -2139,3 +2139,63 @@ define i32 @test_mul_sext_multiuse(i1 %x, i32 %y) {
2139
2139
%mul = mul i32 %sext , %y
2140
2140
ret i32 %mul
2141
2141
}
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