From f29381cd87b7b31185ecddd2bf92036ebce9088c Mon Sep 17 00:00:00 2001 From: Krishna Kariya Date: Tue, 13 Jul 2021 20:33:30 +0200 Subject: [PATCH] [InstCombine] Precommit tests for D105088 (NFC) Add tests for D105088, as well as an option to disable the (generally) unsound inttoptr of ptrtoint optimization. Differential Revision: https://reviews.llvm.org/D105771 --- lib/IR/Instructions.cpp | 8 ++ .../InstCombine/ptr-int-ptr-icmp.ll | 97 +++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 test/Transforms/InstCombine/ptr-int-ptr-icmp.ll diff --git a/lib/IR/Instructions.cpp b/lib/IR/Instructions.cpp index 68df26932a6..5b01c70dec8 100644 --- a/lib/IR/Instructions.cpp +++ b/lib/IR/Instructions.cpp @@ -45,6 +45,10 @@ using namespace llvm; +static cl::opt DisableI2pP2iOpt( + "disable-i2p-p2i-opt", cl::init(false), + cl::desc("Disables inttoptr/ptrtoint roundtrip optimization")); + //===----------------------------------------------------------------------===// // AllocaInst Class //===----------------------------------------------------------------------===// @@ -2845,6 +2849,10 @@ unsigned CastInst::isEliminableCastPair( return secondOp; return 0; case 7: { + // Disable inttoptr/ptrtoint optimization if enabled. + if (DisableI2pP2iOpt) + return 0; + // Cannot simplify if address spaces are different! if (SrcTy->getPointerAddressSpace() != DstTy->getPointerAddressSpace()) return 0; diff --git a/test/Transforms/InstCombine/ptr-int-ptr-icmp.ll b/test/Transforms/InstCombine/ptr-int-ptr-icmp.ll new file mode 100644 index 00000000000..9784f187308 --- /dev/null +++ b/test/Transforms/InstCombine/ptr-int-ptr-icmp.ll @@ -0,0 +1,97 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -instcombine -S -disable-i2p-p2i-opt < %s | FileCheck %s + +target datalayout = "e-p:64:64-p1:16:16-p2:32:32:32-p3:64:64:64" +target triple = "x86_64-unknown-linux-gnu" + +; icmp (inttoptr (ptrtoint p1)), p2 --> icmp p1, p2. + +define i1 @func(i8* %X, i8* %Y) { +; CHECK-LABEL: @func( +; CHECK-NEXT: [[I:%.*]] = ptrtoint i8* [[X:%.*]] to i64 +; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[I]] to i8* +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8* [[P]], [[Y:%.*]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %i = ptrtoint i8* %X to i64 + %p = inttoptr i64 %i to i8* + %cmp = icmp eq i8* %p, %Y + ret i1 %cmp +} + +define i1 @func_pointer_different_types(i16* %X, i8* %Y) { +; CHECK-LABEL: @func_pointer_different_types( +; CHECK-NEXT: [[I:%.*]] = ptrtoint i16* [[X:%.*]] to i64 +; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[I]] to i8* +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8* [[P]], [[Y:%.*]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %i = ptrtoint i16* %X to i64 + %p = inttoptr i64 %i to i8* + %cmp = icmp eq i8* %p, %Y + ret i1 %cmp +} + +declare i8* @gen8ptr() + +define i1 @func_commutative(i16* %X) { +; CHECK-LABEL: @func_commutative( +; CHECK-NEXT: [[Y:%.*]] = call i8* @gen8ptr() +; CHECK-NEXT: [[I:%.*]] = ptrtoint i16* [[X:%.*]] to i64 +; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[I]] to i8* +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8* [[Y]], [[P]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %Y = call i8* @gen8ptr() ; thwart complexity-based canonicalization + %i = ptrtoint i16* %X to i64 + %p = inttoptr i64 %i to i8* + %cmp = icmp eq i8* %Y, %p + ret i1 %cmp +} + +; Negative test - Wrong Integer type. + +define i1 @func_integer_type_too_small(i16* %X, i8* %Y) { +; CHECK-LABEL: @func_integer_type_too_small( +; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint i16* [[X:%.*]] to i64 +; CHECK-NEXT: [[TMP2:%.*]] = and i64 [[TMP1]], 4294967295 +; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[TMP2]] to i8* +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8* [[P]], [[Y:%.*]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %i = ptrtoint i16* %X to i32 + %p = inttoptr i32 %i to i8* + %cmp = icmp eq i8* %Y, %p + ret i1 %cmp +} + +; Negative test - Pointers in different address space + +define i1 @func_ptr_different_addrspace(i8* %X, i16 addrspace(3)* %Y){ +; CHECK-LABEL: @func_ptr_different_addrspace( +; CHECK-NEXT: [[I:%.*]] = ptrtoint i8* [[X:%.*]] to i64 +; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[I]] to i16 addrspace(3)* +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 addrspace(3)* [[P]], [[Y:%.*]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %i = ptrtoint i8* %X to i64 + %p = inttoptr i64 %i to i16 addrspace(3)* + %cmp = icmp eq i16 addrspace(3)* %Y, %p + ret i1 %cmp +} + +; Negative test - Pointers in different address space + +define i1 @func_ptr_different_addrspace1(i8 addrspace(2)* %X, i16* %Y){ +; CHECK-LABEL: @func_ptr_different_addrspace1( +; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint i8 addrspace(2)* [[X:%.*]] to i32 +; CHECK-NEXT: [[I:%.*]] = zext i32 [[TMP1]] to i64 +; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[I]] to i16* +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16* [[P]], [[Y:%.*]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %i = ptrtoint i8 addrspace(2)* %X to i64 + %p = inttoptr i64 %i to i16* + %cmp = icmp eq i16* %Y, %p + ret i1 %cmp +}