diff options
Diffstat (limited to 'llvm/test/Transforms/InstCombine/ptrtoaddr.ll')
| -rw-r--r-- | llvm/test/Transforms/InstCombine/ptrtoaddr.ll | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/ptrtoaddr.ll b/llvm/test/Transforms/InstCombine/ptrtoaddr.ll new file mode 100644 index 000000000000..410c43c807ed --- /dev/null +++ b/llvm/test/Transforms/InstCombine/ptrtoaddr.ll @@ -0,0 +1,42 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 +; RUN: opt -S -passes=instcombine < %s | FileCheck %s + +; The ptrtoaddr folds are also valid for pointers that have external state. +target datalayout = "pe1:64:64:64:32" + +; ptrtoaddr result type is fixed, and can't be combined with integer cast. +define i32 @ptrtoaddr_trunc(ptr %p) { +; CHECK-LABEL: define i32 @ptrtoaddr_trunc( +; CHECK-SAME: ptr [[P:%.*]]) { +; CHECK-NEXT: [[P_ADDR:%.*]] = ptrtoaddr ptr [[P]] to i64 +; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[P_ADDR]] to i32 +; CHECK-NEXT: ret i32 [[TRUNC]] +; + %p.addr = ptrtoaddr ptr %p to i64 + %trunc = trunc i64 %p.addr to i32 + ret i32 %trunc +} + +define i128 @ptrtoaddr_zext(ptr %p) { +; CHECK-LABEL: define i128 @ptrtoaddr_zext( +; CHECK-SAME: ptr [[P:%.*]]) { +; CHECK-NEXT: [[P_ADDR:%.*]] = ptrtoaddr ptr [[P]] to i64 +; CHECK-NEXT: [[EXT:%.*]] = zext i64 [[P_ADDR]] to i128 +; CHECK-NEXT: ret i128 [[EXT]] +; + %p.addr = ptrtoaddr ptr %p to i64 + %ext = zext i64 %p.addr to i128 + ret i128 %ext +} + +define i128 @ptrtoaddr_sext(ptr %p) { +; CHECK-LABEL: define i128 @ptrtoaddr_sext( +; CHECK-SAME: ptr [[P:%.*]]) { +; CHECK-NEXT: [[P_ADDR:%.*]] = ptrtoaddr ptr [[P]] to i64 +; CHECK-NEXT: [[EXT:%.*]] = sext i64 [[P_ADDR]] to i128 +; CHECK-NEXT: ret i128 [[EXT]] +; + %p.addr = ptrtoaddr ptr %p to i64 + %ext = sext i64 %p.addr to i128 + ret i128 %ext +} |
