[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