diff --git a/llvm/test/Transforms/InstSimplify/ptrmask.ll b/llvm/test/Transforms/InstSimplify/ptrmask.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/InstSimplify/ptrmask.ll @@ -0,0 +1,143 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 +; RUN: opt < %s -passes=instsimplify -S | FileCheck %s + +declare ptr @llvm.ptrmask.p0.i32(ptr, i32) +declare ptr @llvm.ptrmask.p0.i64(ptr, i64) + +define ptr @ptrmask_simplify_poison_mask(ptr %p) { +; CHECK-LABEL: define ptr @ptrmask_simplify_poison_mask +; CHECK-SAME: (ptr [[P:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 poison) +; CHECK-NEXT: ret ptr [[R]] +; + %r = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 poison) + ret ptr %r +} + +define ptr @ptrmask_simplify_undef_mask(ptr %p) { +; CHECK-LABEL: define ptr @ptrmask_simplify_undef_mask +; CHECK-SAME: (ptr [[P:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i32(ptr [[P]], i32 undef) +; CHECK-NEXT: ret ptr [[R]] +; + %r = call ptr @llvm.ptrmask.p0.i32(ptr %p, i32 undef) + ret ptr %r +} + +define ptr @ptrmask_simplify_0_mask(ptr %p) { +; CHECK-LABEL: define ptr @ptrmask_simplify_0_mask +; CHECK-SAME: (ptr [[P:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 0) +; CHECK-NEXT: ret ptr [[R]] +; + %r = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 0) + ret ptr %r +} + +define ptr @ptrmask_simplify_1s_mask(ptr %p) { +; CHECK-LABEL: define ptr @ptrmask_simplify_1s_mask +; CHECK-SAME: (ptr [[P:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 -1) +; CHECK-NEXT: ret ptr [[R]] +; + %r = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 -1) + ret ptr %r +} + +define ptr @ptrmask_simplify_1s_mask_i32_fail(ptr %p) { +; CHECK-LABEL: define ptr @ptrmask_simplify_1s_mask_i32_fail +; CHECK-SAME: (ptr [[P:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i32(ptr [[P]], i32 -1) +; CHECK-NEXT: ret ptr [[R]] +; + %r = call ptr @llvm.ptrmask.p0.i32(ptr %p, i32 -1) + ret ptr %r +} + +define ptr @ptrmask_simplify_poison_ptr(i64 %m) { +; CHECK-LABEL: define ptr @ptrmask_simplify_poison_ptr +; CHECK-SAME: (i64 [[M:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr poison, i64 [[M]]) +; CHECK-NEXT: ret ptr [[R]] +; + %r = call ptr @llvm.ptrmask.p0.i64(ptr poison, i64 %m) + ret ptr %r +} + +define ptr @ptrmask_simplify_undef_ptr(i32 %m) { +; CHECK-LABEL: define ptr @ptrmask_simplify_undef_ptr +; CHECK-SAME: (i32 [[M:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i32(ptr undef, i32 [[M]]) +; CHECK-NEXT: ret ptr [[R]] +; + %r = call ptr @llvm.ptrmask.p0.i32(ptr undef, i32 %m) + ret ptr %r +} + +define ptr @ptrmask_simplify_null_ptr(i64 %m) { +; CHECK-LABEL: define ptr @ptrmask_simplify_null_ptr +; CHECK-SAME: (i64 [[M:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr null, i64 [[M]]) +; CHECK-NEXT: ret ptr [[R]] +; + %r = call ptr @llvm.ptrmask.p0.i64(ptr null, i64 %m) + ret ptr %r +} + +define ptr @ptrmask_simplify_ptrmask(ptr %p) { +; CHECK-LABEL: define ptr @ptrmask_simplify_ptrmask +; CHECK-SAME: (ptr [[P:%.*]]) { +; CHECK-NEXT: [[M:%.*]] = ptrtoint ptr [[P]] to i64 +; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 [[M]]) +; CHECK-NEXT: ret ptr [[R]] +; + %m = ptrtoint ptr %p to i64 + %r = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 %m) + ret ptr %r +} + +define ptr @ptrmask_simplify_ptrmask_i32_fail(ptr %p) { +; CHECK-LABEL: define ptr @ptrmask_simplify_ptrmask_i32_fail +; CHECK-SAME: (ptr [[P:%.*]]) { +; CHECK-NEXT: [[M:%.*]] = ptrtoint ptr [[P]] to i32 +; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i32(ptr [[P]], i32 [[M]]) +; CHECK-NEXT: ret ptr [[R]] +; + %m = ptrtoint ptr %p to i32 + %r = call ptr @llvm.ptrmask.p0.i32(ptr %p, i32 %m) + ret ptr %r +} + +define ptr @ptrmask_simplify_aligned_unused(ptr align 64 %p) { +; CHECK-LABEL: define ptr @ptrmask_simplify_aligned_unused +; CHECK-SAME: (ptr align 64 [[P:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 -64) +; CHECK-NEXT: ret ptr [[R]] +; + %r = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 -64) + ret ptr %r +} + +define ptr @ptrmask_simplify_aligned_unused_i32_fail(ptr align 64 %p) { +; CHECK-LABEL: define ptr @ptrmask_simplify_aligned_unused_i32_fail +; CHECK-SAME: (ptr align 64 [[P:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i32(ptr [[P]], i32 -64) +; CHECK-NEXT: ret ptr [[R]] +; + %r = call ptr @llvm.ptrmask.p0.i32(ptr %p, i32 -64) + ret ptr %r +} + +define ptr @ptrmask_simplify_known_unused(ptr %p) { +; CHECK-LABEL: define ptr @ptrmask_simplify_known_unused +; CHECK-SAME: (ptr [[P:%.*]]) { +; CHECK-NEXT: [[PM0:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 -64) +; CHECK-NEXT: [[PGEP:%.*]] = getelementptr i8, ptr [[PM0]], i64 32 +; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PGEP]], i64 -32) +; CHECK-NEXT: ret ptr [[R]] +; + %pm0 = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 -64) + %pgep = getelementptr i8, ptr %pm0, i64 32 + %r = call ptr @llvm.ptrmask.p0.i64(ptr %pgep, i64 -32) + ret ptr %r +}