Skip to content

Commit 607a813

Browse files
committed
[ConstFold] Don't crash on ConstantExprs when folding get_active_lane_m.
Check if operands are ConstantInt to avoid crashing on constant expression after #156659.
1 parent d2f67c3 commit 607a813

File tree

2 files changed

+40
-3
lines changed

2 files changed

+40
-3
lines changed

llvm/lib/Analysis/ConstantFolding.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4253,9 +4253,9 @@ static Constant *ConstantFoldScalableVectorCall(
42534253
return ConstantInt::getFalse(SVTy);
42544254
}
42554255
case Intrinsic::get_active_lane_mask: {
4256-
auto Op0 = cast<ConstantInt>(Operands[0])->getValue();
4257-
auto Op1 = cast<ConstantInt>(Operands[1])->getValue();
4258-
if (Op0.uge(Op1))
4256+
auto *Op0 = dyn_cast<ConstantInt>(Operands[0]);
4257+
auto *Op1 = dyn_cast<ConstantInt>(Operands[1]);
4258+
if (Op0 && Op1 && Op0->getValue().uge(Op1->getValue()))
42594259
return ConstantVector::getNullValue(SVTy);
42604260
break;
42614261
}

llvm/test/Transforms/InstSimplify/ConstProp/active-lane-mask.ll

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
55

6+
@glob = external global i32
7+
68
define <16 x i1> @v16i1_0() {
79
; CHECK-LABEL: @v16i1_0(
810
; CHECK-NEXT: entry:
@@ -337,6 +339,41 @@ entry:
337339
ret <vscale x 16 x i1> %mask
338340
}
339341

342+
343+
define <vscale x 16 x i1> @nxv16i1_0_constexpr() {
344+
; CHECK-LABEL: @nxv16i1_0_constexpr(
345+
; CHECK-NEXT: entry:
346+
; CHECK-NEXT: [[MASK:%.*]] = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 0, i64 ptrtoint (ptr @glob to i64))
347+
; CHECK-NEXT: ret <vscale x 16 x i1> [[MASK]]
348+
;
349+
entry:
350+
%mask = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 0, i64 ptrtoint (ptr @glob to i64))
351+
ret <vscale x 16 x i1> %mask
352+
}
353+
354+
define <vscale x 16 x i1> @nxv16i1_constexpr_0() {
355+
; CHECK-LABEL: @nxv16i1_constexpr_0(
356+
; CHECK-NEXT: entry:
357+
; CHECK-NEXT: [[MASK:%.*]] = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 ptrtoint (ptr @glob to i64), i64 0)
358+
; CHECK-NEXT: ret <vscale x 16 x i1> [[MASK]]
359+
;
360+
entry:
361+
%mask = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 ptrtoint (ptr @glob to i64), i64 0)
362+
ret <vscale x 16 x i1> %mask
363+
}
364+
365+
define <vscale x 16 x i1> @nxv16i1_constexpr_constexpr() {
366+
; CHECK-LABEL: @nxv16i1_constexpr_constexpr(
367+
; CHECK-NEXT: entry:
368+
; CHECK-NEXT: [[MASK:%.*]] = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 ptrtoint (ptr @glob to i64), i64 ptrtoint (ptr getelementptr inbounds nuw (i8, ptr @glob, i64 2) to i64))
369+
; CHECK-NEXT: ret <vscale x 16 x i1> [[MASK]]
370+
;
371+
entry:
372+
%mask = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 ptrtoint (ptr @glob to i64), i64 ptrtoint (ptr getelementptr inbounds nuw (i8, ptr @glob, i64 2) to i64))
373+
ret <vscale x 16 x i1> %mask
374+
}
375+
376+
340377
declare <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32, i32)
341378
declare <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32, i32)
342379
declare <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32, i32)

0 commit comments

Comments
 (0)