| Issue |
124461
|
| Summary |
[InstCombine] Unsound integer-to-pointer coercion
|
| Labels |
new issue
|
| Assignees |
|
| Reporter |
pedroclobo
|
If a pointer is stored in memory, `%v3` returns `poison`, while `%v4` returns the pointer value in the original program.
Introducing the cast in the target program is unsound as `%v3` is `poison` and `%v4` becomes `poison`.
Alive2: [https://alive2.llvm.org/ce/z/FW5zqi](https://alive2.llvm.org/ce/z/FW5zqi)
```llvm
declare void @use(...) nofree memory(read)
@use = constant ? bytes, exec, align 8
define ptr @f5(ptr %p, i1 %cond) {
#0:
br i1 %cond, label %bb1, label %bb2
bb2:
%v2 = load ptr, ptr %p, align 8
call void @use(...ptr %v2) nofree memory(read)
br label %merge
bb1:
%v1 = load i64, ptr %p, align 4
call void @use(...i64 %v1) nofree memory(read)
br label %merge
merge:
%v3 = load i64, ptr %p, align 4
call void @use(...i64 %v3) nofree memory(read)
%v4 = load ptr, ptr %p, align 8
ret ptr %v4
}
=>
declare void @use(...) nofree memory(read)
@use = constant ? bytes, exec, align 8
define ptr @f5(ptr %p, i1 %cond) {
#0:
br i1 %cond, label %bb1, label %bb2
bb2:
%v2 = load ptr, ptr %p, align 8
call void @use(...ptr %v2) nofree memory(read)
br label %merge
bb1:
%v1 = load i64, ptr %p, align 4
call void @use(...i64 %v1) nofree memory(read)
br label %merge
merge:
%v3 = load i64, ptr %p, align 4
call void @use(...i64 %v3) nofree memory(read)
%v4.cast = int2ptr i64 %v3 to ptr
ret ptr %v4.cast
}
Transformation doesn't verify!
ERROR: Target is more poisonous than source
Example:
ptr %p = pointer(non-local, block_id=1, offset=0) / Address=#x0000000000000008
i1 %cond = #x1 (1)
Source:
>> Jump to %bb1
i64 %v1 = poison
Function returned
>> Jump to %merge
i64 %v3 = poison
Function returned
ptr %v4 = pointer(non-local, block_id=4, offset=0) / Address=#x0000000000000001
SOURCE MEMORY STATE
===================
NON-LOCAL BLOCKS:
Block 0 > size: 0 align: 4 alloc type: 0 alive: false address: 0
Block 1 > size: 11 align: 8 alloc type: 0 alive: true address: 8 const
Contents:
1: pointer(non-local, block_id=4, offset=0), byte offset=1
*: pointer(non-local, block_id=4, offset=0), byte offset=0
Block 2 > size: 0 align: 8 alloc type: 0 alive: true address: 8
Contents:
1: pointer(non-local, block_id=4, offset=0), byte offset=1
*: pointer(non-local, block_id=4, offset=0), byte offset=0
Block 3 > size: 0 align: 8 alloc type: 0 alive: true address: 8
Contents:
1: pointer(non-local, block_id=4, offset=0), byte offset=1
*: pointer(non-local, block_id=4, offset=0), byte offset=0
Block 4 > size: 0 align: 1 alloc type: 0 alive: true address: 1
Contents:
1: pointer(non-local, block_id=4, offset=0), byte offset=1
*: pointer(non-local, block_id=4, offset=0), byte offset=0
Block 5 > size: 0 align: 8 alloc type: 0 alive: true address: 8
Contents:
1: pointer(non-local, block_id=4, offset=0), byte offset=1
*: pointer(non-local, block_id=4, offset=0), byte offset=0
Block 6 > size: 0 align: 2 alloc type: 0 alive: true address: 2
Contents:
1: pointer(non-local, block_id=4, offset=0), byte offset=1
*: pointer(non-local, block_id=4, offset=0), byte offset=0
Target:
>> Jump to %bb1
i64 %v1 = poison
Function returned
>> Jump to %merge
i64 %v3 = poison
Function returned
ptr %v4.cast = poison
Source value: pointer(non-local, block_id=4, offset=0) / Address=#x0000000000000001
Target value: poison
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs