[InstCombine] add tests to show missing bitcast optimizations
authorSanjay Patel <spatel@rotateright.com>
Thu, 19 Nov 2015 21:32:25 +0000 (21:32 +0000)
committerSanjay Patel <spatel@rotateright.com>
Thu, 19 Nov 2015 21:32:25 +0000 (21:32 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253602 91177308-0d34-0410-b5e6-96231b3b80d8

test/Transforms/InstCombine/bitcast.ll

index 579839e4245b0aefbf78ca584308e84042222b08..2a8194e53032af3e17b8ec5c8f605e75064f5ade 100644 (file)
@@ -64,6 +64,35 @@ define float @test3(<2 x float> %A, <2 x i64> %B) {
 ; CHECK-NEXT:  ret float %add
 }
 
 ; CHECK-NEXT:  ret float %add
 }
 
+; TODO: Both bitcasts are unnecessary; change the extractelement.
+
+define float @bitcast_extelt1(<2 x float> %A) {
+  %bc1 = bitcast <2 x float> %A to <2 x i32>
+  %ext = extractelement <2 x i32> %bc1, i32 0
+  %bc2 = bitcast i32 %ext to float
+  ret float %bc2
+
+; CHECK-LABEL: @bitcast_extelt1(
+; CHECK-NEXT:  %bc1 = bitcast <2 x float> %A to <2 x i32>
+; CHECK-NEXT:  %ext = extractelement <2 x i32> %bc1, i32 0
+; CHECK-NEXT:  %bc2 = bitcast i32 %ext to float
+; CHECK-NEXT:  ret float %bc2
+}
+
+; TODO: Second bitcast can be folded into the first.
+
+define i64 @bitcast_extelt2(<4 x float> %A) {
+  %bc1 = bitcast <4 x float> %A to <2 x double>
+  %ext = extractelement <2 x double> %bc1, i32 1
+  %bc2 = bitcast double %ext to i64
+  ret i64 %bc2
+
+; CHECK-LABEL: @bitcast_extelt2(
+; CHECK-NEXT:  %bc1 = bitcast <4 x float> %A to <2 x double>
+; CHECK-NEXT:  %ext = extractelement <2 x double> %bc1, i32 1
+; CHECK-NEXT:  %bc2 = bitcast double %ext to i64
+; CHECK-NEXT:  ret i64 %bc2
+}
 
 define <2 x i32> @test4(i32 %A, i32 %B){
   %tmp38 = zext i32 %A to i64
 
 define <2 x i32> @test4(i32 %A, i32 %B){
   %tmp38 = zext i32 %A to i64