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
179 lines
8.2 KiB
LLVM
179 lines
8.2 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -aa-pipeline=basic-aa -passes=dse -S | FileCheck %s
|
|
target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
|
|
|
|
declare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i1) nounwind
|
|
declare void @llvm.memset.element.unordered.atomic.p0.i64(ptr nocapture, i8, i64, i32) nounwind
|
|
declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind
|
|
declare void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i32) nounwind
|
|
declare void @llvm.init.trampoline(ptr, ptr, ptr)
|
|
|
|
|
|
;; Overwrite of memset by memcpy.
|
|
define void @test17(ptr %P, ptr noalias %Q) nounwind ssp {
|
|
; CHECK-LABEL: @test17(
|
|
; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[P:%.*]], ptr [[Q:%.*]], i64 12, i1 false)
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
tail call void @llvm.memset.p0.i64(ptr %P, i8 42, i64 8, i1 false)
|
|
tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)
|
|
ret void
|
|
}
|
|
|
|
;; Overwrite of memset by memcpy.
|
|
define void @test17_atomic(ptr %P, ptr noalias %Q) nounwind ssp {
|
|
; CHECK-LABEL: @test17_atomic(
|
|
; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 [[P:%.*]], ptr align 1 [[Q:%.*]], i64 12, i32 1)
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 1 %P, i8 42, i64 8, i32 1)
|
|
tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i32 1)
|
|
ret void
|
|
}
|
|
|
|
;; Overwrite of memset by memcpy. Overwrite is stronger atomicity. We can
|
|
;; remove the memset.
|
|
define void @test17_atomic_weaker(ptr %P, ptr noalias %Q) nounwind ssp {
|
|
; CHECK-LABEL: @test17_atomic_weaker(
|
|
; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 [[P:%.*]], ptr align 1 [[Q:%.*]], i64 12, i32 1)
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
tail call void @llvm.memset.p0.i64(ptr align 1 %P, i8 42, i64 8, i1 false)
|
|
tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i32 1)
|
|
ret void
|
|
}
|
|
|
|
;; Overwrite of memset by memcpy. Overwrite is weaker atomicity. We can remove
|
|
;; the memset.
|
|
define void @test17_atomic_weaker_2(ptr %P, ptr noalias %Q) nounwind ssp {
|
|
; CHECK-LABEL: @test17_atomic_weaker_2(
|
|
; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[P:%.*]], ptr align 1 [[Q:%.*]], i64 12, i1 false)
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 1 %P, i8 42, i64 8, i32 1)
|
|
tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i1 false)
|
|
ret void
|
|
}
|
|
|
|
; Should not delete the volatile memset.
|
|
define void @test17v(ptr %P, ptr %Q) nounwind ssp {
|
|
; CHECK-LABEL: @test17v(
|
|
; CHECK-NEXT: tail call void @llvm.memset.p0.i64(ptr [[P:%.*]], i8 42, i64 8, i1 true)
|
|
; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[P]], ptr [[Q:%.*]], i64 12, i1 false)
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
tail call void @llvm.memset.p0.i64(ptr %P, i8 42, i64 8, i1 true)
|
|
tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)
|
|
ret void
|
|
}
|
|
|
|
; See PR11763 - LLVM allows memcpy's source and destination to be equal (but not
|
|
; inequal and overlapping).
|
|
define void @test18(ptr %P, ptr %Q, ptr %R) nounwind ssp {
|
|
; CHECK-LABEL: @test18(
|
|
; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[P:%.*]], ptr [[Q:%.*]], i64 12, i1 false)
|
|
; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[P]], ptr [[R:%.*]], i64 12, i1 false)
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)
|
|
tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %R, i64 12, i1 false)
|
|
ret void
|
|
}
|
|
|
|
define void @test18_atomic(ptr %P, ptr %Q, ptr %R) nounwind ssp {
|
|
; CHECK-LABEL: @test18_atomic(
|
|
; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 [[P:%.*]], ptr align 1 [[Q:%.*]], i64 12, i32 1)
|
|
; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 [[P]], ptr align 1 [[R:%.*]], i64 12, i32 1)
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i32 1)
|
|
tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %P, ptr align 1 %R, i64 12, i32 1)
|
|
ret void
|
|
}
|
|
|
|
define void @test_memset_memcpy_inline(ptr noalias %P, ptr noalias %Q) {
|
|
; CHECK-LABEL: @test_memset_memcpy_inline(
|
|
; CHECK-NEXT: tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 1 [[P:%.*]], ptr align 1 [[Q:%.*]], i64 12, i1 false)
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
tail call void @llvm.memset.p0.i64(ptr %P, i8 42, i64 8, i1 false)
|
|
tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 12, i1 false)
|
|
ret void
|
|
}
|
|
|
|
define void @test_store_memcpy_inline(ptr noalias %P, ptr noalias %Q) {
|
|
; CHECK-LABEL: @test_store_memcpy_inline(
|
|
; CHECK-NEXT: [[P_4:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 4
|
|
; CHECK-NEXT: store i8 4, ptr [[P_4]], align 1
|
|
; CHECK-NEXT: tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 1 [[P]], ptr align 1 [[Q:%.*]], i64 4, i1 false)
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
store i8 0, ptr %P
|
|
%P.1 = getelementptr i8, ptr %P, i64 1
|
|
store i8 1, ptr %P.1
|
|
%P.4 = getelementptr i8, ptr %P, i64 4
|
|
store i8 4, ptr %P.4
|
|
tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 1 %P, ptr align 1 %Q, i64 4, i1 false)
|
|
ret void
|
|
}
|
|
|
|
;; Overwrite of memset.pattern by memcpy.
|
|
define void @memset_pattern_overwrite(ptr %P, ptr noalias %Q) nounwind ssp {
|
|
; CHECK-LABEL: @memset_pattern_overwrite(
|
|
; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[P:%.*]], ptr [[Q:%.*]], i64 12, i1 false)
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
tail call void @llvm.experimental.memset.pattern.p0.i64(ptr %P, i8 42, i64 8, i1 false)
|
|
tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)
|
|
ret void
|
|
}
|
|
|
|
define void @memset_pattern_overwrite2(ptr %P, ptr noalias %Q) nounwind ssp {
|
|
; CHECK-LABEL: @memset_pattern_overwrite2(
|
|
; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[P:%.*]], ptr [[Q:%.*]], i64 12, i1 false)
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
tail call void @llvm.experimental.memset.pattern(ptr %P, i16 270, i64 4, i1 false)
|
|
tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)
|
|
ret void
|
|
}
|
|
|
|
define void @memset_pattern_value_noalias(ptr %P, ptr noalias %Q) nounwind ssp {
|
|
; CHECK-LABEL: @memset_pattern_value_noalias(
|
|
; CHECK-NEXT: tail call void @llvm.experimental.memset.pattern.p0.p0.i64(ptr [[Q:%.*]], ptr [[P:%.*]], i64 8, i1 false)
|
|
; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[P]], ptr [[Q]], i64 12, i1 false)
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
tail call void @llvm.memset.p0.i64(ptr %P, i8 42, i64 8, i1 false)
|
|
tail call void @llvm.experimental.memset.pattern.p0.i64(ptr %Q, ptr %P, i64 8, i1 false)
|
|
tail call void @llvm.memcpy.p0.p0.i64(ptr %P, ptr %Q, i64 12, i1 false)
|
|
ret void
|
|
}
|
|
|
|
define void @memset_pattern_value_noalias2(ptr %P) nounwind ssp {;
|
|
; CHECK-LABEL: @memset_pattern_value_noalias2(
|
|
; CHECK-NEXT: tail call void @llvm.experimental.memset.pattern.p0.p0.i64(ptr [[P:%.*]], ptr [[P]], i64 8, i1 false)
|
|
; CHECK-NEXT: tail call void @llvm.memset.p0.i64(ptr [[P]], i8 42, i64 200, i1 false)
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
tail call void @llvm.experimental.memset.pattern.p0.i64(ptr %P, ptr %P, i64 8, i1 false)
|
|
tail call void @llvm.memset.p0.i64(ptr %P, i8 42, i64 200, i1 false)
|
|
ret void
|
|
}
|
|
|
|
define void @memset_pattern_value_noalias3(ptr %P) nounwind ssp {
|
|
; CHECK-LABEL: @memset_pattern_value_noalias3(
|
|
; CHECK-NEXT: [[Q:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 8
|
|
; CHECK-NEXT: tail call void @llvm.experimental.memset.pattern.p0.p0.i64(ptr [[Q]], ptr [[P]], i64 8, i1 false)
|
|
; CHECK-NEXT: tail call void @llvm.memset.p0.i64(ptr [[Q]], i8 42, i64 200, i1 false)
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
%q = getelementptr i8, ptr %P, i32 8
|
|
tail call void @llvm.experimental.memset.pattern.p0.i64(ptr %q, ptr %P, i64 8, i1 false)
|
|
tail call void @llvm.memset.p0.i64(ptr %q, i8 42, i64 200, i1 false)
|
|
ret void
|
|
}
|
|
|
|
|
|
declare void @llvm.memcpy.inline.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64 immarg, i1 immarg)
|