Skip to content

Commit adb0126

Browse files
[VPlan] Add scalar inferencing support for Not and Or insns (#89160)
Fixes #87394. PR: #89160
1 parent d5022d9 commit adb0126

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

llvm/lib/Transforms/Vectorize/VPlanAnalysis.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ Type *VPTypeAnalysis::inferScalarTypeForRecipe(const VPInstruction *R) {
3535
CachedTypes[OtherV] = ResTy;
3636
return ResTy;
3737
}
38+
case Instruction::Or:
3839
case Instruction::ICmp:
3940
case VPInstruction::FirstOrderRecurrenceSplice: {
4041
Type *ResTy = inferScalarType(R->getOperand(0));
@@ -44,6 +45,12 @@ Type *VPTypeAnalysis::inferScalarTypeForRecipe(const VPInstruction *R) {
4445
CachedTypes[OtherV] = ResTy;
4546
return ResTy;
4647
}
48+
case VPInstruction::Not: {
49+
Type *ResTy = inferScalarType(R->getOperand(0));
50+
assert(IntegerType::get(Ctx, 1) == ResTy &&
51+
"unexpected scalar type inferred for operand");
52+
return ResTy;
53+
}
4754
case VPInstruction::PtrAdd:
4855
// Return the type based on the pointer argument (i.e. first operand).
4956
return inferScalarType(R->getOperand(0));
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt < %s -passes=loop-vectorize -S | FileCheck %s
3+
4+
; This test used to crash due to missing Or/Not cases in
5+
; inferScalarTypeForRecipe.
6+
7+
define void @foo(i8 %arg.0, i8 %arg.1) {
8+
; CHECK-LABEL: define void @foo(
9+
; CHECK-SAME: i8 [[ARG_0:%.*]], i8 [[ARG_1:%.*]]) {
10+
; CHECK-NEXT: entry:
11+
; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
12+
; CHECK: vector.ph:
13+
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
14+
; CHECK: vector.body:
15+
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
16+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
17+
; CHECK-NEXT: br i1 true, label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
18+
; CHECK: middle.block:
19+
; CHECK-NEXT: br i1 true, label [[LOOPEXIT:%.*]], label [[SCALAR_PH]]
20+
; CHECK: scalar.ph:
21+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ 2, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
22+
; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
23+
; CHECK: loop.header:
24+
; CHECK-NEXT: [[INCREMENTOR:%.*]] = phi i8 [ [[ADD:%.*]], [[LATCH:%.*]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
25+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[ARG_0]], [[ARG_1]]
26+
; CHECK-NEXT: [[EXTRACT_T:%.*]] = trunc i8 [[AND]] to i1
27+
; CHECK-NEXT: br i1 [[EXTRACT_T]], label [[LATCH]], label [[INDIRECT_LATCH:%.*]]
28+
; CHECK: indirect.latch:
29+
; CHECK-NEXT: br label [[LATCH]]
30+
; CHECK: latch:
31+
; CHECK-NEXT: [[ADD]] = add i8 [[INCREMENTOR]], 1
32+
; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[INCREMENTOR]] to i32
33+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[CONV]], 1
34+
; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_HEADER]], label [[LOOPEXIT]], !llvm.loop [[LOOP3:![0-9]+]]
35+
; CHECK: loop.exit:
36+
; CHECK-NEXT: ret void
37+
;
38+
entry:
39+
br label %loop.header
40+
41+
loop.header: ; preds = %latch, %entry
42+
%incrementor = phi i8 [ %add, %latch ], [ 0, %entry ]
43+
%and = and i8 %arg.0, %arg.1
44+
%extract.t = trunc i8 %and to i1
45+
br i1 %extract.t, label %latch, label %indirect.latch
46+
47+
indirect.latch: ; preds = %loop.header
48+
br label %latch
49+
50+
latch: ; preds = %loop.header16, %loop.header
51+
%add = add i8 %incrementor, 1
52+
%conv = zext i8 %incrementor to i32
53+
%cmp = icmp ult i32 %conv, 1
54+
br i1 %cmp, label %loop.header, label %loop.exit
55+
56+
loop.exit:
57+
ret void
58+
}
59+
;.
60+
; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
61+
; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
62+
; CHECK: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}
63+
; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[META2]], [[META1]]}
64+
;.

0 commit comments

Comments
 (0)