[llvm] [InstCombine] Convert load from LUT into a select (PR #98339)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 12 12:47:45 PDT 2024


dtcxzyw wrote:

> > Miscompilation with undef: [alive2.llvm.org/ce/z/JL6br](https://alive2.llvm.org/ce/z/JL6br)_
> > ```
> > @.str = constant [2 x i8] [i8 1, i8 undef], align 1
> > 
> > define i32 @src(i64 %x) {
> > entry:
> >   %arrayidx = getelementptr [2 x i8], ptr @.str, i64 0, i64 %x
> >   %0 = load i8, ptr %arrayidx, align 1
> >   %conv = zext i8 %0 to i32
> >   ret i32 %conv
> > }
> > 
> > define i32 @tgt(i64 %x) {
> > entry:
> >   %cond = icmp eq i64 %x, 0
> >   %conv = select i1 %cond, i32 1, i32 undef
> >   ret i32 %conv
> > }
> > ```
> 
> Hmm, I would expect this transform to generate
> 
> ```
> define i32 @tgt(i64 %x) {
> entry:
>   %cond = icmp eq i64 %x, 0
>   %conv = select i1 %cond, i8 1, i8 undef
>   %zext = zext i8 %conv to i32
>   ret i32 %zext
> }
> ```
> 
> which is valid (https://alive2.llvm.org/ce/z/ewQnvE).
> 
> Is there some existing bad transform (folding zext into select arms?) which caused that miscompile?

I am not willing to improve this fold for undef/poison as it is unlikely to have real-world usefulness.


https://github.com/llvm/llvm-project/pull/98339


More information about the llvm-commits mailing list