@@ -2161,6 +2161,158 @@ define i1 @mul_nuw_nsw_nonneg_cant_be_one_commuted(i8 %x, i8 %y) {
21612161 ret i1 %cmp
21622162}
21632163
2164+ define i8 @test_trunc_and_1 (i8 %a ) {
2165+ ; CHECK-LABEL: @test_trunc_and_1(
2166+ ; CHECK-NEXT: entry:
2167+ ; CHECK-NEXT: [[CAST:%.*]] = trunc i8 [[A:%.*]] to i1
2168+ ; CHECK-NEXT: br i1 [[CAST]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
2169+ ; CHECK: if.then:
2170+ ; CHECK-NEXT: [[B:%.*]] = and i8 [[A]], 1
2171+ ; CHECK-NEXT: ret i8 [[B]]
2172+ ; CHECK: if.else:
2173+ ; CHECK-NEXT: [[C:%.*]] = and i8 [[A]], 1
2174+ ; CHECK-NEXT: ret i8 [[C]]
2175+ ;
2176+ entry:
2177+ %cast = trunc i8 %a to i1
2178+ br i1 %cast , label %if.then , label %if.else
2179+
2180+ if.then:
2181+ %b = and i8 %a , 1
2182+ ret i8 %b
2183+
2184+ if.else:
2185+ %c = and i8 %a , 1
2186+ ret i8 %c
2187+ }
2188+
2189+ define i8 @test_not_trunc_and_1 (i8 %a ) {
2190+ ; CHECK-LABEL: @test_not_trunc_and_1(
2191+ ; CHECK-NEXT: entry:
2192+ ; CHECK-NEXT: [[CAST:%.*]] = trunc i8 [[A:%.*]] to i1
2193+ ; CHECK-NEXT: br i1 [[CAST]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
2194+ ; CHECK: if.then:
2195+ ; CHECK-NEXT: [[B:%.*]] = and i8 [[A]], 1
2196+ ; CHECK-NEXT: ret i8 [[B]]
2197+ ; CHECK: if.else:
2198+ ; CHECK-NEXT: [[C:%.*]] = and i8 [[A]], 1
2199+ ; CHECK-NEXT: ret i8 [[C]]
2200+ ;
2201+ entry:
2202+ %cast = trunc i8 %a to i1
2203+ %not = xor i1 %cast , true
2204+ br i1 %not , label %if.then , label %if.else
2205+
2206+ if.then:
2207+ %b = and i8 %a , 1
2208+ ret i8 %b
2209+
2210+ if.else:
2211+ %c = and i8 %a , 1
2212+ ret i8 %c
2213+ }
2214+
2215+ define i8 @neg_test_trunc_or_2 (i8 %a ) {
2216+ ; CHECK-LABEL: @neg_test_trunc_or_2(
2217+ ; CHECK-NEXT: entry:
2218+ ; CHECK-NEXT: [[CAST:%.*]] = trunc i8 [[A:%.*]] to i1
2219+ ; CHECK-NEXT: br i1 [[CAST]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
2220+ ; CHECK: if.then:
2221+ ; CHECK-NEXT: [[B:%.*]] = or i8 [[A]], 2
2222+ ; CHECK-NEXT: ret i8 [[B]]
2223+ ; CHECK: if.else:
2224+ ; CHECK-NEXT: [[C:%.*]] = or i8 [[A]], 2
2225+ ; CHECK-NEXT: ret i8 [[C]]
2226+ ;
2227+ entry:
2228+ %cast = trunc i8 %a to i1
2229+ br i1 %cast , label %if.then , label %if.else
2230+
2231+ if.then:
2232+ %b = or i8 %a , 2
2233+ ret i8 %b
2234+
2235+ if.else:
2236+ %c = or i8 %a , 2
2237+ ret i8 %c
2238+ }
2239+
2240+ define i8 @test_trunc_nuw_and_1 (i8 %a ) {
2241+ ; CHECK-LABEL: @test_trunc_nuw_and_1(
2242+ ; CHECK-NEXT: entry:
2243+ ; CHECK-NEXT: [[CAST:%.*]] = trunc nuw i8 [[A:%.*]] to i1
2244+ ; CHECK-NEXT: br i1 [[CAST]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
2245+ ; CHECK: if.then:
2246+ ; CHECK-NEXT: [[B:%.*]] = and i8 [[A]], 1
2247+ ; CHECK-NEXT: ret i8 [[B]]
2248+ ; CHECK: if.else:
2249+ ; CHECK-NEXT: [[C:%.*]] = and i8 [[A]], 1
2250+ ; CHECK-NEXT: ret i8 [[C]]
2251+ ;
2252+ entry:
2253+ %cast = trunc nuw i8 %a to i1
2254+ br i1 %cast , label %if.else , label %if.then
2255+
2256+ if.then:
2257+ %b = and i8 %a , 1
2258+ ret i8 %b
2259+
2260+ if.else:
2261+ %c = and i8 %a , 1
2262+ ret i8 %c
2263+ }
2264+
2265+ define i8 @test_trunc_nuw_or_2 (i8 %a ) {
2266+ ; CHECK-LABEL: @test_trunc_nuw_or_2(
2267+ ; CHECK-NEXT: entry:
2268+ ; CHECK-NEXT: [[CAST:%.*]] = trunc nuw i8 [[A:%.*]] to i1
2269+ ; CHECK-NEXT: br i1 [[CAST]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
2270+ ; CHECK: if.then:
2271+ ; CHECK-NEXT: [[B:%.*]] = or i8 [[A]], 2
2272+ ; CHECK-NEXT: ret i8 [[B]]
2273+ ; CHECK: if.else:
2274+ ; CHECK-NEXT: [[C:%.*]] = or i8 [[A]], 2
2275+ ; CHECK-NEXT: ret i8 [[C]]
2276+ ;
2277+ entry:
2278+ %cast = trunc nuw i8 %a to i1
2279+ br i1 %cast , label %if.else , label %if.then
2280+
2281+ if.then:
2282+ %b = or i8 %a , 2
2283+ ret i8 %b
2284+
2285+ if.else:
2286+ %c = or i8 %a , 2
2287+ ret i8 %c
2288+ }
2289+
2290+ define i8 @test_not_trunc_nuw_and_1 (i8 %a ) {
2291+ ; CHECK-LABEL: @test_not_trunc_nuw_and_1(
2292+ ; CHECK-NEXT: entry:
2293+ ; CHECK-NEXT: [[CAST:%.*]] = trunc nuw i8 [[A:%.*]] to i1
2294+ ; CHECK-NEXT: br i1 [[CAST]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
2295+ ; CHECK: if.then:
2296+ ; CHECK-NEXT: [[B:%.*]] = and i8 [[A]], 1
2297+ ; CHECK-NEXT: ret i8 [[B]]
2298+ ; CHECK: if.else:
2299+ ; CHECK-NEXT: [[C:%.*]] = and i8 [[A]], 1
2300+ ; CHECK-NEXT: ret i8 [[C]]
2301+ ;
2302+ entry:
2303+ %cast = trunc nuw i8 %a to i1
2304+ %not = xor i1 %cast , true
2305+ br i1 %not , label %if.then , label %if.else
2306+
2307+ if.then:
2308+ %b = and i8 %a , 1
2309+ ret i8 %b
2310+
2311+ if.else:
2312+ %c = and i8 %a , 1
2313+ ret i8 %c
2314+ }
2315+
21642316declare void @dummy ()
21652317declare void @use (i1 )
21662318declare void @sink (i8 )
0 commit comments