CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
342 lines
14 KiB
LLVM
342 lines
14 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --filter-out-after "scalar.ph:" --version 5
|
|
; RUN: opt -p loop-vectorize -force-widen-divrem-via-masked-intrinsic=false -force-vector-width=2 -S %s | FileCheck %s
|
|
|
|
target datalayout="p:16:16"
|
|
|
|
@src = global [16 x i64] zeroinitializer
|
|
|
|
; Test cases for https://github.com/llvm/llvm-project/issues/142957
|
|
|
|
; Cannot speculatively execute %l, because %div may trigger UB and must be
|
|
; predicated.
|
|
define void @ptr_depends_on_sdiv(ptr noalias %dst, i16 noundef %off) {
|
|
; CHECK-LABEL: define void @ptr_depends_on_sdiv(
|
|
; CHECK-SAME: ptr noalias [[DST:%.*]], i16 noundef [[OFF:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: br label %[[VECTOR_PH:.*]]
|
|
; CHECK: [[VECTOR_PH]]:
|
|
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
|
|
; CHECK: [[VECTOR_BODY]]:
|
|
; CHECK-NEXT: br i1 false, label %[[PRED_SDIV_IF:.*]], label %[[PRED_SDIV_CONTINUE:.*]]
|
|
; CHECK: [[PRED_SDIV_IF]]:
|
|
; CHECK-NEXT: [[TMP2:%.*]] = sdiv i16 24316, [[OFF]]
|
|
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i16> poison, i16 [[TMP2]], i64 0
|
|
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE]]
|
|
; CHECK: [[PRED_SDIV_CONTINUE]]:
|
|
; CHECK-NEXT: [[TMP3:%.*]] = phi <2 x i16> [ poison, %[[VECTOR_BODY]] ], [ [[TMP1]], %[[PRED_SDIV_IF]] ]
|
|
; CHECK-NEXT: br i1 true, label %[[PRED_SDIV_IF1:.*]], label %[[PRED_SDIV_CONTINUE2:.*]]
|
|
; CHECK: [[PRED_SDIV_IF1]]:
|
|
; CHECK-NEXT: [[TMP18:%.*]] = sdiv i16 24316, [[OFF]]
|
|
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i16> [[TMP3]], i16 [[TMP18]], i64 1
|
|
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE2]]
|
|
; CHECK: [[PRED_SDIV_CONTINUE2]]:
|
|
; CHECK-NEXT: [[TMP8:%.*]] = phi <2 x i16> [ [[TMP3]], %[[PRED_SDIV_CONTINUE]] ], [ [[TMP4]], %[[PRED_SDIV_IF1]] ]
|
|
; CHECK-NEXT: [[TMP22:%.*]] = shl <2 x i16> [[TMP8]], splat (i16 14)
|
|
; CHECK-NEXT: [[TMP23:%.*]] = sub <2 x i16> <i16 16392, i16 16393>, [[TMP22]]
|
|
; CHECK-NEXT: br i1 false, label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
|
|
; CHECK: [[PRED_STORE_IF]]:
|
|
; CHECK-NEXT: [[TMP13:%.*]] = extractelement <2 x i16> [[TMP23]], i64 0
|
|
; CHECK-NEXT: [[TMP24:%.*]] = getelementptr inbounds i64, ptr @src, i16 [[TMP13]]
|
|
; CHECK-NEXT: [[TMP9:%.*]] = load i64, ptr [[TMP24]], align 1
|
|
; CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds i64, ptr [[DST]], i16 9
|
|
; CHECK-NEXT: store i64 [[TMP9]], ptr [[TMP11]], align 1
|
|
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE]]
|
|
; CHECK: [[PRED_STORE_CONTINUE]]:
|
|
; CHECK-NEXT: br i1 true, label %[[PRED_STORE_IF3:.*]], label %[[PRED_STORE_CONTINUE4:.*]]
|
|
; CHECK: [[PRED_STORE_IF3]]:
|
|
; CHECK-NEXT: [[TMP25:%.*]] = extractelement <2 x i16> [[TMP23]], i64 1
|
|
; CHECK-NEXT: [[TMP20:%.*]] = getelementptr inbounds i64, ptr @src, i16 [[TMP25]]
|
|
; CHECK-NEXT: [[TMP15:%.*]] = load i64, ptr [[TMP20]], align 1
|
|
; CHECK-NEXT: [[TMP17:%.*]] = getelementptr inbounds i64, ptr [[DST]], i16 10
|
|
; CHECK-NEXT: store i64 [[TMP15]], ptr [[TMP17]], align 1
|
|
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE4]]
|
|
; CHECK: [[PRED_STORE_CONTINUE4]]:
|
|
; CHECK-NEXT: br label %[[MIDDLE_BLOCK:.*]]
|
|
; CHECK: [[MIDDLE_BLOCK]]:
|
|
; CHECK-NEXT: br label %[[EXIT:.*]]
|
|
; CHECK: [[EXIT]]:
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
br label %loop.header
|
|
|
|
loop.header:
|
|
%iv = phi i16 [ 9, %entry ], [ %iv.next, %loop.latch ]
|
|
%cmp1 = icmp eq i16 %iv, 10
|
|
br i1 %cmp1, label %if.then, label %loop.latch
|
|
|
|
if.then:
|
|
%div = sdiv i16 24316, %off
|
|
%add.iv = add i16 %iv, 16383
|
|
%s = shl i16 %div, 14
|
|
%sub6 = sub i16 %add.iv, %s
|
|
%gep.src = getelementptr inbounds i64, ptr @src, i16 %sub6
|
|
%l = load i64, ptr %gep.src, align 1
|
|
%gep.dst = getelementptr inbounds i64, ptr %dst, i16 %iv
|
|
store i64 %l, ptr %gep.dst, align 1
|
|
br label %loop.latch
|
|
|
|
loop.latch:
|
|
%iv.next = add i16 %iv, 1
|
|
%ec = icmp eq i16 %iv.next, 11
|
|
br i1 %ec, label %exit, label %loop.header
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Cannot speculatively execute %l, because %off may be poison.
|
|
define void @ptr_depends_on_possibly_poison_value(ptr noalias %dst, i16 %off) {
|
|
; CHECK-LABEL: define void @ptr_depends_on_possibly_poison_value(
|
|
; CHECK-SAME: ptr noalias [[DST:%.*]], i16 [[OFF:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: br label %[[VECTOR_PH:.*]]
|
|
; CHECK: [[VECTOR_PH]]:
|
|
; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x i16> poison, i16 [[OFF]], i64 0
|
|
; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <2 x i16> [[BROADCAST_SPLATINSERT]], <2 x i16> poison, <2 x i32> zeroinitializer
|
|
; CHECK-NEXT: [[TMP0:%.*]] = sub <2 x i16> splat (i16 1), [[BROADCAST_SPLAT]]
|
|
; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i16> [[TMP0]], [[BROADCAST_SPLAT]]
|
|
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
|
|
; CHECK: [[VECTOR_BODY]]:
|
|
; CHECK-NEXT: [[TMP3:%.*]] = add <2 x i16> <i16 9, i16 10>, [[TMP1]]
|
|
; CHECK-NEXT: br i1 false, label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
|
|
; CHECK: [[PRED_STORE_IF]]:
|
|
; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x i16> [[TMP3]], i64 0
|
|
; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds i64, ptr @src, i16 [[TMP5]]
|
|
; CHECK-NEXT: [[TMP9:%.*]] = load i64, ptr [[TMP14]], align 1
|
|
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i64, ptr [[DST]], i16 9
|
|
; CHECK-NEXT: store i64 [[TMP9]], ptr [[TMP8]], align 1
|
|
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE]]
|
|
; CHECK: [[PRED_STORE_CONTINUE]]:
|
|
; CHECK-NEXT: br i1 true, label %[[PRED_STORE_IF1:.*]], label %[[PRED_STORE_CONTINUE2:.*]]
|
|
; CHECK: [[PRED_STORE_IF1]]:
|
|
; CHECK-NEXT: [[TMP15:%.*]] = extractelement <2 x i16> [[TMP3]], i64 1
|
|
; CHECK-NEXT: [[TMP16:%.*]] = getelementptr inbounds i64, ptr @src, i16 [[TMP15]]
|
|
; CHECK-NEXT: [[TMP13:%.*]] = load i64, ptr [[TMP16]], align 1
|
|
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i64, ptr [[DST]], i16 10
|
|
; CHECK-NEXT: store i64 [[TMP13]], ptr [[TMP12]], align 1
|
|
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE2]]
|
|
; CHECK: [[PRED_STORE_CONTINUE2]]:
|
|
; CHECK-NEXT: br label %[[MIDDLE_BLOCK:.*]]
|
|
; CHECK: [[MIDDLE_BLOCK]]:
|
|
; CHECK-NEXT: br label %[[EXIT:.*]]
|
|
; CHECK: [[EXIT]]:
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
br label %loop.header
|
|
|
|
loop.header:
|
|
%iv = phi i16 [ 9, %entry ], [ %iv.next, %loop.latch ]
|
|
%cmp1 = icmp eq i16 %iv, 10
|
|
br i1 %cmp1, label %if.then, label %loop.latch
|
|
|
|
if.then:
|
|
%sub = sub i16 1, %off
|
|
%add = add i16 %sub, %off
|
|
%add.iv = add i16 %iv, %add
|
|
%gep.src = getelementptr inbounds i64, ptr @src, i16 %add.iv
|
|
%l = load i64, ptr %gep.src, align 1
|
|
%gep.dst = getelementptr inbounds i64, ptr %dst, i16 %iv
|
|
store i64 %l, ptr %gep.dst, align 1
|
|
br label %loop.latch
|
|
|
|
loop.latch:
|
|
%iv.next = add i16 %iv, 1
|
|
%ec = icmp eq i16 %iv.next, 11
|
|
br i1 %ec, label %exit, label %loop.header
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @ptr_doesnt_depend_on_poison_or_ub(ptr noalias %dst, i16 noundef %off) {
|
|
; CHECK-LABEL: define void @ptr_doesnt_depend_on_poison_or_ub(
|
|
; CHECK-SAME: ptr noalias [[DST:%.*]], i16 noundef [[OFF:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: br label %[[VECTOR_PH:.*]]
|
|
; CHECK: [[VECTOR_PH]]:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = sub i16 1, [[OFF]]
|
|
; CHECK-NEXT: [[TMP1:%.*]] = add i16 [[TMP0]], [[OFF]]
|
|
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
|
|
; CHECK: [[VECTOR_BODY]]:
|
|
; CHECK-NEXT: [[TMP3:%.*]] = add i16 9, [[TMP1]]
|
|
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i64, ptr @src, i16 [[TMP3]]
|
|
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i64>, ptr [[TMP4]], align 1
|
|
; CHECK-NEXT: br i1 false, label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
|
|
; CHECK: [[PRED_STORE_IF]]:
|
|
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i64, ptr [[DST]], i16 9
|
|
; CHECK-NEXT: [[TMP9:%.*]] = extractelement <2 x i64> [[WIDE_LOAD]], i64 0
|
|
; CHECK-NEXT: store i64 [[TMP9]], ptr [[TMP8]], align 1
|
|
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE]]
|
|
; CHECK: [[PRED_STORE_CONTINUE]]:
|
|
; CHECK-NEXT: br i1 true, label %[[PRED_STORE_IF1:.*]], label %[[PRED_STORE_CONTINUE2:.*]]
|
|
; CHECK: [[PRED_STORE_IF1]]:
|
|
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i64, ptr [[DST]], i16 10
|
|
; CHECK-NEXT: [[TMP13:%.*]] = extractelement <2 x i64> [[WIDE_LOAD]], i64 1
|
|
; CHECK-NEXT: store i64 [[TMP13]], ptr [[TMP12]], align 1
|
|
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE2]]
|
|
; CHECK: [[PRED_STORE_CONTINUE2]]:
|
|
; CHECK-NEXT: br label %[[MIDDLE_BLOCK:.*]]
|
|
; CHECK: [[MIDDLE_BLOCK]]:
|
|
; CHECK-NEXT: br label %[[EXIT:.*]]
|
|
; CHECK: [[EXIT]]:
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
br label %loop.header
|
|
|
|
loop.header:
|
|
%iv = phi i16 [ 9, %entry ], [ %iv.next, %loop.latch ]
|
|
%cmp1 = icmp eq i16 %iv, 10
|
|
br i1 %cmp1, label %if.then, label %loop.latch
|
|
|
|
if.then:
|
|
%sub = sub i16 1, %off
|
|
%add = add i16 %sub, %off
|
|
%add.iv = add i16 %iv, %add
|
|
%gep.src = getelementptr inbounds i64, ptr @src, i16 %add.iv
|
|
%l = load i64, ptr %gep.src, align 1
|
|
%gep.dst = getelementptr inbounds i64, ptr %dst, i16 %iv
|
|
store i64 %l, ptr %gep.dst, align 1
|
|
br label %loop.latch
|
|
|
|
loop.latch:
|
|
%iv.next = add i16 %iv, 1
|
|
%ec = icmp eq i16 %iv.next, 11
|
|
br i1 %ec, label %exit, label %loop.header
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Cannot speculatively execute %l, because %off may be poison.
|
|
define void @ptr_depends_on_possibly_poison_value_from_load(ptr noalias %dst) {
|
|
; CHECK-LABEL: define void @ptr_depends_on_possibly_poison_value_from_load(
|
|
; CHECK-SAME: ptr noalias [[DST:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: br label %[[VECTOR_PH:.*]]
|
|
; CHECK: [[VECTOR_PH]]:
|
|
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
|
|
; CHECK: [[VECTOR_BODY]]:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @src, align 1
|
|
; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x i16> poison, i16 [[TMP0]], i64 0
|
|
; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <2 x i16> [[BROADCAST_SPLATINSERT]], <2 x i16> poison, <2 x i32> zeroinitializer
|
|
; CHECK-NEXT: [[TMP2:%.*]] = sub <2 x i16> splat (i16 1), [[BROADCAST_SPLAT]]
|
|
; CHECK-NEXT: [[TMP3:%.*]] = add <2 x i16> [[TMP2]], [[BROADCAST_SPLAT]]
|
|
; CHECK-NEXT: [[TMP4:%.*]] = add <2 x i16> <i16 9, i16 10>, [[TMP3]]
|
|
; CHECK-NEXT: br i1 false, label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
|
|
; CHECK: [[PRED_STORE_IF]]:
|
|
; CHECK-NEXT: [[TMP6:%.*]] = extractelement <2 x i16> [[TMP4]], i64 0
|
|
; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i64, ptr @src, i16 [[TMP6]]
|
|
; CHECK-NEXT: [[TMP10:%.*]] = load i64, ptr [[TMP15]], align 1
|
|
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i64, ptr [[DST]], i16 9
|
|
; CHECK-NEXT: store i64 [[TMP10]], ptr [[TMP9]], align 1
|
|
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE]]
|
|
; CHECK: [[PRED_STORE_CONTINUE]]:
|
|
; CHECK-NEXT: br i1 true, label %[[PRED_STORE_IF1:.*]], label %[[PRED_STORE_CONTINUE2:.*]]
|
|
; CHECK: [[PRED_STORE_IF1]]:
|
|
; CHECK-NEXT: [[TMP16:%.*]] = extractelement <2 x i16> [[TMP4]], i64 1
|
|
; CHECK-NEXT: [[TMP17:%.*]] = getelementptr inbounds i64, ptr @src, i16 [[TMP16]]
|
|
; CHECK-NEXT: [[TMP14:%.*]] = load i64, ptr [[TMP17]], align 1
|
|
; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds i64, ptr [[DST]], i16 10
|
|
; CHECK-NEXT: store i64 [[TMP14]], ptr [[TMP13]], align 1
|
|
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE2]]
|
|
; CHECK: [[PRED_STORE_CONTINUE2]]:
|
|
; CHECK-NEXT: br label %[[MIDDLE_BLOCK:.*]]
|
|
; CHECK: [[MIDDLE_BLOCK]]:
|
|
; CHECK-NEXT: br label %[[EXIT:.*]]
|
|
; CHECK: [[EXIT]]:
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
br label %loop.header
|
|
|
|
loop.header:
|
|
%iv = phi i16 [ 9, %entry ], [ %iv.next, %loop.latch ]
|
|
%off = load i16, ptr @src, align 1
|
|
%cmp1 = icmp eq i16 %iv, 10
|
|
br i1 %cmp1, label %if.then, label %loop.latch
|
|
|
|
if.then:
|
|
%sub = sub i16 1, %off
|
|
%add = add i16 %sub, %off
|
|
%add.iv = add i16 %iv, %add
|
|
%gep.src = getelementptr inbounds i64, ptr @src, i16 %add.iv
|
|
%l = load i64, ptr %gep.src, align 1
|
|
%gep.dst = getelementptr inbounds i64, ptr %dst, i16 %iv
|
|
store i64 %l, ptr %gep.dst, align 1
|
|
br label %loop.latch
|
|
|
|
loop.latch:
|
|
%iv.next = add i16 %iv, 1
|
|
%ec = icmp eq i16 %iv.next, 11
|
|
br i1 %ec, label %exit, label %loop.header
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Can speculatively execute %l, because %off cannot be poison due to !noundef.
|
|
define void @ptr_depends_on_noundef_load(ptr noalias %dst) {
|
|
; CHECK-LABEL: define void @ptr_depends_on_noundef_load(
|
|
; CHECK-SAME: ptr noalias [[DST:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: br label %[[VECTOR_PH:.*]]
|
|
; CHECK: [[VECTOR_PH]]:
|
|
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
|
|
; CHECK: [[VECTOR_BODY]]:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @src, align 1, !noundef [[META0:![0-9]+]]
|
|
; CHECK-NEXT: [[TMP2:%.*]] = sub i16 1, [[TMP0]]
|
|
; CHECK-NEXT: [[TMP3:%.*]] = add i16 [[TMP2]], [[TMP0]]
|
|
; CHECK-NEXT: [[TMP4:%.*]] = add i16 9, [[TMP3]]
|
|
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i64, ptr @src, i16 [[TMP4]]
|
|
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i64>, ptr [[TMP5]], align 1
|
|
; CHECK-NEXT: br i1 false, label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
|
|
; CHECK: [[PRED_STORE_IF]]:
|
|
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i64, ptr [[DST]], i16 9
|
|
; CHECK-NEXT: [[TMP10:%.*]] = extractelement <2 x i64> [[WIDE_LOAD]], i64 0
|
|
; CHECK-NEXT: store i64 [[TMP10]], ptr [[TMP9]], align 1
|
|
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE]]
|
|
; CHECK: [[PRED_STORE_CONTINUE]]:
|
|
; CHECK-NEXT: br i1 true, label %[[PRED_STORE_IF1:.*]], label %[[PRED_STORE_CONTINUE2:.*]]
|
|
; CHECK: [[PRED_STORE_IF1]]:
|
|
; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds i64, ptr [[DST]], i16 10
|
|
; CHECK-NEXT: [[TMP14:%.*]] = extractelement <2 x i64> [[WIDE_LOAD]], i64 1
|
|
; CHECK-NEXT: store i64 [[TMP14]], ptr [[TMP13]], align 1
|
|
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE2]]
|
|
; CHECK: [[PRED_STORE_CONTINUE2]]:
|
|
; CHECK-NEXT: br label %[[MIDDLE_BLOCK:.*]]
|
|
; CHECK: [[MIDDLE_BLOCK]]:
|
|
; CHECK-NEXT: br label %[[EXIT:.*]]
|
|
; CHECK: [[EXIT]]:
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
br label %loop.header
|
|
|
|
loop.header:
|
|
%iv = phi i16 [ 9, %entry ], [ %iv.next, %loop.latch ]
|
|
%off = load i16, ptr @src, align 1, !noundef !{}
|
|
%cmp1 = icmp eq i16 %iv, 10
|
|
br i1 %cmp1, label %if.then, label %loop.latch
|
|
|
|
if.then:
|
|
%sub = sub i16 1, %off
|
|
%add = add i16 %sub, %off
|
|
%add.iv = add i16 %iv, %add
|
|
%gep.src = getelementptr inbounds i64, ptr @src, i16 %add.iv
|
|
%l = load i64, ptr %gep.src, align 1
|
|
%gep.dst = getelementptr inbounds i64, ptr %dst, i16 %iv
|
|
store i64 %l, ptr %gep.dst, align 1
|
|
br label %loop.latch
|
|
|
|
loop.latch:
|
|
%iv.next = add i16 %iv, 1
|
|
%ec = icmp eq i16 %iv.next, 11
|
|
br i1 %ec, label %exit, label %loop.header
|
|
|
|
exit:
|
|
ret void
|
|
}
|