@@ -1664,3 +1664,52 @@ entry:
16641664 %or = or <2 x i32 > %add , %c
16651665 ret <2 x i32 > %or
16661666}
1667+
1668+ declare i32 @callee ()
1669+
1670+ define i32 @xor_disjoint () {
1671+ ; CHECK-LABEL: @xor_disjoint(
1672+ ; CHECK-NEXT: [[CALL1:%.*]] = call i32 @callee(), !range [[RNG0:![0-9]+]]
1673+ ; CHECK-NEXT: [[XOR:%.*]] = or disjoint i32 [[CALL1]], 4096
1674+ ; CHECK-NEXT: ret i32 [[XOR]]
1675+ ;
1676+ %call1 = call i32 @callee (), !range !0
1677+ %xor = xor i32 %call1 , 4096
1678+ ret i32 %xor
1679+ }
1680+
1681+ define i32 @xor_disjoint2 () {
1682+ ; CHECK-LABEL: @xor_disjoint2(
1683+ ; CHECK-NEXT: [[CALL1:%.*]] = call i32 @callee(), !range [[RNG1:![0-9]+]]
1684+ ; CHECK-NEXT: [[XOR:%.*]] = or disjoint i32 [[CALL1]], 512
1685+ ; CHECK-NEXT: ret i32 [[XOR]]
1686+ ;
1687+ %call1 = call i32 @callee (), !range !1
1688+ %xor = xor i32 %call1 , 512
1689+ ret i32 %xor
1690+ }
1691+
1692+ define i32 @xor_non_disjoint () {
1693+ ; CHECK-LABEL: @xor_non_disjoint(
1694+ ; CHECK-NEXT: [[CALL1:%.*]] = call i32 @callee(), !range [[RNG0]]
1695+ ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[CALL1]], 1024
1696+ ; CHECK-NEXT: ret i32 [[XOR]]
1697+ ;
1698+ %call1 = call i32 @callee (), !range !0
1699+ %xor = xor i32 %call1 , 1024
1700+ ret i32 %xor
1701+ }
1702+
1703+ define i32 @xor_non_disjoint2 () {
1704+ ; CHECK-LABEL: @xor_non_disjoint2(
1705+ ; CHECK-NEXT: [[CALL1:%.*]] = call i32 @callee(), !range [[RNG1]]
1706+ ; CHECK-NEXT: [[XOR:%.*]] = and i32 [[CALL1]], 511
1707+ ; CHECK-NEXT: ret i32 [[XOR]]
1708+ ;
1709+ %call1 = call i32 @callee (), !range !1
1710+ %xor = xor i32 %call1 , 1024
1711+ ret i32 %xor
1712+ }
1713+
1714+ !0 = !{ i32 0 , i32 2048 }
1715+ !1 = !{ i32 1024 , i32 1536 }
0 commit comments