Skip to content

Commit bdf241c

Browse files
authored
ValueTracking: handle more ops in isNotCrossLaneOperation (#112183)
Reuse llvm::isTriviallyVectorizable in llvm::isNotCrossLaneOperation, in order to get it to handle more intrinsics. Alive2 proofs for changed tests: https://alive2.llvm.org/ce/z/XSV_GT
1 parent 429387a commit bdf241c

File tree

3 files changed

+10
-34
lines changed

3 files changed

+10
-34
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6948,25 +6948,8 @@ bool llvm::onlyUsedByLifetimeMarkersOrDroppableInsts(const Value *V) {
69486948
}
69496949

69506950
bool llvm::isNotCrossLaneOperation(const Instruction *I) {
6951-
if (auto *II = dyn_cast<IntrinsicInst>(I)) {
6952-
switch (II->getIntrinsicID()) {
6953-
// TODO: expand this list.
6954-
case Intrinsic::ctlz:
6955-
case Intrinsic::cttz:
6956-
case Intrinsic::ctpop:
6957-
case Intrinsic::umin:
6958-
case Intrinsic::umax:
6959-
case Intrinsic::smin:
6960-
case Intrinsic::smax:
6961-
case Intrinsic::usub_sat:
6962-
case Intrinsic::uadd_sat:
6963-
case Intrinsic::ssub_sat:
6964-
case Intrinsic::sadd_sat:
6965-
return true;
6966-
default:
6967-
return false;
6968-
}
6969-
}
6951+
if (auto *II = dyn_cast<IntrinsicInst>(I))
6952+
return isTriviallyVectorizable(II->getIntrinsicID());
69706953
return !isa<CallBase, BitCastInst, ShuffleVectorInst, ExtractElementInst>(I);
69716954
}
69726955

llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -998,8 +998,8 @@ define nofpclass(nan inf) float @pow_f32(float nofpclass(nan inf) %arg, float no
998998
; CHECK-NEXT: [[I12:%.*]] = select i1 [[I11]], float [[ARG]], float 1.000000e+00
999999
; CHECK-NEXT: [[I13:%.*]] = tail call noundef float @llvm.copysign.f32(float noundef [[I4]], float noundef [[I12]])
10001000
; CHECK-NEXT: [[I17:%.*]] = fcmp oeq float [[ARG]], 0.000000e+00
1001-
; CHECK-NEXT: [[I21:%.*]] = select i1 [[I11]], float [[ARG]], float 0.000000e+00
1002-
; CHECK-NEXT: [[I22:%.*]] = tail call noundef nofpclass(nan sub norm) float @llvm.copysign.f32(float noundef 0.000000e+00, float noundef [[I21]])
1001+
; CHECK-NEXT: [[TMP0:%.*]] = tail call nofpclass(nan sub norm) float @llvm.copysign.f32(float 0.000000e+00, float [[ARG]])
1002+
; CHECK-NEXT: [[I22:%.*]] = select i1 [[I11]], float [[TMP0]], float 0.000000e+00
10031003
; CHECK-NEXT: [[I23:%.*]] = select i1 [[I17]], float [[I22]], float [[I13]]
10041004
; CHECK-NEXT: [[I24:%.*]] = fcmp oeq float [[ARG]], 1.000000e+00
10051005
; CHECK-NEXT: [[I25:%.*]] = fcmp oeq float [[ARG1]], 0.000000e+00

llvm/test/Transforms/InstSimplify/select-abs.ll

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -232,14 +232,11 @@ entry:
232232
ret i64 %res
233233
}
234234

235-
; TODO: Handle vector cases?
236235
define <4 x i16> @select_v4i16_eq0_abs_t(<4 x i16> %a) {
237236
; CHECK-LABEL: @select_v4i16_eq0_abs_t(
238237
; CHECK-NEXT: entry:
239-
; CHECK-NEXT: [[COND:%.*]] = icmp eq <4 x i16> [[A:%.*]], zeroinitializer
240-
; CHECK-NEXT: [[ABS:%.*]] = tail call <4 x i16> @llvm.abs.v4i16(<4 x i16> [[A]], i1 true)
241-
; CHECK-NEXT: [[RES:%.*]] = select <4 x i1> [[COND]], <4 x i16> zeroinitializer, <4 x i16> [[ABS]]
242-
; CHECK-NEXT: ret <4 x i16> [[RES]]
238+
; CHECK-NEXT: [[ABS:%.*]] = tail call <4 x i16> @llvm.abs.v4i16(<4 x i16> [[A:%.*]], i1 true)
239+
; CHECK-NEXT: ret <4 x i16> [[ABS]]
243240
;
244241
entry:
245242
%cond = icmp eq <4 x i16> %a, <i16 0, i16 0, i16 0, i16 0>
@@ -251,10 +248,8 @@ entry:
251248
define <4 x i16> @select_v4i16_ne0_abs_t(<4 x i16> %a) {
252249
; CHECK-LABEL: @select_v4i16_ne0_abs_t(
253250
; CHECK-NEXT: entry:
254-
; CHECK-NEXT: [[COND:%.*]] = icmp ne <4 x i16> [[A:%.*]], zeroinitializer
255-
; CHECK-NEXT: [[ABS:%.*]] = tail call <4 x i16> @llvm.abs.v4i16(<4 x i16> [[A]], i1 true)
256-
; CHECK-NEXT: [[RES:%.*]] = select <4 x i1> [[COND]], <4 x i16> [[ABS]], <4 x i16> zeroinitializer
257-
; CHECK-NEXT: ret <4 x i16> [[RES]]
251+
; CHECK-NEXT: [[ABS:%.*]] = tail call <4 x i16> @llvm.abs.v4i16(<4 x i16> [[A:%.*]], i1 true)
252+
; CHECK-NEXT: ret <4 x i16> [[ABS]]
258253
;
259254
entry:
260255
%cond = icmp ne <4 x i16> %a, <i16 0, i16 0, i16 0, i16 0>
@@ -305,10 +300,8 @@ entry:
305300
define <4 x i16> @badsplat1_select_v4i16_ne0_abs(<4 x i16> %a) {
306301
; CHECK-LABEL: @badsplat1_select_v4i16_ne0_abs(
307302
; CHECK-NEXT: entry:
308-
; CHECK-NEXT: [[COND:%.*]] = icmp ne <4 x i16> [[A:%.*]], <i16 0, i16 1, i16 0, i16 0>
309-
; CHECK-NEXT: [[ABS:%.*]] = tail call <4 x i16> @llvm.abs.v4i16(<4 x i16> [[A]], i1 true)
310-
; CHECK-NEXT: [[RES:%.*]] = select <4 x i1> [[COND]], <4 x i16> [[ABS]], <4 x i16> <i16 0, i16 1, i16 0, i16 0>
311-
; CHECK-NEXT: ret <4 x i16> [[RES]]
303+
; CHECK-NEXT: [[ABS:%.*]] = tail call <4 x i16> @llvm.abs.v4i16(<4 x i16> [[A:%.*]], i1 true)
304+
; CHECK-NEXT: ret <4 x i16> [[ABS]]
312305
;
313306
entry:
314307
%cond = icmp ne <4 x i16> %a, <i16 0, i16 1, i16 0, i16 0>

0 commit comments

Comments
 (0)