| Issue |
169778
|
| Summary |
ptrtoaddr fold doesn't take gep overflow into account
|
| Labels |
miscompilation,
llvm:instcombine
|
| Assignees |
|
| Reporter |
nunoplopes
|
The gep below needs to be inbounds.
```llvm
; Transforms/InstSimplify/ptrtoaddr.ll
@g = global 1 bytes, align 1
define i64 @ptrtoaddr_sub_consts_offset() {
%__constexpr_1 = gep ptr @g, 1 x i64 42
%__constexpr_0 = ptrtoaddr ptr %__constexpr_1 to i64
%__constexpr_2 = ptrtoaddr ptr @g to i64
%sub = sub i64 %__constexpr_0, %__constexpr_2
ret i64 %sub
}
=>
@g = global 1 bytes, align 1
define i64 @ptrtoaddr_sub_consts_offset() {
ret i64 42
}
Transformation doesn't verify! (unsound)
ERROR: Value mismatch
Example:
Source:
ptr %__constexpr_1 = pointer(non-local, block_id=0, offset=42) / Address=#x1c
i64 %__constexpr_0 = #x000000000000001c (28)
i64 %__constexpr_2 = #x00000000000000f2 (242)
i64 %sub = #xffffffffffffff2a (18446744073709551402, -214)
SOURCE MEMORY STATE
===================
NON-LOCAL BLOCKS:
Block 0 > size: 1 align: 1 alloc type: 0 alive: true address: #xf2
Source value: #xffffffffffffff2a (18446744073709551402, -214)
Target value: #x000000000000002a (42)
```
cc @nikic
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs