summaryrefslogtreecommitdiff
path: root/llvm/test/Transforms/InstCombine/ptrtoaddr.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/Transforms/InstCombine/ptrtoaddr.ll')
-rw-r--r--llvm/test/Transforms/InstCombine/ptrtoaddr.ll42
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
+}