@@ -2046,6 +2046,60 @@ define i8 @mul_add_common_factor_use(i8 %x, i8 %y) {
20462046 ret i8 %a
20472047}
20482048
2049+ ; negative test - avoid creating extra uses of args
2050+
2051+ define i8 @mul_add_common_factor_use2 (i8 %x , i8 %y , i8 %z ) {
2052+ ; CHECK-LABEL: @mul_add_common_factor_use2(
2053+ ; CHECK-NEXT: [[M:%.*]] = mul i8 [[X:%.*]], [[Y:%.*]]
2054+ ; CHECK-NEXT: call void @use(i8 [[M]])
2055+ ; CHECK-NEXT: [[N1:%.*]] = add i8 [[Y]], [[Z:%.*]]
2056+ ; CHECK-NEXT: [[A:%.*]] = mul i8 [[X]], [[N1]]
2057+ ; CHECK-NEXT: ret i8 [[A]]
2058+ ;
2059+ %m = mul i8 %x , %y
2060+ %n = mul i8 %x , %z
2061+ call void @use (i8 %m )
2062+ %a = add i8 %m , %n
2063+ ret i8 %a
2064+ }
2065+
2066+ ; negative test - avoid disturbing redundant expressions for no immediate improvement
2067+
2068+ define void @mul_add_chain_common_factor_uses (i64 %a , i64 %b , i32 %c ) {
2069+ ; CHECK-LABEL: @mul_add_chain_common_factor_uses(
2070+ ; CHECK-NEXT: [[MUL1:%.*]] = mul i64 [[A:%.*]], [[B:%.*]]
2071+ ; CHECK-NEXT: [[SXT1:%.*]] = sext i32 [[C:%.*]] to i64
2072+ ; CHECK-NEXT: [[MUL11:%.*]] = add i64 [[A]], [[SXT1]]
2073+ ; CHECK-NEXT: [[ADD1:%.*]] = mul i64 [[MUL11]], [[B]]
2074+ ; CHECK-NEXT: call void @use(i64 [[ADD1]])
2075+ ; CHECK-NEXT: [[SXT2:%.*]] = sext i32 [[C]] to i64
2076+ ; CHECK-NEXT: [[ADD12:%.*]] = add i64 [[MUL11]], [[SXT2]]
2077+ ; CHECK-NEXT: [[ADD2:%.*]] = mul i64 [[ADD12]], [[B]]
2078+ ; CHECK-NEXT: call void @use(i64 [[ADD2]])
2079+ ; CHECK-NEXT: [[SXT3:%.*]] = sext i32 [[C]] to i64
2080+ ; CHECK-NEXT: [[ADD23:%.*]] = add i64 [[ADD12]], [[SXT3]]
2081+ ; CHECK-NEXT: [[ADD3:%.*]] = mul i64 [[ADD23]], [[B]]
2082+ ; CHECK-NEXT: call void @use(i64 [[ADD3]])
2083+ ; CHECK-NEXT: call void @use(i64 [[MUL1]])
2084+ ; CHECK-NEXT: ret void
2085+ ;
2086+ %mul1 = mul i64 %a , %b
2087+ %sxt1 = sext i32 %c to i64
2088+ %mul2 = mul i64 %b , %sxt1
2089+ %add1 = add i64 %mul1 , %mul2
2090+ call void @use (i64 %add1 )
2091+ %sxt2 = sext i32 %c to i64
2092+ %mul3 = mul i64 %b , %sxt2
2093+ %add2 = add i64 %add1 , %mul3
2094+ call void @use (i64 %add2 )
2095+ %sxt3 = sext i32 %c to i64
2096+ %mul4 = mul i64 %b , %sxt3
2097+ %add3 = add i64 %add2 , %mul4
2098+ call void @use (i64 %add3 )
2099+ call void @use (i64 %mul1 )
2100+ ret void
2101+ }
2102+
20492103define i8 @not_mul (i8 %x ) {
20502104; CHECK-LABEL: @not_mul(
20512105; CHECK-NEXT: [[TMP1:%.*]] = mul i8 [[X:%.*]], -41
0 commit comments