@@ -2008,6 +2008,60 @@ define i8 @mul_add_common_factor_use(i8 %x, i8 %y) {
20082008 ret i8 %a
20092009}
20102010
2011+ ; negative test - avoid creating extra uses of args
2012+
2013+ define i8 @mul_add_common_factor_use2 (i8 %x , i8 %y , i8 %z ) {
2014+ ; CHECK-LABEL: @mul_add_common_factor_use2(
2015+ ; CHECK-NEXT: [[M:%.*]] = mul i8 [[X:%.*]], [[Y:%.*]]
2016+ ; CHECK-NEXT: call void @use(i8 [[M]])
2017+ ; CHECK-NEXT: [[N1:%.*]] = add i8 [[Y]], [[Z:%.*]]
2018+ ; CHECK-NEXT: [[A:%.*]] = mul i8 [[N1]], [[X]]
2019+ ; CHECK-NEXT: ret i8 [[A]]
2020+ ;
2021+ %m = mul i8 %x , %y
2022+ %n = mul i8 %x , %z
2023+ call void @use (i8 %m )
2024+ %a = add i8 %m , %n
2025+ ret i8 %a
2026+ }
2027+
2028+ ; negative test - avoid disturbing redundant expressions for no immediate improvement
2029+
2030+ define void @mul_add_chain_common_factor_uses (i64 %a , i64 %b , i32 %c ) {
2031+ ; CHECK-LABEL: @mul_add_chain_common_factor_uses(
2032+ ; CHECK-NEXT: [[MUL1:%.*]] = mul i64 [[A:%.*]], [[B:%.*]]
2033+ ; CHECK-NEXT: [[SXT1:%.*]] = sext i32 [[C:%.*]] to i64
2034+ ; CHECK-NEXT: [[MUL11:%.*]] = add i64 [[SXT1]], [[A]]
2035+ ; CHECK-NEXT: [[ADD1:%.*]] = mul i64 [[MUL11]], [[B]]
2036+ ; CHECK-NEXT: call void @use(i64 [[ADD1]])
2037+ ; CHECK-NEXT: [[SXT2:%.*]] = sext i32 [[C]] to i64
2038+ ; CHECK-NEXT: [[ADD12:%.*]] = add i64 [[MUL11]], [[SXT2]]
2039+ ; CHECK-NEXT: [[ADD2:%.*]] = mul i64 [[ADD12]], [[B]]
2040+ ; CHECK-NEXT: call void @use(i64 [[ADD2]])
2041+ ; CHECK-NEXT: [[SXT3:%.*]] = sext i32 [[C]] to i64
2042+ ; CHECK-NEXT: [[ADD23:%.*]] = add i64 [[ADD12]], [[SXT3]]
2043+ ; CHECK-NEXT: [[ADD3:%.*]] = mul i64 [[ADD23]], [[B]]
2044+ ; CHECK-NEXT: call void @use(i64 [[ADD3]])
2045+ ; CHECK-NEXT: call void @use(i64 [[MUL1]])
2046+ ; CHECK-NEXT: ret void
2047+ ;
2048+ %mul1 = mul i64 %a , %b
2049+ %sxt1 = sext i32 %c to i64
2050+ %mul2 = mul i64 %sxt1 , %b
2051+ %add1 = add i64 %mul1 , %mul2
2052+ call void @use (i64 %add1 )
2053+ %sxt2 = sext i32 %c to i64
2054+ %mul3 = mul i64 %sxt2 , %b
2055+ %add2 = add i64 %add1 , %mul3
2056+ call void @use (i64 %add2 )
2057+ %sxt3 = sext i32 %c to i64
2058+ %mul4 = mul i64 %sxt3 , %b
2059+ %add3 = add i64 %add2 , %mul4
2060+ call void @use (i64 %add3 )
2061+ call void @use (i64 %mul1 )
2062+ ret void
2063+ }
2064+
20112065define i8 @not_mul (i8 %x ) {
20122066; CHECK-LABEL: @not_mul(
20132067; CHECK-NEXT: [[TMP1:%.*]] = mul i8 [[X:%.*]], -41
0 commit comments