@@ -2033,6 +2033,152 @@ join:
20332033 ret void
20342034}
20352035
2036+ define i32 @many_indirect_phis (i1 %cond , i32 %a , i32 %b ) {
2037+ ; CHECK-LABEL: @many_indirect_phis(
2038+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[JOIN:%.*]]
2039+ ; CHECK: if:
2040+ ; CHECK-NEXT: call void @dummy()
2041+ ; CHECK-NEXT: br label [[JOIN]]
2042+ ; CHECK: join:
2043+ ; CHECK-NEXT: [[B_SINK:%.*]] = phi i32 [ [[A:%.*]], [[IF]] ], [ [[B:%.*]], [[TMP0:%.*]] ]
2044+ ; CHECK-NEXT: [[DOTSINK3:%.*]] = phi i32 [ 10, [[IF]] ], [ 11, [[TMP0]] ]
2045+ ; CHECK-NEXT: [[DOTSINK2:%.*]] = phi i32 [ 20, [[IF]] ], [ 21, [[TMP0]] ]
2046+ ; CHECK-NEXT: [[DOTSINK1:%.*]] = phi i32 [ 30, [[IF]] ], [ 31, [[TMP0]] ]
2047+ ; CHECK-NEXT: [[DOTSINK:%.*]] = phi i32 [ 40, [[IF]] ], [ 41, [[TMP0]] ]
2048+ ; CHECK-NEXT: [[ADD_0_B:%.*]] = add i32 [[B_SINK]], 1
2049+ ; CHECK-NEXT: [[ADD_1_B:%.*]] = add i32 [[ADD_0_B]], [[DOTSINK3]]
2050+ ; CHECK-NEXT: [[ADD_2_B:%.*]] = add i32 [[ADD_1_B]], [[DOTSINK2]]
2051+ ; CHECK-NEXT: [[ADD_3_B:%.*]] = add i32 [[ADD_2_B]], [[DOTSINK1]]
2052+ ; CHECK-NEXT: [[ADD_4_B:%.*]] = add i32 [[ADD_3_B]], [[DOTSINK]]
2053+ ; CHECK-NEXT: ret i32 [[ADD_4_B]]
2054+ ;
2055+ br i1 %cond , label %if , label %else
2056+
2057+ if:
2058+ call void @dummy ()
2059+ %add.0.a = add i32 %a , 1
2060+ %add.1.a = add i32 %add.0.a , 10
2061+ %add.2.a = add i32 %add.1.a , 20
2062+ %add.3.a = add i32 %add.2.a , 30
2063+ %add.4.a = add i32 %add.3.a , 40
2064+ br label %join
2065+
2066+ else:
2067+ %add.0.b = add i32 %b , 1
2068+ %add.1.b = add i32 %add.0.b , 11
2069+ %add.2.b = add i32 %add.1.b , 21
2070+ %add.3.b = add i32 %add.2.b , 31
2071+ %add.4.b = add i32 %add.3.b , 41
2072+ br label %join
2073+
2074+ join:
2075+ %phi = phi i32 [ %add.4.a , %if ], [ %add.4.b , %else ]
2076+ ret i32 %phi
2077+ }
2078+
2079+ define i32 @store_and_unrelated_many_phi_add (i1 %cond , ptr %p , i32 %a , i32 %b ) {
2080+ ; CHECK-LABEL: @store_and_unrelated_many_phi_add(
2081+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
2082+ ; CHECK: if:
2083+ ; CHECK-NEXT: call void @dummy()
2084+ ; CHECK-NEXT: [[ADD_1:%.*]] = add i32 [[A:%.*]], 2
2085+ ; CHECK-NEXT: br label [[JOIN:%.*]]
2086+ ; CHECK: else:
2087+ ; CHECK-NEXT: [[ADD_2:%.*]] = add i32 [[B:%.*]], 3
2088+ ; CHECK-NEXT: br label [[JOIN]]
2089+ ; CHECK: join:
2090+ ; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[ADD_1]], [[IF]] ], [ [[ADD_2]], [[ELSE]] ]
2091+ ; CHECK-NEXT: store i32 1, ptr [[P:%.*]], align 4
2092+ ; CHECK-NEXT: ret i32 [[PHI]]
2093+ ;
2094+ br i1 %cond , label %if , label %else
2095+
2096+ if:
2097+ call void @dummy ()
2098+ %add.1 = add i32 %a , 2
2099+ store i32 1 , ptr %p
2100+ br label %join
2101+
2102+ else:
2103+ %add.2 = add i32 %b , 3
2104+ store i32 1 , ptr %p
2105+ br label %join
2106+
2107+ join:
2108+ %phi = phi i32 [ %add.1 , %if ], [ %add.2 , %else ]
2109+ ret i32 %phi
2110+ }
2111+
2112+ define i32 @store_and_related_many_phi_add (i1 %cond , ptr %p , i32 %a , i32 %b ) {
2113+ ; CHECK-LABEL: @store_and_related_many_phi_add(
2114+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
2115+ ; CHECK: if:
2116+ ; CHECK-NEXT: call void @dummy()
2117+ ; CHECK-NEXT: [[ADD_1:%.*]] = add i32 [[A:%.*]], 2
2118+ ; CHECK-NEXT: br label [[JOIN:%.*]]
2119+ ; CHECK: else:
2120+ ; CHECK-NEXT: [[ADD_2:%.*]] = add i32 [[B:%.*]], 3
2121+ ; CHECK-NEXT: br label [[JOIN]]
2122+ ; CHECK: join:
2123+ ; CHECK-NEXT: [[ADD_2_SINK:%.*]] = phi i32 [ [[ADD_2]], [[ELSE]] ], [ [[ADD_1]], [[IF]] ]
2124+ ; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[ADD_1]], [[IF]] ], [ [[ADD_2]], [[ELSE]] ]
2125+ ; CHECK-NEXT: store i32 [[ADD_2_SINK]], ptr [[P:%.*]], align 4
2126+ ; CHECK-NEXT: ret i32 [[PHI]]
2127+ ;
2128+ br i1 %cond , label %if , label %else
2129+
2130+ if:
2131+ call void @dummy ()
2132+ %add.1 = add i32 %a , 2
2133+ store i32 %add.1 , ptr %p
2134+ br label %join
2135+
2136+ else:
2137+ %add.2 = add i32 %b , 3
2138+ store i32 %add.2 , ptr %p
2139+ br label %join
2140+
2141+ join:
2142+ %phi = phi i32 [ %add.1 , %if ], [ %add.2 , %else ]
2143+ ret i32 %phi
2144+ }
2145+
2146+ define i32 @store_and_unrelated_many_phi_add2 (i1 %cond , ptr %p , i32 %a , i32 %b ) {
2147+ ; CHECK-LABEL: @store_and_unrelated_many_phi_add2(
2148+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
2149+ ; CHECK: if:
2150+ ; CHECK-NEXT: call void @dummy()
2151+ ; CHECK-NEXT: [[ADD_1:%.*]] = add i32 [[A:%.*]], 2
2152+ ; CHECK-NEXT: br label [[JOIN:%.*]]
2153+ ; CHECK: else:
2154+ ; CHECK-NEXT: [[ADD_2:%.*]] = add i32 [[B:%.*]], 3
2155+ ; CHECK-NEXT: br label [[JOIN]]
2156+ ; CHECK: join:
2157+ ; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[ADD_1]], [[IF]] ], [ [[ADD_2]], [[ELSE]] ]
2158+ ; CHECK-NEXT: [[ADD_A_2:%.*]] = add i32 [[A]], 1
2159+ ; CHECK-NEXT: store i32 [[ADD_A_2]], ptr [[P:%.*]], align 4
2160+ ; CHECK-NEXT: ret i32 [[PHI]]
2161+ ;
2162+ br i1 %cond , label %if , label %else
2163+
2164+ if:
2165+ call void @dummy ()
2166+ %add.1 = add i32 %a , 2
2167+ %add.a.1 = add i32 %a , 1
2168+ store i32 %add.a.1 , ptr %p
2169+ br label %join
2170+
2171+ else:
2172+ %add.2 = add i32 %b , 3
2173+ %add.a.2 = add i32 %a , 1
2174+ store i32 %add.a.2 , ptr %p
2175+ br label %join
2176+
2177+ join:
2178+ %phi = phi i32 [ %add.1 , %if ], [ %add.2 , %else ]
2179+ ret i32 %phi
2180+ }
2181+
20362182declare void @dummy ()
20372183declare void @use.ptr (ptr )
20382184
0 commit comments