Skip to content

Commit 5a04400

Browse files
nikicaokblast
authored andcommitted
[IR] Do not combine ptrtoaddr and trunc
The ptrtoaddr result type is required to match the pointer address width. This means that, unlikely with ptrtoint, it's not legal to merge a ptrtoint and trunc. This previously resulted in an IR verifier failure.
1 parent 95ae181 commit 5a04400

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

llvm/lib/IR/Instructions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2878,7 +2878,7 @@ unsigned CastInst::isEliminableCastPair(Instruction::CastOps firstOp,
28782878
{ 99,99,99, 0, 0,99,99, 0, 0,99,99,99, 4, 0}, // FPTrunc |
28792879
{ 99,99,99, 2, 2,99,99, 8, 2,99,99,99, 4, 0}, // FPExt |
28802880
{ 1, 0, 0,99,99, 0, 0,99,99,99,99, 7, 3, 0}, // PtrToInt |
2881-
{ 1, 0, 0,99,99, 0, 0,99,99,99,99, 0, 3, 0}, // PtrToAddr |
2881+
{ 0, 0, 0,99,99, 0, 0,99,99,99,99, 0, 3, 0}, // PtrToAddr |
28822882
{ 99,99,99,99,99,99,99,99,99,11,11,99,15, 0}, // IntToPtr |
28832883
{ 5, 5, 5, 0, 0, 5, 5, 0, 0,16,16, 5, 1,14}, // BitCast |
28842884
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,13,12}, // AddrSpaceCast -+
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
2+
; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3+
4+
; The ptrtoaddr folds are also valid for pointers that have external state.
5+
target datalayout = "pe1:64:64:64:32"
6+
7+
; ptrtoaddr result type is fixed, and can't be combined with integer cast.
8+
define i32 @ptrtoaddr_trunc(ptr %p) {
9+
; CHECK-LABEL: define i32 @ptrtoaddr_trunc(
10+
; CHECK-SAME: ptr [[P:%.*]]) {
11+
; CHECK-NEXT: [[P_ADDR:%.*]] = ptrtoaddr ptr [[P]] to i64
12+
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[P_ADDR]] to i32
13+
; CHECK-NEXT: ret i32 [[TRUNC]]
14+
;
15+
%p.addr = ptrtoaddr ptr %p to i64
16+
%trunc = trunc i64 %p.addr to i32
17+
ret i32 %trunc
18+
}
19+
20+
define i128 @ptrtoaddr_zext(ptr %p) {
21+
; CHECK-LABEL: define i128 @ptrtoaddr_zext(
22+
; CHECK-SAME: ptr [[P:%.*]]) {
23+
; CHECK-NEXT: [[P_ADDR:%.*]] = ptrtoaddr ptr [[P]] to i64
24+
; CHECK-NEXT: [[EXT:%.*]] = zext i64 [[P_ADDR]] to i128
25+
; CHECK-NEXT: ret i128 [[EXT]]
26+
;
27+
%p.addr = ptrtoaddr ptr %p to i64
28+
%ext = zext i64 %p.addr to i128
29+
ret i128 %ext
30+
}
31+
32+
define i128 @ptrtoaddr_sext(ptr %p) {
33+
; CHECK-LABEL: define i128 @ptrtoaddr_sext(
34+
; CHECK-SAME: ptr [[P:%.*]]) {
35+
; CHECK-NEXT: [[P_ADDR:%.*]] = ptrtoaddr ptr [[P]] to i64
36+
; CHECK-NEXT: [[EXT:%.*]] = sext i64 [[P_ADDR]] to i128
37+
; CHECK-NEXT: ret i128 [[EXT]]
38+
;
39+
%p.addr = ptrtoaddr ptr %p to i64
40+
%ext = sext i64 %p.addr to i128
41+
ret i128 %ext
42+
}

0 commit comments

Comments
 (0)