[llvm] [VPlan] Introduce cannotHoistOrSinkRecipe, fix miscompile (PR #162674)

Ramkumar Ramachandra via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 27 04:22:46 PDT 2025


================
@@ -425,3 +425,40 @@ loop:
 exit:
   ret void
 }
+
+define void @hoist_previous_value_and_operand_load(ptr %dst, i64 %mask) {
+; CHECK-LABEL: @hoist_previous_value_and_operand_load(
+; CHECK-NEXT:  bb:
+; CHECK-NEXT:    br label [[LOOP1:%.*]]
+; CHECK:       loop:
+; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ 1, [[BB:%.*]] ], [ [[ADD:%.*]], [[LOOP1]] ]
+; CHECK-NEXT:    [[FOR_1:%.*]] = phi i32 [ 1, [[BB]] ], [ [[TRUNC:%.*]], [[LOOP1]] ]
+; CHECK-NEXT:    [[FOR_2:%.*]] = phi i32 [ 0, [[BB]] ], [ [[OR:%.*]], [[LOOP1]] ]
+; CHECK-NEXT:    [[OR]] = or i32 [[FOR_1]], 3
+; CHECK-NEXT:    [[ADD]] = add i64 [[IV]], 1
+; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr [[DST:%.*]], i64 [[IV]]
+; CHECK-NEXT:    store i32 [[FOR_2]], ptr [[GEP]], align 4
+; CHECK-NEXT:    [[ICMP:%.*]] = icmp ult i64 [[IV]], 337
+; CHECK-NEXT:    [[TRUNC]] = load i32, ptr [[DST]], align 4
+; CHECK-NEXT:    br i1 [[ICMP]], label [[LOOP1]], label [[EXIT:%.*]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+bb:
+  br label %loop
+
+loop:
+  %iv = phi i64 [ 1, %bb ], [ %add, %loop ]
----------------
artagnon wrote:

I'm not able to replicate the result with a single FOR, so I think intertwined FORs are needed.

```llvm
define void @hoist_previous_value_and_operand_load(ptr %dst) {
; CHECK-LABEL: @hoist_previous_value_and_operand_load(
; CHECK-NEXT:  entry:
; CHECK-NEXT:    br label [[LOOP:%.*]]
; CHECK:       loop:
; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ 1, [[ENTRY:%.*]] ], [ [[ADD:%.*]], [[LOOP]] ]
; CHECK-NEXT:    [[FOR_1:%.*]] = phi i32 [ 1, [[ENTRY]] ], [ [[LOAD:%.*]], [[LOOP]] ]
; CHECK-NEXT:    [[ADD]] = add i64 [[IV]], 1
; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr [[DST:%.*]], i64 [[IV]]
; CHECK-NEXT:    store i32 [[FOR_1]], ptr [[GEP]], align 4
; CHECK-NEXT:    [[ICMP:%.*]] = icmp ult i64 [[IV]], 337
; CHECK-NEXT:    [[LOAD]] = load i32, ptr [[DST]], align 4
; CHECK-NEXT:    br i1 [[ICMP]], label [[LOOP]], label [[EXIT:%.*]]
; CHECK:       exit:
; CHECK-NEXT:    ret void
;
entry:
  br label %loop

loop:
  %iv = phi i64 [ 1, %entry ], [ %add, %loop ]
  %for.1 = phi i32 [ 1, %entry ], [ %load, %loop ]
  %add = add i64 %iv, 1
  %gep = getelementptr inbounds i32, ptr %dst, i64 %iv
  store i32 %for.1, ptr %gep
  %icmp = icmp ult i64 %iv, 337
  %load = load i32, ptr %dst
  br i1 %icmp, label %loop, label %exit

exit:
  ret void
}
```

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


More information about the llvm-commits mailing list