diff options
Diffstat (limited to 'llvm/test')
| -rw-r--r-- | llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll b/llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll index 4223660db3d..47c2a139a47 100644 --- a/llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll +++ b/llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll @@ -125,3 +125,53 @@ end: ret <8 x i16> %t6 } +; The widening shuffle must be inserted at a valid point (after the PHIs). + +define <4 x double> @pr25999_phis1(i1 %c, <2 x double> %a, <4 x double> %b) { +; CHECK-LABEL: @pr25999_phis1( +; CHECK: %tmp1 = phi <2 x double> [ %a, %bb1 ], [ %r, %bb2 ] +; CHECK-NEXT: %tmp2 = phi <4 x double> [ %b, %bb1 ], [ zeroinitializer, %bb2 ] +; CHECK-NEXT: %[[WIDEVEC:.*]] = shufflevector <2 x double> %tmp1, <2 x double> undef, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef> +; CHECK-NEXT: %tmp4 = shufflevector <4 x double> %tmp2, <4 x double> %[[WIDEVEC]], <4 x i32> <i32 0, i32 1, i32 4, i32 3> +; CHECK-NEXT: ret <4 x double> %tmp4 +bb1: + br i1 %c, label %bb2, label %bb3 + +bb2: + %r = call <2 x double> @dummy(<2 x double> %a) + br label %bb3 + +bb3: + %tmp1 = phi <2 x double> [ %a, %bb1 ], [ %r, %bb2 ] + %tmp2 = phi <4 x double> [ %b, %bb1 ], [ zeroinitializer, %bb2 ] + %tmp3 = extractelement <2 x double> %tmp1, i32 0 + %tmp4 = insertelement <4 x double> %tmp2, double %tmp3, i32 2 + ret <4 x double> %tmp4 +} + +declare <2 x double> @dummy(<2 x double>) + +define <4 x double> @pr25999_phis2(i1 %c, <2 x double> %a, <4 x double> %b) { +; CHECK-LABEL: @pr25999_phis2( +; CHECK: %tmp1 = phi <2 x double> [ %a, %bb1 ], [ %r, %bb2 ] +; CHECK-NEXT: %tmp2 = phi <4 x double> [ %b, %bb1 ], [ zeroinitializer, %bb2 ] +; CHECK-NEXT: %d = fadd <2 x double> %tmp1, %tmp1 +; CHECK-NEXT: %[[WIDEVEC:.*]] = shufflevector <2 x double> %d, <2 x double> undef, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef> +; CHECK-NEXT: %tmp4 = shufflevector <4 x double> %tmp2, <4 x double> %[[WIDEVEC]], <4 x i32> <i32 0, i32 1, i32 4, i32 3> +; CHECK-NEXT: ret <4 x double> %tmp4 +bb1: + br i1 %c, label %bb2, label %bb3 + +bb2: + %r = call <2 x double> @dummy(<2 x double> %a) + br label %bb3 + +bb3: + %tmp1 = phi <2 x double> [ %a, %bb1 ], [ %r, %bb2 ] + %tmp2 = phi <4 x double> [ %b, %bb1 ], [ zeroinitializer, %bb2 ] + %d = fadd <2 x double> %tmp1, %tmp1 + %tmp3 = extractelement <2 x double> %d, i32 0 + %tmp4 = insertelement <4 x double> %tmp2, double %tmp3, i32 2 + ret <4 x double> %tmp4 +} + |

