diff --git a/llvm/lib/Target/SystemZ/SystemZISelLowering.h b/llvm/lib/Target/SystemZ/SystemZISelLowering.h index d49e48f676abab..60969ffca59a5f 100644 --- a/llvm/lib/Target/SystemZ/SystemZISelLowering.h +++ b/llvm/lib/Target/SystemZ/SystemZISelLowering.h @@ -437,6 +437,10 @@ class SystemZTargetLowering : public TargetLowering { EVT ScVT = VT.getScalarType(); return ScVT == MVT::f32 || ScVT == MVT::f64 || ScVT == MVT::f128; } + bool isMaskAndCmp0FoldingBeneficial(const Instruction &AndI) const override { + ConstantInt* Mask = dyn_cast(AndI.getOperand(1)); + return Mask && Mask->getValue().isIntN(16); + } EVT getSetCCResultType(const DataLayout &DL, LLVMContext &, EVT) const override; bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, diff --git a/llvm/test/CodeGen/SystemZ/codegenprepare-sink-and-for-tm.ll b/llvm/test/CodeGen/SystemZ/codegenprepare-sink-and-for-tm.ll new file mode 100644 index 00000000000000..8c5128aee9f6cb --- /dev/null +++ b/llvm/test/CodeGen/SystemZ/codegenprepare-sink-and-for-tm.ll @@ -0,0 +1,42 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s +; +; CGP will duplicate and sink the 'icmp' to the users. Test that it does the +; same for the 'and' so that tmll:s result and the nilf is eliminated. + +define void @fun(i32 %Arg) { +; CHECK-LABEL: fun: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: ahi %r2, 1 +; CHECK-NEXT: lhi %r0, 0 +; CHECK-NEXT: cijlh %r0, 0, .LBB0_2 +; CHECK-NEXT: # %bb.1: # %bb1 +; CHECK-NEXT: tmll %r2, 16 +; CHECK-NEXT: lochie %r0, 1 +; CHECK-NEXT: st %r0, 0(%r1) +; CHECK-NEXT: br %r14 +; CHECK-NEXT: .LBB0_2: # %bb2 +; CHECK-NEXT: tmll %r2, 16 +; CHECK-NEXT: lhi %r0, 16 +; CHECK-NEXT: lochie %r0, 4 +; CHECK-NEXT: st %r0, 0(%r1) +; CHECK-NEXT: br %r14 +entry: + %A = add i32 %Arg, 1 + %N = and i32 %A, 16 + %i4 = icmp eq i32 %N, 0 + br i1 undef, label %bb1, label %bb2 + +bb1: + %i9 = zext i1 %i4 to i32 + store i32 %i9, i32* undef + br label %bb3 + +bb2: + %i13 = select i1 %i4, i32 4, i32 16 + store i32 %i13, i32* undef + br label %bb3 + +bb3: + ret void +}