[llvm] [ConstraintElim] Simplify cmp after uadd.sat/usub.sat (PR #135603)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 17 18:47:39 PDT 2025
el-ev wrote:
> I believe this is causing a miscompile:
>
> ```
> $ cat /tmp/a.ll
> define i1 @f(i64 %conv6, i64 %str.coerce, ptr %conv) {
> %a = load i32, ptr %conv, align 4
> %cmp = icmp sgt i32 %a, -1
> %conv2 = zext nneg i32 %a to i64
> %add = add i64 %str.coerce, %conv6
> %spec.select = call i64 @llvm.usub.sat.i64(i64 %conv2, i64 %add)
> ret i1 %cmp
> }
>
> declare i64 @llvm.usub.sat.i64(i64, i64)
>
> $ opt -p constraint-elimination -S /tmp/a.ll
> define i1 @f(i64 %conv6, i64 %str.coerce, ptr %conv) {
> %a = load i32, ptr %conv, align 4
> %conv2 = zext nneg i32 %a to i64
> %add = add i64 %str.coerce, %conv6
> %spec.select = call i64 @llvm.usub.sat.i64(i64 %conv2, i64 %add)
> ret i1 true
> }
>
> ; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
> declare i64 @llvm.usub.sat.i64(i64, i64) #0
> ```
The `nneg` flag on `zext` is providing some assumption that `%a >=0` holds true
https://github.com/llvm/llvm-project/pull/135603
More information about the llvm-commits
mailing list