diff options
| author | Benjamin Kramer <benny.kra@googlemail.com> | 2013-06-29 21:17:04 +0000 |
|---|---|---|
| committer | Benjamin Kramer <benny.kra@googlemail.com> | 2013-06-29 21:17:04 +0000 |
| commit | 4093f29366524144562a6b9fbc32e90f1abe641b (patch) | |
| tree | 38e0e1fc553d8a3fc00a20b39ff50741299f298c /llvm/test/Transforms | |
| parent | 396906456f5ea7952866ed338727594e60345d46 (diff) | |
| download | bcm5719-llvm-4093f29366524144562a6b9fbc32e90f1abe641b.tar.gz bcm5719-llvm-4093f29366524144562a6b9fbc32e90f1abe641b.zip | |
InstCombine: Also turn selects fed by an and into arithmetic when the types don't match.
Inserting a zext or trunc is sufficient. This pattern is somewhat common in
LLVM's pointer mangling code.
llvm-svn: 185270
Diffstat (limited to 'llvm/test/Transforms')
| -rw-r--r-- | llvm/test/Transforms/InstCombine/select.ll | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/select.ll b/llvm/test/Transforms/InstCombine/select.ll index c72a6f7c49c..5bf94232910 100644 --- a/llvm/test/Transforms/InstCombine/select.ll +++ b/llvm/test/Transforms/InstCombine/select.ll @@ -985,3 +985,39 @@ define i32 @select_icmp_ne_0_and_8_or_1073741824(i8 %x, i32 %y) { %select = select i1 %cmp, i32 %y, i32 %or ret i32 %select } + +define i32 @test65(i64 %x) { + %1 = and i64 %x, 16 + %2 = icmp ne i64 %1, 0 + %3 = select i1 %2, i32 40, i32 42 + ret i32 %3 + +; CHECK: @test65 +; CHECK: and i64 %x, 16 +; CHECK: trunc i64 %1 to i32 +; CHECK: lshr exact i32 %2, 3 +; CHECK: xor i32 %3, 42 +} + +define i32 @test66(i64 %x) { + %1 = and i64 %x, 4294967296 + %2 = icmp ne i64 %1, 0 + %3 = select i1 %2, i32 40, i32 42 + ret i32 %3 + +; CHECK: @test66 +; CHECK: select +} + +define i32 @test67(i16 %x) { + %1 = and i16 %x, 4 + %2 = icmp ne i16 %1, 0 + %3 = select i1 %2, i32 40, i32 42 + ret i32 %3 + +; CHECK: @test67 +; CHECK: and i16 %x, 4 +; CHECK: zext i16 %1 to i32 +; CHECK: lshr exact i32 %2, 1 +; CHECK: xor i32 %3, 42 +} |

