Issue |
121890
|
Summary |
[InstCombine] Missing flag check when folding comparison of geps with the same base pointer
|
Labels |
miscompilation,
llvm:instcombine
|
Assignees |
dtcxzyw
|
Reporter |
dtcxzyw
|
Alive2: https://alive2.llvm.org/ce/z/P5XbMx
```
----------------------------------------
define i1 @src(ptr %ptr, i8 %idx1, i8 %idx2) {
#0:
%gep1 = gep ptr %ptr, 4 x i8 %idx1
%gep2 = gep ptr %ptr, 4 x i8 %idx2
%cmp = icmp eq ptr %gep1, %gep2, offsetonly
ret i1 %cmp
}
=>
define i1 @tgt(ptr %ptr, i8 %idx1, i8 %idx2) {
#0:
%cmp = icmp eq i8 %idx1, %idx2
ret i1 %cmp
}
Transformation doesn't verify!
ERROR: Value mismatch
Example:
ptr %ptr = null
i8 %idx1 = #x00 (0)
i8 %idx2 = #x40 (64)
Source:
ptr %gep1 = null
ptr %gep2 = null
i1 %cmp = #x1 (1)
SOURCE MEMORY STATE
===================
NON-LOCAL BLOCKS:
Block 0 > size: 0 align: 1 alloc type: 0 alive: false address: 0
Block 1 > size: 0 align: 1 alloc type: 0 alive: true address: 1
Target:
i1 %cmp = #x0 (0)
Source value: #x1 (1)
Target value: #x0 (0)
----------------------------------------
define i1 @src1(ptr %ptr, i8 %idx1, i8 %idx2) {
#0:
%gep1 = gep nuw ptr %ptr, 4 x i8 %idx1
%gep2 = gep nuw ptr %ptr, 4 x i8 %idx2
%cmp = icmp eq ptr %gep1, %gep2, offsetonly
ret i1 %cmp
}
=>
define i1 @tgt1(ptr %ptr, i8 %idx1, i8 %idx2) {
#0:
%cmp = icmp eq i8 %idx1, %idx2
ret i1 %cmp
}
Transformation seems to be correct!
----------------------------------------
define i1 @src2(ptr %ptr, i8 %idx1, i8 %idx2) {
#0:
%gep1 = gep nusw ptr %ptr, 4 x i8 %idx1
%gep2 = gep nusw ptr %ptr, 4 x i8 %idx2
%cmp = icmp eq ptr %gep1, %gep2, offsetonly
ret i1 %cmp
}
=>
define i1 @tgt2(ptr %ptr, i8 %idx1, i8 %idx2) {
#0:
%cmp = icmp eq i8 %idx1, %idx2
ret i1 %cmp
}
Transformation seems to be correct!
Summary:
2 correct transformations
1 incorrect transformations
0 failed-to-prove transformations
0 Alive2 errors
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs