xref: /llvm-project/llvm/test/Transforms/LoopVectorize/vector-to-scalar-cast.ll (revision 78e1e6ace6c99ac3c96216a40836a1ac98d4f000)
1*78e1e6acSErikHogeman; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2*78e1e6acSErikHogeman; The test was crashing earlier due to a vectorization attempt; vector-to-scalar cast
3*78e1e6acSErikHogeman; is now forbidden in the legalizer, and the test isn't a vectorization candidate now.
4*78e1e6acSErikHogeman; RUN: opt -S -force-widen-divrem-via-safe-divisor=false -force-vector-width=4 --passes=loop-vectorize < %s | FileCheck %s
5*78e1e6acSErikHogeman
6*78e1e6acSErikHogemandefine void @vector_to_scalar_cast(ptr %out) {
7*78e1e6acSErikHogeman; CHECK-LABEL: define void @vector_to_scalar_cast(
8*78e1e6acSErikHogeman; CHECK-SAME: ptr [[OUT:%.*]]) {
9*78e1e6acSErikHogeman; CHECK-NEXT:  [[ENTRY:.*]]:
10*78e1e6acSErikHogeman; CHECK-NEXT:    [[VEC0:%.*]] = insertelement <2 x i16> undef, i16 0, i64 0
11*78e1e6acSErikHogeman; CHECK-NEXT:    [[VEC1:%.*]] = insertelement <2 x i16> [[VEC0]], i16 0, i64 1
12*78e1e6acSErikHogeman; CHECK-NEXT:    br label %[[LOOP:.*]]
13*78e1e6acSErikHogeman; CHECK:       [[LOOP]]:
14*78e1e6acSErikHogeman; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 1, %[[ENTRY]] ]
15*78e1e6acSErikHogeman; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i32 [[IV]], 11
16*78e1e6acSErikHogeman; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
17*78e1e6acSErikHogeman; CHECK-NEXT:    [[VEC_SCALAR_CAST:%.*]] = bitcast <2 x i16> [[VEC1]] to i32
18*78e1e6acSErikHogeman; CHECK-NEXT:    [[SREM:%.*]] = srem i32 0, [[VEC_SCALAR_CAST]]
19*78e1e6acSErikHogeman; CHECK-NEXT:    store i32 [[SREM]], ptr [[OUT]], align 4
20*78e1e6acSErikHogeman; CHECK-NEXT:    br i1 [[EXITCOND]], label %[[LOOP]], label %[[EXIT:.*]]
21*78e1e6acSErikHogeman; CHECK:       [[EXIT]]:
22*78e1e6acSErikHogeman; CHECK-NEXT:    ret void
23*78e1e6acSErikHogeman;
24*78e1e6acSErikHogemanentry:
25*78e1e6acSErikHogeman  %vec0 = insertelement <2 x i16> undef, i16 0, i64 0
26*78e1e6acSErikHogeman  %vec1 = insertelement <2 x i16> %vec0, i16 0, i64 1
27*78e1e6acSErikHogeman  br label %loop
28*78e1e6acSErikHogeman
29*78e1e6acSErikHogemanloop:
30*78e1e6acSErikHogeman  %iv = phi i32 [ %iv.next, %loop ], [ 1, %entry ]
31*78e1e6acSErikHogeman  %exitcond = icmp ne i32 %iv, 11
32*78e1e6acSErikHogeman  %iv.next = add nuw nsw i32 %iv, 1
33*78e1e6acSErikHogeman  %vec.scalar.cast = bitcast <2 x i16> %vec1 to i32
34*78e1e6acSErikHogeman  %srem = srem i32 0, %vec.scalar.cast
35*78e1e6acSErikHogeman  store i32 %srem, ptr %out
36*78e1e6acSErikHogeman  br i1 %exitcond, label %loop, label %exit
37*78e1e6acSErikHogeman
38*78e1e6acSErikHogemanexit:
39*78e1e6acSErikHogeman  ret void
40*78e1e6acSErikHogeman}
41