diff options
| author | Duncan Sands <baldrick@free.fr> | 2010-12-22 13:36:08 +0000 |
|---|---|---|
| committer | Duncan Sands <baldrick@free.fr> | 2010-12-22 13:36:08 +0000 |
| commit | fbb9ac3cca0d3576d43211a6b3ec0cd5db6ac84d (patch) | |
| tree | 75c001dfde6c0570ed787c8def96e4415148955a /llvm/test/Transforms/InstCombine/2010-11-23-Distributed.ll | |
| parent | aaedf8be1c51285eab4af5bc68f3ca4b95fb85ed (diff) | |
| download | bcm5719-llvm-fbb9ac3cca0d3576d43211a6b3ec0cd5db6ac84d.tar.gz bcm5719-llvm-fbb9ac3cca0d3576d43211a6b3ec0cd5db6ac84d.zip | |
Add a generic expansion transform: A op (B op' C) -> (A op B) op' (A op C)
if both A op B and A op C simplify. This fires fairly often but doesn't
make that much difference. On gcc-as-one-file it removes two "and"s and
turns one branch into a select.
llvm-svn: 122399
Diffstat (limited to 'llvm/test/Transforms/InstCombine/2010-11-23-Distributed.ll')
| -rw-r--r-- | llvm/test/Transforms/InstCombine/2010-11-23-Distributed.ll | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/llvm/test/Transforms/InstCombine/2010-11-23-Distributed.ll b/llvm/test/Transforms/InstCombine/2010-11-23-Distributed.ll index 13a5720dad2..4f8e8dc713b 100644 --- a/llvm/test/Transforms/InstCombine/2010-11-23-Distributed.ll +++ b/llvm/test/Transforms/InstCombine/2010-11-23-Distributed.ll @@ -5,7 +5,19 @@ define i32 @foo(i32 %x, i32 %y) { %mul = mul nsw i32 %add, %y %square = mul nsw i32 %y, %y %res = sub i32 %mul, %square -; CHECK: %res = mul i32 %x, %y ret i32 %res -; CHECK: ret i32 %res +; CHECK-NEXT: mul i32 %x, %y +; CHECK-NEXT: ret i32 +} + +define i1 @bar(i64 %x, i64 %y) { +; CHECK: @bar + %a = and i64 %y, %x +; CHECK: and +; CHECK-NOT: and + %not = xor i64 %a, -1 + %b = and i64 %y, %not + %r = icmp eq i64 %b, 0 + ret i1 %r +; CHECK: ret i1 } |

