@@ -1500,3 +1500,153 @@ latch:
15001500exit:
15011501 ret void
15021502}
1503+
1504+ define i32 @add_two_phi_node_can_fold (i1 %c , i32 %i , i32 %j ) {
1505+ ; CHECK-LABEL: @add_two_phi_node_can_fold(
1506+ ; CHECK-NEXT: entry:
1507+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
1508+ ; CHECK: if.then:
1509+ ; CHECK-NEXT: br label [[IF_END]]
1510+ ; CHECK: if.end:
1511+ ; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ]
1512+ ; CHECK-NEXT: [[Y:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ 0, [[ENTRY]] ]
1513+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[Y]], [[X]]
1514+ ; CHECK-NEXT: ret i32 [[ADD]]
1515+ ;
1516+ entry:
1517+ br i1 %c , label %if.then , label %if.end
1518+
1519+ if.then:
1520+ br label %if.end
1521+
1522+ if.end:
1523+ %x = phi i32 [ 0 , %if.then ], [ %j , %entry ]
1524+ %y = phi i32 [ %i , %if.then ], [ 0 , %entry ]
1525+ %add = add i32 %y , %x
1526+ ret i32 %add
1527+ }
1528+
1529+ define i32 @add_two_phi_node_cannt_fold (i1 %c , i32 %i , i32 %j ) {
1530+ ; CHECK-LABEL: @add_two_phi_node_cannt_fold(
1531+ ; CHECK-NEXT: entry:
1532+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
1533+ ; CHECK: if.then:
1534+ ; CHECK-NEXT: br label [[IF_END]]
1535+ ; CHECK: if.end:
1536+ ; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ]
1537+ ; CHECK-NEXT: [[Y:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ 1, [[ENTRY]] ]
1538+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[Y]], [[X]]
1539+ ; CHECK-NEXT: ret i32 [[ADD]]
1540+ ;
1541+ entry:
1542+ br i1 %c , label %if.then , label %if.end
1543+
1544+ if.then:
1545+ br label %if.end
1546+
1547+ if.end:
1548+ %x = phi i32 [ 0 , %if.then ], [ %j , %entry ]
1549+ %y = phi i32 [ %i , %if.then ], [ 1 , %entry ]
1550+ %add = add i32 %y , %x
1551+ ret i32 %add
1552+ }
1553+
1554+ define i32 @or_two_phi_node_can_fold (i1 %c , i32 %i , i32 %j ) {
1555+ ; CHECK-LABEL: @or_two_phi_node_can_fold(
1556+ ; CHECK-NEXT: entry:
1557+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
1558+ ; CHECK: if.then:
1559+ ; CHECK-NEXT: br label [[IF_END]]
1560+ ; CHECK: if.end:
1561+ ; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ]
1562+ ; CHECK-NEXT: [[Y:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ 0, [[ENTRY]] ]
1563+ ; CHECK-NEXT: [[ADD:%.*]] = or i32 [[Y]], [[X]]
1564+ ; CHECK-NEXT: ret i32 [[ADD]]
1565+ ;
1566+ entry:
1567+ br i1 %c , label %if.then , label %if.end
1568+
1569+ if.then:
1570+ br label %if.end
1571+
1572+ if.end:
1573+ %x = phi i32 [ 0 , %if.then ], [ %j , %entry ]
1574+ %y = phi i32 [ %i , %if.then ], [ 0 , %entry ]
1575+ %add = or i32 %y , %x
1576+ ret i32 %add
1577+ }
1578+
1579+ define i32 @and_two_phi_node_can_fold (i1 %c , i32 %i , i32 %j ) {
1580+ ; CHECK-LABEL: @and_two_phi_node_can_fold(
1581+ ; CHECK-NEXT: entry:
1582+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
1583+ ; CHECK: if.then:
1584+ ; CHECK-NEXT: br label [[IF_END]]
1585+ ; CHECK: if.end:
1586+ ; CHECK-NEXT: [[X:%.*]] = phi i32 [ -1, [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ]
1587+ ; CHECK-NEXT: [[Y:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ -1, [[ENTRY]] ]
1588+ ; CHECK-NEXT: [[ADD:%.*]] = and i32 [[Y]], [[X]]
1589+ ; CHECK-NEXT: ret i32 [[ADD]]
1590+ ;
1591+ entry:
1592+ br i1 %c , label %if.then , label %if.end
1593+
1594+ if.then:
1595+ br label %if.end
1596+
1597+ if.end:
1598+ %x = phi i32 [ -1 , %if.then ], [ %j , %entry ]
1599+ %y = phi i32 [ %i , %if.then ], [ -1 , %entry ]
1600+ %add = and i32 %y , %x
1601+ ret i32 %add
1602+ }
1603+
1604+ define i32 @mul_two_phi_node_can_fold (i1 %c , i32 %i , i32 %j ) {
1605+ ; CHECK-LABEL: @mul_two_phi_node_can_fold(
1606+ ; CHECK-NEXT: entry:
1607+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
1608+ ; CHECK: if.then:
1609+ ; CHECK-NEXT: br label [[IF_END]]
1610+ ; CHECK: if.end:
1611+ ; CHECK-NEXT: [[X:%.*]] = phi i32 [ 1, [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ]
1612+ ; CHECK-NEXT: [[Y:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ 1, [[ENTRY]] ]
1613+ ; CHECK-NEXT: [[ADD:%.*]] = mul i32 [[Y]], [[X]]
1614+ ; CHECK-NEXT: ret i32 [[ADD]]
1615+ ;
1616+ entry:
1617+ br i1 %c , label %if.then , label %if.end
1618+
1619+ if.then:
1620+ br label %if.end
1621+
1622+ if.end:
1623+ %x = phi i32 [ 1 , %if.then ], [ %j , %entry ]
1624+ %y = phi i32 [ %i , %if.then ], [ 1 , %entry ]
1625+ %add = mul i32 %y , %x
1626+ ret i32 %add
1627+ }
1628+
1629+ define i32 @xor_two_phi_node_can_fold (i1 %c , i32 %i , i32 %j ) {
1630+ ; CHECK-LABEL: @xor_two_phi_node_can_fold(
1631+ ; CHECK-NEXT: entry:
1632+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
1633+ ; CHECK: if.then:
1634+ ; CHECK-NEXT: br label [[IF_END]]
1635+ ; CHECK: if.end:
1636+ ; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ]
1637+ ; CHECK-NEXT: [[Y:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ 0, [[ENTRY]] ]
1638+ ; CHECK-NEXT: [[ADD:%.*]] = xor i32 [[Y]], [[X]]
1639+ ; CHECK-NEXT: ret i32 [[ADD]]
1640+ ;
1641+ entry:
1642+ br i1 %c , label %if.then , label %if.end
1643+
1644+ if.then:
1645+ br label %if.end
1646+
1647+ if.end:
1648+ %x = phi i32 [ 0 , %if.then ], [ %j , %entry ]
1649+ %y = phi i32 [ %i , %if.then ], [ 0 , %entry ]
1650+ %add = xor i32 %y , %x
1651+ ret i32 %add
1652+ }
0 commit comments