@@ -2033,6 +2033,152 @@ join:
2033
2033
ret void
2034
2034
}
2035
2035
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
+
2036
2182
declare void @dummy ()
2037
2183
declare void @use.ptr (ptr )
2038
2184
0 commit comments