[llvm] [VPlan] Fix miscompile after PR #142433. (PR #147398)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 8 04:24:25 PDT 2025
================
@@ -0,0 +1,126 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -passes=loop-vectorize -force-vector-width=4 -S %s | FileCheck %s
+
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-linux-gnu"
+
+define i64 @test(ptr %arg2, i64 %dim) #0 {
+; CHECK-LABEL: define i64 @test(
+; CHECK-SAME: ptr [[ARG2:%.*]], i64 [[DIM:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: [[START:.*]]:
+; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
+; CHECK: [[VECTOR_PH]]:
+; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
+; CHECK: [[VECTOR_BODY]]:
+; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE6:.*]] ]
+; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i8> [ <i8 0, i8 1, i8 2, i8 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_STORE_CONTINUE6]] ]
+; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0
+; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[INDEX]], 1
+; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[INDEX]], 2
+; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[INDEX]], 3
+; CHECK-NEXT: [[TMP4:%.*]] = icmp ule <4 x i8> [[VEC_IND]], splat (i8 1)
+; CHECK-NEXT: [[TMP5:%.*]] = select <4 x i1> [[TMP4]], <4 x i1> splat (i1 true), <4 x i1> zeroinitializer
+; CHECK-NEXT: [[TMP6:%.*]] = sub i64 [[TMP0]], 0
+; CHECK-NEXT: [[TMP7:%.*]] = sub i64 [[TMP1]], 0
+; CHECK-NEXT: [[TMP8:%.*]] = sub i64 [[TMP2]], 0
+; CHECK-NEXT: [[TMP9:%.*]] = sub i64 [[TMP3]], 0
+; CHECK-NEXT: [[TMP10:%.*]] = insertelement <4 x i64> poison, i64 [[TMP6]], i32 0
+; CHECK-NEXT: [[TMP11:%.*]] = insertelement <4 x i64> [[TMP10]], i64 [[TMP7]], i32 1
+; CHECK-NEXT: [[TMP12:%.*]] = insertelement <4 x i64> [[TMP11]], i64 [[TMP8]], i32 2
+; CHECK-NEXT: [[TMP13:%.*]] = insertelement <4 x i64> [[TMP12]], i64 [[TMP9]], i32 3
+; CHECK-NEXT: [[TMP14:%.*]] = trunc <4 x i64> [[TMP13]] to <4 x i32>
+; CHECK-NEXT: [[TMP15:%.*]] = icmp sgt <4 x i32> zeroinitializer, [[TMP14]]
+; CHECK-NEXT: [[TMP16:%.*]] = select <4 x i1> [[TMP15]], <4 x double> splat (double 1.000000e+00), <4 x double> zeroinitializer
+; CHECK-NEXT: [[TMP17:%.*]] = select <4 x i1> [[TMP4]], <4 x i1> zeroinitializer, <4 x i1> zeroinitializer
+; CHECK-NEXT: [[TMP18:%.*]] = or <4 x i1> [[TMP5]], [[TMP17]]
+; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP17]], <4 x double> zeroinitializer, <4 x double> [[TMP16]]
+; CHECK-NEXT: [[TMP19:%.*]] = extractelement <4 x i1> [[TMP18]], i32 0
+; CHECK-NEXT: br i1 [[TMP19]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
+; CHECK: [[PRED_STORE_IF]]:
+; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x double> [[PREDPHI]], i32 0
+; CHECK-NEXT: store double [[TMP20]], ptr null, align 8
+; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE]]
+; CHECK: [[PRED_STORE_CONTINUE]]:
+; CHECK-NEXT: [[TMP21:%.*]] = extractelement <4 x i1> [[TMP18]], i32 1
+; CHECK-NEXT: br i1 [[TMP21]], label %[[PRED_STORE_IF1:.*]], label %[[PRED_STORE_CONTINUE2:.*]]
+; CHECK: [[PRED_STORE_IF1]]:
+; CHECK-NEXT: [[TMP22:%.*]] = extractelement <4 x double> [[PREDPHI]], i32 1
+; CHECK-NEXT: store double [[TMP22]], ptr null, align 8
+; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE2]]
+; CHECK: [[PRED_STORE_CONTINUE2]]:
+; CHECK-NEXT: [[TMP23:%.*]] = extractelement <4 x i1> [[TMP18]], i32 2
+; CHECK-NEXT: br i1 [[TMP23]], label %[[PRED_STORE_IF3:.*]], label %[[PRED_STORE_CONTINUE4:.*]]
+; CHECK: [[PRED_STORE_IF3]]:
+; CHECK-NEXT: [[TMP24:%.*]] = extractelement <4 x double> [[PREDPHI]], i32 2
+; CHECK-NEXT: store double [[TMP24]], ptr null, align 8
+; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE4]]
+; CHECK: [[PRED_STORE_CONTINUE4]]:
+; CHECK-NEXT: [[TMP25:%.*]] = extractelement <4 x i1> [[TMP18]], i32 3
+; CHECK-NEXT: br i1 [[TMP25]], label %[[PRED_STORE_IF5:.*]], label %[[PRED_STORE_CONTINUE6]]
+; CHECK: [[PRED_STORE_IF5]]:
+; CHECK-NEXT: [[TMP26:%.*]] = extractelement <4 x double> [[PREDPHI]], i32 3
+; CHECK-NEXT: store double [[TMP26]], ptr null, align 8
+; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE6]]
+; CHECK: [[PRED_STORE_CONTINUE6]]:
+; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
+; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i8> [[VEC_IND]], splat (i8 4)
+; CHECK-NEXT: br i1 true, label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK: [[MIDDLE_BLOCK]]:
+; CHECK-NEXT: br label %[[LOOP_EXIT:.*]]
+; CHECK: [[SCALAR_PH]]:
+; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, %[[START]] ]
+; CHECK-NEXT: br label %[[LOOP_BODY:.*]]
+; CHECK: [[LOOP_BODY]]:
+; CHECK-NEXT: [[INVAR_021:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INVAR_INC11:%.*]], %[[AFTER:.*]] ]
+; CHECK-NEXT: br i1 false, label %[[AFTER]], label %[[CHECK_TRUE:.*]]
+; CHECK: [[LOOP_EXIT]]:
+; CHECK-NEXT: ret i64 0
+; CHECK: [[AFTER]]:
+; CHECK-NEXT: [[RET_VALUE_ADDR_0:%.*]] = phi double [ [[TMP32:%.*]], %[[CHECK_TRUE]] ], [ 0.000000e+00, %[[LOOP_BODY]] ]
+; CHECK-NEXT: store double [[RET_VALUE_ADDR_0]], ptr null, align 8
+; CHECK-NEXT: [[INVAR_INC11]] = add i64 [[INVAR_021]], 1
+; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[INVAR_021]], 1
+; CHECK-NEXT: br i1 [[EXITCOND]], label %[[LOOP_EXIT]], label %[[LOOP_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
+; CHECK: [[CHECK_TRUE]]:
+; CHECK-NEXT: [[TMP27:%.*]] = sub nsw i64 [[INVAR_021]], 0
+; CHECK-NEXT: [[TMP28:%.*]] = trunc i64 [[TMP27]] to i32
+; CHECK-NEXT: [[TMP29:%.*]] = icmp sgt i32 0, [[TMP28]]
+; CHECK-NEXT: [[TMP30:%.*]] = getelementptr [16 x [16 x double]], ptr [[ARG2]], i64 0, i64 [[DIM]], i64 [[TMP27]]
+; CHECK-NEXT: [[TMP31:%.*]] = load double, ptr [[TMP30]], align 8
+; CHECK-NEXT: [[TMP32]] = select i1 [[TMP29]], double 1.000000e+00, double 0.000000e+00
+; CHECK-NEXT: br label %[[AFTER]]
+;
+start:
+ br label %loop_body
+
+loop_body: ; preds = %after, %start
+ %invar.021 = phi i64 [ 0, %start ], [ %invar.inc11, %after ]
----------------
fhahn wrote:
```suggestion
%iv = phi i64 [ 0, %start ], [ %iv.next, %after ]
```
https://github.com/llvm/llvm-project/pull/147398
More information about the llvm-commits
mailing list