| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -passes=loop-vectorize -force-vector-width=2 -S %s 2>&1 | FileCheck %s |
| |
| target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" |
| target triple = "x86_64-grtev4-linux-gnu" |
| |
| define void @copy_bitcast_fusion(ptr noalias %foo, ptr noalias %bar) { |
| ; CHECK-LABEL: define void @copy_bitcast_fusion( |
| ; CHECK-SAME: ptr noalias [[FOO:%.*]], ptr noalias [[BAR:%.*]]) { |
| ; CHECK-NEXT: [[HEADER:.*:]] |
| ; CHECK-NEXT: br label %[[VECTOR_PH:.*]] |
| ; CHECK: [[VECTOR_PH]]: |
| ; CHECK-NEXT: br label %[[VECTOR_BODY:.*]] |
| ; CHECK: [[VECTOR_BODY]]: |
| ; CHECK-NEXT: [[TMP0:%.*]] = select i1 false, i64 1, i64 0 |
| ; CHECK-NEXT: [[TMP1:%.*]] = select i1 true, i64 1, i64 0 |
| ; CHECK-NEXT: [[TMP2:%.*]] = getelementptr float, ptr [[FOO]], i64 [[TMP0]] |
| ; CHECK-NEXT: [[TMP3:%.*]] = getelementptr float, ptr [[FOO]], i64 [[TMP1]] |
| ; CHECK-NEXT: [[TMP4:%.*]] = load float, ptr [[TMP2]], align 4 |
| ; CHECK-NEXT: [[TMP5:%.*]] = load float, ptr [[TMP3]], align 4 |
| ; CHECK-NEXT: [[TMP6:%.*]] = insertelement <2 x float> poison, float [[TMP4]], i32 0 |
| ; CHECK-NEXT: [[TMP7:%.*]] = insertelement <2 x float> [[TMP6]], float [[TMP5]], i32 1 |
| ; CHECK-NEXT: store <2 x float> [[TMP7]], ptr [[BAR]], align 4 |
| ; CHECK-NEXT: br label %[[MIDDLE_BLOCK:.*]] |
| ; CHECK: [[MIDDLE_BLOCK]]: |
| ; CHECK-NEXT: br label %[[EXIT:.*]] |
| ; CHECK: [[EXIT]]: |
| ; CHECK-NEXT: ret void |
| ; |
| header: |
| br label %body |
| |
| body: |
| %iv = phi i64 [ 0, %header ], [ %iv.next, %body ] |
| %iv.trunc = trunc i64 %iv to i1 |
| %iv.trunc2 = select i1 %iv.trunc, i64 1, i64 0 |
| %load.addr = getelementptr float, ptr %foo, i64 %iv.trunc2 |
| %l1 = load float, ptr %load.addr, align 4 |
| %store.addr = getelementptr float, ptr %bar, i64 %iv |
| store float %l1, ptr %store.addr, align 4 |
| %iv.next = add i64 %iv, 1 |
| %exitcond.not = icmp eq i64 %iv, 1 |
| br i1 %exitcond.not, label %exit, label %body |
| |
| exit: |
| ret void |
| } |
| |