@@ -2060,23 +2060,67 @@ func.func @test_divf1(%arg0 : f32, %arg1 : f32) -> (f32) {
20602060
20612061// -----
20622062
2063- // CHECK-LABEL: @test_divui_mul
2064- // CHECK-SAME: (%[[ARG:.*]]: index, %{{.*}}: index)
2065- // CHECK: return %[[ARG]]
2066- func.func @test_divui_mul (%arg0: index , %arg1: index ) -> index {
2067- %0 = arith.muli %arg0 , %arg1 overflow <nuw > : index
2063+ func.func @fold_divui_of_muli_0 (%arg0 : index , %arg1 : index ) -> index {
2064+ %0 = arith.muli %arg0 , %arg1 overflow <nuw > : index
2065+ %1 = arith.divui %0 , %arg0 : index
2066+ return %1 : index
2067+ }
2068+ // CHECK-LABEL: func @fold_divui_of_muli_0(
2069+ // CHECK-SAME: %[[ARG0:.+]]: index,
2070+ // CHECK-SAME: %[[ARG1:.+]]: index)
2071+ // CHECK: return %[[ARG1]]
2072+
2073+ func.func @fold_divui_of_muli_1 (%arg0 : index , %arg1 : index ) -> index {
2074+ %0 = arith.muli %arg0 , %arg1 overflow <nuw > : index
20682075 %1 = arith.divui %0 , %arg1 : index
20692076 return %1 : index
20702077}
2078+ // CHECK-LABEL: func @fold_divui_of_muli_1(
2079+ // CHECK-SAME: %[[ARG0:.+]]: index,
2080+ // CHECK-SAME: %[[ARG1:.+]]: index)
2081+ // CHECK: return %[[ARG0]]
2082+
2083+ func.func @fold_divsi_of_muli_0 (%arg0 : index , %arg1 : index ) -> index {
2084+ %0 = arith.muli %arg0 , %arg1 overflow <nsw > : index
2085+ %1 = arith.divsi %0 , %arg0 : index
2086+ return %1 : index
2087+ }
2088+ // CHECK-LABEL: func @fold_divsi_of_muli_0(
2089+ // CHECK-SAME: %[[ARG0:.+]]: index,
2090+ // CHECK-SAME: %[[ARG1:.+]]: index)
2091+ // CHECK: return %[[ARG1]]
20712092
2072- // CHECK-LABEL: @test_divsi_mul
2073- // CHECK-SAME: (%[[ARG:.*]]: index, %{{.*}}: index)
2074- // CHECK: return %[[ARG]]
2075- func.func @test_divsi_mul (%arg0: index , %arg1: index ) -> index {
2076- %0 = arith.muli %arg1 , %arg0 overflow <nsw > : index
2093+ func.func @fold_divsi_of_muli_1 (%arg0 : index , %arg1 : index ) -> index {
2094+ %0 = arith.muli %arg0 , %arg1 overflow <nsw > : index
20772095 %1 = arith.divsi %0 , %arg1 : index
20782096 return %1 : index
20792097}
2098+ // CHECK-LABEL: func @fold_divsi_of_muli_1(
2099+ // CHECK-SAME: %[[ARG0:.+]]: index,
2100+ // CHECK-SAME: %[[ARG1:.+]]: index)
2101+ // CHECK: return %[[ARG0]]
2102+
2103+ // Do not fold divui(mul(a, v), v) -> a with nuw attribute.
2104+ func.func @no_fold_divui_of_muli (%arg0 : index , %arg1 : index ) -> index {
2105+ %0 = arith.muli %arg0 , %arg1 : index
2106+ %1 = arith.divui %0 , %arg0 : index
2107+ return %1 : index
2108+ }
2109+ // CHECK-LABEL: func @no_fold_divui_of_muli
2110+ // CHECK: %[[T0:.+]] = arith.muli
2111+ // CHECK: %[[T1:.+]] = arith.divui %[[T0]],
2112+ // CHECK: return %[[T1]]
2113+
2114+ // Do not fold divsi(mul(a, v), v) -> a with nuw attribute.
2115+ func.func @no_fold_divsi_of_muli (%arg0 : index , %arg1 : index ) -> index {
2116+ %0 = arith.muli %arg0 , %arg1 : index
2117+ %1 = arith.divsi %0 , %arg0 : index
2118+ return %1 : index
2119+ }
2120+ // CHECK-LABEL: func @no_fold_divsi_of_muli
2121+ // CHECK: %[[T0:.+]] = arith.muli
2122+ // CHECK: %[[T1:.+]] = arith.divsi %[[T0]],
2123+ // CHECK: return %[[T1]]
20802124
20812125// -----
20822126
0 commit comments