mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2026-07-25 12:46:26 -04:00
534da46914
Prior to this commit fmul and fadd binary operators were being canonicalized for both scalar and vector versions. We now canonicalize add, mul, and, or, and xor vector instructions. llvm-svn: 222006
74 lines
2.1 KiB
LLVM
74 lines
2.1 KiB
LLVM
; RUN: opt < %s -reassociate -S | FileCheck %s
|
|
|
|
; Canonicalize operands, but don't optimize floating point vector operations.
|
|
define <4 x float> @test1() {
|
|
; CHECK-LABEL: test1
|
|
; CHECK-NEXT: %tmp1 = fsub fast <4 x float> zeroinitializer, zeroinitializer
|
|
; CHECK-NEXT: %tmp2 = fmul fast <4 x float> %tmp1, zeroinitializer
|
|
|
|
%tmp1 = fsub fast <4 x float> zeroinitializer, zeroinitializer
|
|
%tmp2 = fmul fast <4 x float> zeroinitializer, %tmp1
|
|
ret <4 x float> %tmp2
|
|
}
|
|
|
|
; Commute integer vector operations.
|
|
define <2 x i32> @test2(<2 x i32> %x, <2 x i32> %y) {
|
|
; CHECK-LABEL: test2
|
|
; CHECK-NEXT: %tmp1 = add <2 x i32> %x, %y
|
|
; CHECK-NEXT: %tmp2 = add <2 x i32> %x, %y
|
|
; CHECK-NEXT: %tmp3 = add <2 x i32> %tmp1, %tmp2
|
|
|
|
%tmp1 = add <2 x i32> %x, %y
|
|
%tmp2 = add <2 x i32> %y, %x
|
|
%tmp3 = add <2 x i32> %tmp1, %tmp2
|
|
ret <2 x i32> %tmp3
|
|
}
|
|
|
|
define <2 x i32> @test3(<2 x i32> %x, <2 x i32> %y) {
|
|
; CHECK-LABEL: test3
|
|
; CHECK-NEXT: %tmp1 = mul <2 x i32> %x, %y
|
|
; CHECK-NEXT: %tmp2 = mul <2 x i32> %x, %y
|
|
; CHECK-NEXT: %tmp3 = mul <2 x i32> %tmp1, %tmp2
|
|
|
|
%tmp1 = mul <2 x i32> %x, %y
|
|
%tmp2 = mul <2 x i32> %y, %x
|
|
%tmp3 = mul <2 x i32> %tmp1, %tmp2
|
|
ret <2 x i32> %tmp3
|
|
}
|
|
|
|
define <2 x i32> @test4(<2 x i32> %x, <2 x i32> %y) {
|
|
; CHECK-LABEL: test4
|
|
; CHECK-NEXT: %tmp1 = and <2 x i32> %x, %y
|
|
; CHECK-NEXT: %tmp2 = and <2 x i32> %x, %y
|
|
; CHECK-NEXT: %tmp3 = and <2 x i32> %tmp1, %tmp2
|
|
|
|
%tmp1 = and <2 x i32> %x, %y
|
|
%tmp2 = and <2 x i32> %y, %x
|
|
%tmp3 = and <2 x i32> %tmp1, %tmp2
|
|
ret <2 x i32> %tmp3
|
|
}
|
|
|
|
define <2 x i32> @test5(<2 x i32> %x, <2 x i32> %y) {
|
|
; CHECK-LABEL: test5
|
|
; CHECK-NEXT: %tmp1 = or <2 x i32> %x, %y
|
|
; CHECK-NEXT: %tmp2 = or <2 x i32> %x, %y
|
|
; CHECK-NEXT: %tmp3 = or <2 x i32> %tmp1, %tmp2
|
|
|
|
%tmp1 = or <2 x i32> %x, %y
|
|
%tmp2 = or <2 x i32> %y, %x
|
|
%tmp3 = or <2 x i32> %tmp1, %tmp2
|
|
ret <2 x i32> %tmp3
|
|
}
|
|
|
|
define <2 x i32> @test6(<2 x i32> %x, <2 x i32> %y) {
|
|
; CHECK-LABEL: test6
|
|
; CHECK-NEXT: %tmp1 = xor <2 x i32> %x, %y
|
|
; CHECK-NEXT: %tmp2 = xor <2 x i32> %x, %y
|
|
; CHECK-NEXT: %tmp3 = xor <2 x i32> %tmp1, %tmp2
|
|
|
|
%tmp1 = xor <2 x i32> %x, %y
|
|
%tmp2 = xor <2 x i32> %y, %x
|
|
%tmp3 = xor <2 x i32> %tmp1, %tmp2
|
|
ret <2 x i32> %tmp3
|
|
}
|