| ; RUN: opt < %s -jump-threading -instcombine -simplifycfg -S | FileCheck %s |
| |
| ; The three selects are jump-threaded so that instcombine can optimize, and |
| ; simplifycfg should turn the result into a single select. |
| define i32 @f(i32 %a, i32 %b) { |
| ; CHECK: select |
| ; CHECK-NOT: select |
| entry: |
| %0 = and i32 %a, 1 |
| %1 = and i32 %b, 1 |
| %xor = xor i32 %1, %a |
| %shr32 = lshr i32 %a, 1 |
| %cmp10 = icmp eq i32 %xor, 1 |
| %2 = xor i32 %b, 12345 |
| %b.addr.1 = select i1 %cmp10, i32 %2, i32 %b |
| %shr1633 = lshr i32 %b.addr.1, 1 |
| %3 = or i32 %shr1633, 54321 |
| %b.addr.2 = select i1 %cmp10, i32 %3, i32 %shr1633 |
| %shr1634 = lshr i32 %b.addr.2, 2 |
| %4 = or i32 %shr1634, 54320 |
| %b.addr.3 = select i1 %cmp10, i32 %4, i32 %shr1634 |
| ret i32 %b.addr.3 |
| } |
| |
| ; Case where the condition is not only used as condition but also as the |
| ; true or false value in at least one of the selects. |
| define i1 @g(i32 %a, i32 %b) { |
| ; CHECK: select |
| ; CHECK-NOT: select |
| entry: |
| %0 = and i32 %a, 1 |
| %1 = and i32 %b, 1 |
| %xor = xor i32 %1, %a |
| %shr32 = lshr i32 %a, 1 |
| %cmp10 = icmp eq i32 %xor, 1 |
| %2 = xor i32 %b, 12345 |
| %b.addr.1 = select i1 %cmp10, i32 %2, i32 %b |
| %shr1633 = lshr i32 %b.addr.1, 1 |
| %3 = or i32 %shr1633, 54321 |
| %b.addr.2 = select i1 %cmp10, i32 %3, i32 %shr1633 |
| %shr1634 = lshr i32 %b.addr.2, 2 |
| %4 = icmp eq i32 %shr1634, 54320 |
| %b.addr.3 = select i1 %cmp10, i1 %4, i1 %cmp10 |
| ret i1 %b.addr.3 |
| } |