Skip to content

Commit c5ac8de

Browse files
committed
[VPlan] Fix assert in store-user in narrowToSingleScalars
Follow up on c2d4c7c ([VPlan] Permit more users in narrowToSingleScalars) to fix an assert related to WidenStore users of the recipe being narrowed in narrowToSingleScalars.
1 parent a20c8ff commit c5ac8de

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,6 +1437,7 @@ static void narrowToSingleScalarRecipes(VPlan &Plan) {
14371437
// we checked the RepOrWidenR operand against
14381438
// vputils::isSingleScalar.
14391439
assert(RepOrWidenR == Store->getAddr() ||
1440+
RepOrWidenR == Store->getMask() ||
14401441
vputils::isSingleScalar(Store->getStoredValue()));
14411442
return true;
14421443
}

llvm/test/Transforms/LoopVectorize/X86/narrow-to-single-scalar.ll

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,33 @@
1-
; REQUIRES: asserts
2-
; RUN: not --crash opt -p loop-vectorize -mcpu=skylake -S %s
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
2+
; RUN: opt -p loop-vectorize -mcpu=skylake -S %s | FileCheck %s
33

44
target triple = "x86_64-unknown-linux-gnu"
55

66
@p = external global [3952 x i8], align 8
77
@q = external global [3952 x i8], align 8
88

99
define void @narrow_store_user_mask_operand(i32 %x) {
10+
; CHECK-LABEL: define void @narrow_store_user_mask_operand(
11+
; CHECK-SAME: i32 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
12+
; CHECK-NEXT: [[ENTRY:.*]]:
13+
; CHECK-NEXT: br label %[[LOOP_PH:.*]]
14+
; CHECK: [[LOOP_PH]]:
15+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_TAIL:.*]] ]
16+
; CHECK-NEXT: [[X_POS:%.*]] = icmp sgt i32 [[X]], 0
17+
; CHECK-NEXT: br i1 [[X_POS]], label %[[LOOP_BODY:.*]], label %[[LOOP_TAIL]]
18+
; CHECK: [[LOOP_BODY]]:
19+
; CHECK-NEXT: [[LD_P:%.*]] = load double, ptr @p, align 8
20+
; CHECK-NEXT: [[GEP_Q_IV:%.*]] = getelementptr double, ptr @q, i64 [[IV]]
21+
; CHECK-NEXT: [[GEP_Q_IV_8:%.*]] = getelementptr i8, ptr [[GEP_Q_IV]], i64 -8
22+
; CHECK-NEXT: store double [[LD_P]], ptr [[GEP_Q_IV_8]], align 8
23+
; CHECK-NEXT: br label %[[LOOP_TAIL]]
24+
; CHECK: [[LOOP_TAIL]]:
25+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
26+
; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV]], 1
27+
; CHECK-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP_PH]]
28+
; CHECK: [[EXIT]]:
29+
; CHECK-NEXT: ret void
30+
;
1031
entry:
1132
br label %loop.ph
1233

0 commit comments

Comments
 (0)