[llvm] [X86][SimplifyCFG] Support hoisting load/store with conditional faulting (PR #96878)

Shengchen Kan via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 4 18:22:17 PDT 2024


KanRobert wrote:

> @KanRobert Can you file a separate PR to support conditional load/store of ptrs with +cf? Then I can share another miscompilation reproducer :)
> 
> ```
> @e = dso_local global ptr null, align 8
> @f = dso_local global ptr @e, align 8
> @g = dso_local global ptr @f, align 8
> @h = dso_local global ptr @g, align 8
> @d = dso_local global i8 0, align 1
> @.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1
> @c = dso_local global i64 0, align 8
> 
> ; Function Attrs: nounwind uwtable
> define dso_local void @i() #0 {
> entry:
>   %p = alloca i32, align 4
>   call void @llvm.lifetime.start.p0(i64 4, ptr %p) #3
>   store i8 0, ptr @d, align 1
>   br label %for.cond
> 
> for.cond:                                         ; preds = %for.inc, %entry
>   %0 = load i8, ptr @d, align 1
>   %conv = sext i8 %0 to i32
>   %cmp = icmp slt i32 %conv, 2
>   br i1 %cmp, label %for.body, label %for.end
> 
> for.body:                                         ; preds = %for.cond
>   %1 = load ptr, ptr @h, align 8
>   %2 = load ptr, ptr %1, align 8
>   %3 = load ptr, ptr %2, align 8
>   %4 = load ptr, ptr %3, align 8
>   %5 = load ptr, ptr @f, align 8
>   store ptr %4, ptr %5, align 8
>   %6 = load ptr, ptr @h, align 8
>   %7 = load ptr, ptr %6, align 8
>   %8 = load ptr, ptr %7, align 8
>   store ptr %4, ptr %8, align 8
>   br label %for.inc
> 
> for.inc:                                          ; preds = %for.body
>   %9 = load i8, ptr @d, align 1
>   %inc = add i8 %9, 1
>   store i8 %inc, ptr @d, align 1
>   br label %for.cond
> 
> for.end:                                          ; preds = %for.cond
>   store i32 0, ptr %p, align 4
>   br label %for.cond2
> 
> for.cond2:                                        ; preds = %for.body3, %for.end
>   %10 = load i32, ptr %p, align 4
>   %tobool = icmp ne i32 %10, 0
>   br i1 %tobool, label %for.body3, label %for.end4
> 
> for.body3:                                        ; preds = %for.cond2
>   br label %for.cond2
> 
> for.end4:                                         ; preds = %for.cond2
>   call void @llvm.lifetime.end.p0(i64 4, ptr %p)
>   ret void
> }
> 
> ; Function Attrs: nounwind uwtable
> define dso_local signext i32 @main() #0 {
> entry:
>   %retval = alloca i32, align 4
>   store i32 0, ptr %retval, align 4
>   call void @i()
>   %0 = load i64, ptr @c, align 8
>   %conv = trunc i64 %0 to i32
>   %call = call signext i32 (ptr, ...) @printf(ptr noundef @.str, i32 noundef signext %conv)
>   ret i32 0
> }
> 
> declare noundef signext i32 @printf(ptr nocapture noundef readonly, ...)
> ```

So you're working on exposing the potential issues for mask.load/store in other middle-end passes? And prefer the 3rd solution?

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


More information about the llvm-commits mailing list