1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 04:02:41 +01:00
llvm-mirror/test/Transforms/InstCombine/bitcast-vec-canon.ll
Sanjay Patel 3f624d4650 [InstCombine] canonicalize (bitcast (extractelement X)) --> (extractelement(bitcast X))
This change was discussed in D15392. It allows us to remove the fold that was added
in:
http://reviews.llvm.org/r255261

...and it will allow us to generalize this fold:
http://reviews.llvm.org/rL112232

while preserving the order of bitcast + extract that it produces and testing shows
is better handled by the backend.

Note that the existing check for "isVectorTy()" wasn't strong enough in general
and specifically because: x86_mmx. It's not a vector, but it's not vectorizable
either. So here we check VectorType::isValidElementType() directly before 
proceeding with the transform.

llvm-svn: 255433
2015-12-12 16:44:48 +00:00

42 lines
911 B
LLVM

; RUN: opt < %s -instcombine -S | FileCheck %s
define double @a(<1 x i64> %y) {
%c = bitcast <1 x i64> %y to double
ret double %c
; CHECK-LABEL: @a(
; CHECK-NEXT: bitcast <1 x i64> %y to <1 x double>
; CHECK-NEXT: extractelement <1 x double> {{.*}}, i32 0
; CHECK-NEXT: ret double
}
define i64 @b(<1 x i64> %y) {
%c = bitcast <1 x i64> %y to i64
ret i64 %c
; CHECK-LABEL: @b(
; CHECK-NEXT: extractelement <1 x i64> %y, i32 0
; CHECK-NEXT: ret i64
}
define <1 x i64> @c(double %y) {
%c = bitcast double %y to <1 x i64>
ret <1 x i64> %c
; CHECK-LABEL: @c(
; CHECK-NEXT: bitcast double %y to i64
; CHECK-NEXT: insertelement <1 x i64> undef, i64 {{.*}}, i32 0
; CHECK-NEXT: ret <1 x i64>
}
define <1 x i64> @d(i64 %y) {
%c = bitcast i64 %y to <1 x i64>
ret <1 x i64> %c
; CHECK-LABEL: @d(
; CHECK-NEXT: insertelement <1 x i64> undef, i64 %y, i32 0
; CHECK-NEXT: ret <1 x i64>
}