diff --git a/llvm/test/Transforms/InstCombine/consecutive-ptrmask.ll b/llvm/test/Transforms/InstCombine/consecutive-ptrmask.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/consecutive-ptrmask.ll @@ -0,0 +1,67 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 +; RUN: opt < %s -passes=instcombine -S | FileCheck %s + +declare ptr @llvm.ptrmask.p0.i64(ptr, i64) +declare ptr @llvm.ptrmask.p0.i32(ptr, i32) +declare void @use.ptr(ptr) +define ptr @fold_2x(ptr %p, i64 %m0, i64 %m1) { +; CHECK-LABEL: define ptr @fold_2x +; CHECK-SAME: (ptr [[P:%.*]], i64 [[M0:%.*]], i64 [[M1:%.*]]) { +; CHECK-NEXT: [[P0:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 [[M0]]) +; CHECK-NEXT: [[P1:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P0]], i64 [[M1]]) +; CHECK-NEXT: ret ptr [[P1]] +; + %p0 = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 %m0) + %p1 = call ptr @llvm.ptrmask.p0.i64(ptr %p0, i64 %m1) + ret ptr %p1 +} + +define ptr @fold_2x_i32(ptr %p, i32 %m0, i32 %m1) { +; CHECK-LABEL: define ptr @fold_2x_i32 +; CHECK-SAME: (ptr [[P:%.*]], i32 [[M0:%.*]], i32 [[M1:%.*]]) { +; CHECK-NEXT: [[P0:%.*]] = call ptr @llvm.ptrmask.p0.i32(ptr [[P]], i32 [[M0]]) +; CHECK-NEXT: [[P1:%.*]] = call ptr @llvm.ptrmask.p0.i32(ptr [[P0]], i32 [[M1]]) +; CHECK-NEXT: ret ptr [[P1]] +; + %p0 = call ptr @llvm.ptrmask.p0.i32(ptr %p, i32 %m0) + %p1 = call ptr @llvm.ptrmask.p0.i32(ptr %p0, i32 %m1) + ret ptr %p1 +} + +define ptr @fold_2x_fail_multiuse(ptr %p, i64 %m0, i64 %m1) { +; CHECK-LABEL: define ptr @fold_2x_fail_multiuse +; CHECK-SAME: (ptr [[P:%.*]], i64 [[M0:%.*]], i64 [[M1:%.*]]) { +; CHECK-NEXT: [[P0:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 [[M0]]) +; CHECK-NEXT: call void @use.ptr(ptr [[P0]]) +; CHECK-NEXT: [[P1:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P0]], i64 [[M1]]) +; CHECK-NEXT: ret ptr [[P1]] +; + %p0 = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 %m0) + call void @use.ptr(ptr %p0) + %p1 = call ptr @llvm.ptrmask.p0.i64(ptr %p0, i64 %m1) + ret ptr %p1 +} + +define ptr @fold_2x_fail_type_mismatch(ptr %p, i32 %m0, i64 %m1) { +; CHECK-LABEL: define ptr @fold_2x_fail_type_mismatch +; CHECK-SAME: (ptr [[P:%.*]], i32 [[M0:%.*]], i64 [[M1:%.*]]) { +; CHECK-NEXT: [[P0:%.*]] = call ptr @llvm.ptrmask.p0.i32(ptr [[P]], i32 [[M0]]) +; CHECK-NEXT: [[P1:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P0]], i64 [[M1]]) +; CHECK-NEXT: ret ptr [[P1]] +; + %p0 = call ptr @llvm.ptrmask.p0.i32(ptr %p, i32 %m0) + %p1 = call ptr @llvm.ptrmask.p0.i64(ptr %p0, i64 %m1) + ret ptr %p1 +} + +define ptr @fold_2x_fail_type_mismatch2(ptr %p, i64 %m0, i32 %m1) { +; CHECK-LABEL: define ptr @fold_2x_fail_type_mismatch2 +; CHECK-SAME: (ptr [[P:%.*]], i64 [[M0:%.*]], i32 [[M1:%.*]]) { +; CHECK-NEXT: [[P0:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 [[M0]]) +; CHECK-NEXT: [[P1:%.*]] = call ptr @llvm.ptrmask.p0.i32(ptr [[P0]], i32 [[M1]]) +; CHECK-NEXT: ret ptr [[P1]] +; + %p0 = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 %m0) + %p1 = call ptr @llvm.ptrmask.p0.i32(ptr %p0, i32 %m1) + ret ptr %p1 +}