llvm-6502/test/Transforms/InstCombine/2010-11-23-Distributed.ll
Duncan Sands 37bf92b523 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.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122399 91177308-0d34-0410-b5e6-96231b3b80d8
2010-12-22 13:36:08 +00:00

24 lines
486 B
LLVM

; RUN: opt < %s -instcombine -S | FileCheck %s
define i32 @foo(i32 %x, i32 %y) {
; CHECK: @foo
%add = add nsw i32 %y, %x
%mul = mul nsw i32 %add, %y
%square = mul nsw i32 %y, %y
%res = sub i32 %mul, %square
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
}