[llvm] cfef05e - [InstCombine] Add tests for (inttoptr (add (ptrtoint %Base), %Offset)).
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 21 07:43:12 PDT 2025
Author: Florian Hahn
Date: 2025-08-21T15:42:39+01:00
New Revision: cfef05e69cb84d51c619b63af8def70691a478e9
URL: https://github.com/llvm/llvm-project/commit/cfef05e69cb84d51c619b63af8def70691a478e9
DIFF: https://github.com/llvm/llvm-project/commit/cfef05e69cb84d51c619b63af8def70691a478e9.diff
LOG: [InstCombine] Add tests for (inttoptr (add (ptrtoint %Base), %Offset)).
Precommit tests for https://github.com/llvm/llvm-project/pull/153421.
Added:
Modified:
llvm/test/Transforms/InstCombine/fold-bin-operand.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/InstCombine/fold-bin-operand.ll b/llvm/test/Transforms/InstCombine/fold-bin-operand.ll
index f28262b2a77e0..45d09f41fb4c5 100644
--- a/llvm/test/Transforms/InstCombine/fold-bin-operand.ll
+++ b/llvm/test/Transforms/InstCombine/fold-bin-operand.ll
@@ -1,6 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
-target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
+target datalayout = "E-p:64:64:64-p1:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
define i1 @f(i1 %x) {
; CHECK-LABEL: @f(
@@ -30,6 +30,220 @@ define i32 @g(i32 %x) {
ret i32 %b
}
+define i1 @inttoptr_add_ptrtoint_used_by_single_icmp(ptr %src, ptr %p2) {
+; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_single_icmp(
+; CHECK-NEXT: [[I:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
+; CHECK-NEXT: [[A:%.*]] = add i64 [[I]], 10
+; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[A]] to ptr
+; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %i = ptrtoint ptr %src to i64
+ %a = add i64 %i, 10
+ %p = inttoptr i64 %a to ptr
+ %c = icmp eq ptr %p, %p2
+ ret i1 %c
+}
+
+define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_operands_swapped(ptr %src, ptr %p2) {
+; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_single_icmp_operands_swapped(
+; CHECK-NEXT: [[I:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
+; CHECK-NEXT: [[A:%.*]] = add i64 [[I]], 10
+; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[A]] to ptr
+; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %i = ptrtoint ptr %src to i64
+ %a = add i64 10, %i
+ %p = inttoptr i64 %a to ptr
+ %c = icmp eq ptr %p, %p2
+ ret i1 %c
+}
+
+define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_constant_offset(ptr %src, i64 %off, ptr %p2) {
+; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_single_icmp_constant_offset(
+; CHECK-NEXT: [[I:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
+; CHECK-NEXT: [[A:%.*]] = add i64 [[OFF:%.*]], [[I]]
+; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[A]] to ptr
+; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %i = ptrtoint ptr %src to i64
+ %a = add i64 %i, %off
+ %p = inttoptr i64 %a to ptr
+ %c = icmp eq ptr %p, %p2
+ ret i1 %c
+}
+
+define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_constant_offset_operands_swapped(ptr %src, i64 %off, ptr %p2) {
+; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_single_icmp_constant_offset_operands_swapped(
+; CHECK-NEXT: [[I:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
+; CHECK-NEXT: [[A:%.*]] = add i64 [[OFF:%.*]], [[I]]
+; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[A]] to ptr
+; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %i = ptrtoint ptr %src to i64
+ %a = add i64 %off, %i
+ %p = inttoptr i64 %a to ptr
+ %c = icmp eq ptr %p, %p2
+ ret i1 %c
+}
+
+define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_
diff erent_src_address_spaces(ptr addrspace(1) %src, ptr %p2) {
+; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_single_icmp_
diff erent_src_address_spaces(
+; CHECK-NEXT: [[I:%.*]] = ptrtoint ptr addrspace(1) [[SRC:%.*]] to i64
+; CHECK-NEXT: [[A:%.*]] = add i64 [[I]], 10
+; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[A]] to ptr
+; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %i = ptrtoint ptr addrspace(1) %src to i64
+ %a = add i64 %i, 10
+ %p = inttoptr i64 %a to ptr
+ %c = icmp eq ptr %p, %p2
+ ret i1 %c
+}
+
+define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_
diff erent_dst_address_spaces(ptr %src, ptr addrspace(1) %p2) {
+; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_single_icmp_
diff erent_dst_address_spaces(
+; CHECK-NEXT: [[I:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
+; CHECK-NEXT: [[A:%.*]] = add i64 [[I]], 10
+; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[A]] to ptr addrspace(1)
+; CHECK-NEXT: [[C:%.*]] = icmp eq ptr addrspace(1) [[P2:%.*]], [[P]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %i = ptrtoint ptr %src to i64
+ %a = add i64 %i, 10
+ %p = inttoptr i64 %a to ptr addrspace(1)
+ %c = icmp eq ptr addrspace(1) %p, %p2
+ ret i1 %c
+}
+
+define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_int_type_does_not_match_ptr_ty(ptr %src, ptr %p2) {
+; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_single_icmp_int_type_does_not_match_ptr_ty(
+; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
+; CHECK-NEXT: [[I:%.*]] = trunc i64 [[TMP1]] to i8
+; CHECK-NEXT: [[A:%.*]] = add i8 [[I]], 10
+; CHECK-NEXT: [[TMP2:%.*]] = zext i8 [[A]] to i64
+; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[TMP2]] to ptr
+; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %i = ptrtoint ptr %src to i8
+ %a = add i8 %i, 10
+ %p = inttoptr i8 %a to ptr
+ %c = icmp eq ptr %p, %p2
+ ret i1 %c
+}
+
+define i1 @multiple_inttoptr_add_ptrtoint_used_by_single_icmp(ptr %src) {
+; CHECK-LABEL: @multiple_inttoptr_add_ptrtoint_used_by_single_icmp(
+; CHECK-NEXT: ret i1 false
+;
+ %i = ptrtoint ptr %src to i64
+ %a = add i64 %i, 10
+ %p = inttoptr i64 %a to ptr
+ %a.2 = add i64 %i, 11
+ %p.2 = inttoptr i64 %a.2 to ptr
+ %c = icmp eq ptr %p, %p.2
+ ret i1 %c
+}
+
+define i1 @multiple_inttoptr_add_ptrtoint_used_by_single_icmp_non_constant_offset(ptr %src, i64 %off.1) {
+; CHECK-LABEL: @multiple_inttoptr_add_ptrtoint_used_by_single_icmp_non_constant_offset(
+; CHECK-NEXT: ret i1 false
+;
+ %i = ptrtoint ptr %src to i64
+ %a = add i64 %i, 10
+ %p = inttoptr i64 %a to ptr
+ %a.2 = add i64 %i, 11
+ %p.2 = inttoptr i64 %a.2 to ptr
+ %c = icmp eq ptr %p, %p.2
+ ret i1 %c
+}
+
+define i1 @multiple_inttoptr_add_ptrtoint_used_by_single_icmp_multiple_non_constant_offset(ptr %src, i64 %off.1, i64 %off.2) {
+; CHECK-LABEL: @multiple_inttoptr_add_ptrtoint_used_by_single_icmp_multiple_non_constant_offset(
+; CHECK-NEXT: [[C:%.*]] = icmp eq i64 [[OFF_1:%.*]], [[OFF_2:%.*]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %i = ptrtoint ptr %src to i64
+ %a = add i64 %i, %off.1
+ %p = inttoptr i64 %a to ptr
+ %a.2 = add i64 %i, %off.2
+ %p.2 = inttoptr i64 %a.2 to ptr
+ %c = icmp eq ptr %p, %p.2
+ ret i1 %c
+}
+
+define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_in_
diff erent_bb(i1 %bc, ptr %src, ptr %p2) {
+; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_single_icmp_in_
diff erent_bb(
+; CHECK-NEXT: br i1 [[BC:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
+; CHECK: then:
+; CHECK-NEXT: [[I:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
+; CHECK-NEXT: [[A:%.*]] = add i64 [[I]], 10
+; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[A]] to ptr
+; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
+; CHECK-NEXT: ret i1 [[C]]
+; CHECK: else:
+; CHECK-NEXT: ret i1 false
+;
+ %i = ptrtoint ptr %src to i64
+ %a = add i64 %i, 10
+ %p = inttoptr i64 %a to ptr
+ br i1 %bc, label %then, label %else
+
+then:
+ %c = icmp eq ptr %p, %p2
+ ret i1 %c
+
+else:
+ ret i1 false
+}
+
+define i1 @inttoptr_add_ptrtoint_used_by_multiple_icmps(ptr %src, ptr %p2, ptr %p3) {
+; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_multiple_icmps(
+; CHECK-NEXT: [[I:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
+; CHECK-NEXT: [[A:%.*]] = add i64 [[I]], 10
+; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[A]] to ptr
+; CHECK-NEXT: [[C_1:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
+; CHECK-NEXT: [[C_2:%.*]] = icmp eq ptr [[P3:%.*]], [[P]]
+; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[C_1]], [[C_2]]
+; CHECK-NEXT: ret i1 [[XOR]]
+;
+ %i = ptrtoint ptr %src to i64
+ %a = add i64 %i, 10
+ %p = inttoptr i64 %a to ptr
+ %c.1 = icmp eq ptr %p, %p2
+ %c.2 = icmp eq ptr %p, %p3
+ %xor = xor i1 %c.1, %c.2
+ ret i1 %xor
+}
+
+declare void @foo(ptr)
+
+define i1 @inttoptr_add_ptrtoint_used_by_multiple_icmps_and_other_user(ptr %src, ptr %p2, ptr %p3) {
+; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_multiple_icmps_and_other_user(
+; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
+; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], 10
+; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[TMP2]] to ptr
+; CHECK-NEXT: [[C_1:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
+; CHECK-NEXT: [[C_2:%.*]] = icmp eq ptr [[P3:%.*]], [[P]]
+; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[C_1]], [[C_2]]
+; CHECK-NEXT: call void @foo(ptr [[P]])
+; CHECK-NEXT: ret i1 [[XOR]]
+;
+ %i = ptrtoint ptr %src to i64
+ %a = add i64 %i, 10
+ %p = inttoptr i64 %a to ptr
+ %c.1 = icmp eq ptr %p, %p2
+ %c.2 = icmp eq ptr %p, %p3
+ %xor = xor i1 %c.1, %c.2
+ call void @foo(ptr %p)
+ ret i1 %xor
+}
+
define i32 @h(i1 %A, i32 %B) {
; CHECK-LABEL: @h(
; CHECK-NEXT: EntryBlock:
More information about the llvm-commits
mailing list