diff --git a/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h b/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h index d8f19c19ee106..97e49b7c6e691 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h @@ -805,6 +805,10 @@ class CombinerHelper { /// (X ^ Y) != X -> Y != 0 bool matchRedundantBinOpInEquality(MachineInstr &MI, BuildFnTy &MatchInfo); + /// Transform: (X == 0 & Y == 0) -> (X | Y) == 0 + /// (X != 0 | Y != 0) -> (X | Y) != 0 + bool matchDoubleICmpZeroAndOr(MachineInstr &MI, BuildFnTy &MatchInfo); + /// Match shifts greater or equal to the bitwidth of the operation. bool matchShiftsTooBig(MachineInstr &MI); diff --git a/llvm/include/llvm/Target/GlobalISel/Combine.td b/llvm/include/llvm/Target/GlobalISel/Combine.td index 7e0691e1ee950..d68dfcdd7246a 100644 --- a/llvm/include/llvm/Target/GlobalISel/Combine.td +++ b/llvm/include/llvm/Target/GlobalISel/Combine.td @@ -903,6 +903,12 @@ def redundant_binop_in_equality : GICombineRule< [{ return Helper.matchRedundantBinOpInEquality(*${root}, ${info}); }]), (apply [{ Helper.applyBuildFn(*${root}, ${info}); }])>; +def double_icmp_zero_and_or_combine : GICombineRule< + (defs root:$root, build_fn_matchinfo:$info), + (match (wip_match_opcode G_AND, G_OR):$root, + [{ return Helper.matchDoubleICmpZeroAndOr(*${root}, ${info}); }]), + (apply [{ Helper.applyBuildFn(*${root}, ${info}); }])>; + def and_or_disjoint_mask : GICombineRule< (defs root:$root, build_fn_matchinfo:$info), (match (wip_match_opcode G_AND):$root, @@ -1265,7 +1271,7 @@ def all_combines : GICombineGroup<[trivial_combines, insert_vec_elt_combines, intdiv_combines, mulh_combines, redundant_neg_operands, and_or_disjoint_mask, fma_combines, fold_binop_into_select, sub_add_reg, select_to_minmax, redundant_binop_in_equality, - fsub_to_fneg, commute_constant_to_rhs]>; + double_icmp_zero_and_or_combine, fsub_to_fneg, commute_constant_to_rhs]>; // A combine group used to for prelegalizer combiners at -O0. The combines in // this group have been selected based on experiments to balance code size and diff --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp index 9efb70f28fee3..626c7e4a3c632 100644 --- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp @@ -6066,6 +6066,47 @@ bool CombinerHelper::matchRedundantBinOpInEquality(MachineInstr &MI, return CmpInst::isEquality(Pred) && Y.isValid(); } +bool CombinerHelper::matchDoubleICmpZeroAndOr( + MachineInstr &MI, std::function &MatchInfo) { + const unsigned Opcode = MI.getOpcode(); + assert(Opcode == TargetOpcode::G_OR || Opcode == TargetOpcode::G_AND); + + const Register Dst = MI.getOperand(0).getReg(); + CmpInst::Predicate LHSPred, RHSPred; + int64_t LHSImm, RHSImm; + Register LHSCmpSrc, RHSCmpSrc; + if (!mi_match( + Dst, MRI, + m_BinOp(Opcode, + m_GICmp(m_Pred(LHSPred), m_Reg(LHSCmpSrc), m_ICst(LHSImm)), + m_GICmp(m_Pred(RHSPred), m_Reg(RHSCmpSrc), m_ICst(RHSImm))))) + return false; + + // G_OR and G_AND cannot handle pointers + const auto LHSSrcTy = MRI.getType(LHSCmpSrc); + if (LHSSrcTy != MRI.getType(RHSCmpSrc) || LHSSrcTy.isPointer()) + return false; + + const bool IsAnd = Opcode == TargetOpcode::G_AND; + if ((IsAnd && LHSPred != CmpInst::ICMP_EQ) || + (!IsAnd && LHSPred != CmpInst::ICMP_NE) || LHSPred != RHSPred) + return false; + + if (LHSImm != 0 || RHSImm != 0) + return false; + + MatchInfo = [=](MachineIRBuilder &B) { + const Register OrDst = MRI.createGenericVirtualRegister(LHSSrcTy); + auto Zero = B.buildConstant(LHSSrcTy, 0); + B.buildOr(OrDst, LHSCmpSrc, RHSCmpSrc); + B.buildICmp(IsAnd ? CmpInst::Predicate::ICMP_EQ + : CmpInst::Predicate::ICMP_NE, + Dst, OrDst, Zero); + }; + + return true; +} + bool CombinerHelper::matchShiftsTooBig(MachineInstr &MI) { Register ShiftReg = MI.getOperand(2).getReg(); LLT ResTy = MRI.getType(MI.getOperand(0).getReg()); diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/combine-2-icmps-of-0-and-or.mir b/llvm/test/CodeGen/AArch64/GlobalISel/combine-2-icmps-of-0-and-or.mir new file mode 100644 index 0000000000000..a285ccf0c88fe --- /dev/null +++ b/llvm/test/CodeGen/AArch64/GlobalISel/combine-2-icmps-of-0-and-or.mir @@ -0,0 +1,764 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple aarch64 -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s +# REQUIRES: asserts + + +--- +name: valid_and_eq_0_eq_0_s32 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $w0, $w1 + + ; CHECK-LABEL: name: valid_and_eq_0_eq_0_s32 + ; CHECK: liveins: $w0, $w1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s32) = COPY $w0 + ; CHECK-NEXT: %y:_(s32) = COPY $w1 + ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 + ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR %x, %y + ; CHECK-NEXT: %and:_(s1) = G_ICMP intpred(eq), [[OR]](s32), %zero + ; CHECK-NEXT: %zext:_(s32) = G_ZEXT %and(s1) + ; CHECK-NEXT: $w0 = COPY %zext(s32) + ; CHECK-NEXT: RET_ReallyLR implicit $w0 + %x:_(s32) = COPY $w0 + %y:_(s32) = COPY $w1 + %zero:_(s32) = G_CONSTANT i32 0 + %cmp1:_(s1) = G_ICMP intpred(eq), %x:_(s32), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(eq), %y:_(s32), %zero:_ + %and:_(s1) = G_AND %cmp1, %cmp2 + %zext:_(s32) = G_ZEXT %and:_(s1) + $w0 = COPY %zext + RET_ReallyLR implicit $w0 + +... +--- +name: invalid_and_eq_1_eq_0_s32 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $w0, $w1 + + ; CHECK-LABEL: name: invalid_and_eq_1_eq_0_s32 + ; CHECK: liveins: $w0, $w1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s32) = COPY $w0 + ; CHECK-NEXT: %y:_(s32) = COPY $w1 + ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 + ; CHECK-NEXT: %one:_(s32) = G_CONSTANT i32 1 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(eq), %x(s32), %one + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(eq), %y(s32), %zero + ; CHECK-NEXT: %and:_(s1) = G_AND %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s32) = G_ZEXT %and(s1) + ; CHECK-NEXT: $w0 = COPY %zext(s32) + ; CHECK-NEXT: RET_ReallyLR implicit $w0 + %x:_(s32) = COPY $w0 + %y:_(s32) = COPY $w1 + %zero:_(s32) = G_CONSTANT i32 0 + %one:_(s32) = G_CONSTANT i32 1 + %cmp1:_(s1) = G_ICMP intpred(eq), %x:_(s32), %one:_ + %cmp2:_(s1) = G_ICMP intpred(eq), %y:_(s32), %zero:_ + %and:_(s1) = G_AND %cmp1, %cmp2 + %zext:_(s32) = G_ZEXT %and:_(s1) + $w0 = COPY %zext + RET_ReallyLR implicit $w0 + +... +--- +name: invalid_and_eq_0_eq_1_s32 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $w0, $w1 + + ; CHECK-LABEL: name: invalid_and_eq_0_eq_1_s32 + ; CHECK: liveins: $w0, $w1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s32) = COPY $w0 + ; CHECK-NEXT: %y:_(s32) = COPY $w1 + ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 + ; CHECK-NEXT: %one:_(s32) = G_CONSTANT i32 1 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(eq), %x(s32), %zero + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(eq), %y(s32), %one + ; CHECK-NEXT: %and:_(s1) = G_AND %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s32) = G_ZEXT %and(s1) + ; CHECK-NEXT: $w0 = COPY %zext(s32) + ; CHECK-NEXT: RET_ReallyLR implicit $w0 + %x:_(s32) = COPY $w0 + %y:_(s32) = COPY $w1 + %zero:_(s32) = G_CONSTANT i32 0 + %one:_(s32) = G_CONSTANT i32 1 + %cmp1:_(s1) = G_ICMP intpred(eq), %x:_(s32), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(eq), %y:_(s32), %one:_ + %and:_(s1) = G_AND %cmp1, %cmp2 + %zext:_(s32) = G_ZEXT %and:_(s1) + $w0 = COPY %zext + RET_ReallyLR implicit $w0 + +... +--- +name: invalid_and_ne_0_eq_0_s32 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $w0, $w1 + + ; CHECK-LABEL: name: invalid_and_ne_0_eq_0_s32 + ; CHECK: liveins: $w0, $w1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s32) = COPY $w0 + ; CHECK-NEXT: %y:_(s32) = COPY $w1 + ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(ne), %x(s32), %zero + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(eq), %y(s32), %zero + ; CHECK-NEXT: %and:_(s1) = G_AND %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s32) = G_ZEXT %and(s1) + ; CHECK-NEXT: $w0 = COPY %zext(s32) + ; CHECK-NEXT: RET_ReallyLR implicit $w0 + %x:_(s32) = COPY $w0 + %y:_(s32) = COPY $w1 + %zero:_(s32) = G_CONSTANT i32 0 + %cmp1:_(s1) = G_ICMP intpred(ne), %x:_(s32), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(eq), %y:_(s32), %zero:_ + %and:_(s1) = G_AND %cmp1, %cmp2 + %zext:_(s32) = G_ZEXT %and:_(s1) + $w0 = COPY %zext + RET_ReallyLR implicit $w0 + +... +--- +name: invalid_and_eq_0_ne_0_s32 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $w0, $w1 + + ; CHECK-LABEL: name: invalid_and_eq_0_ne_0_s32 + ; CHECK: liveins: $w0, $w1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s32) = COPY $w0 + ; CHECK-NEXT: %y:_(s32) = COPY $w1 + ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(eq), %x(s32), %zero + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(ne), %y(s32), %zero + ; CHECK-NEXT: %and:_(s1) = G_AND %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s32) = G_ZEXT %and(s1) + ; CHECK-NEXT: $w0 = COPY %zext(s32) + ; CHECK-NEXT: RET_ReallyLR implicit $w0 + %x:_(s32) = COPY $w0 + %y:_(s32) = COPY $w1 + %zero:_(s32) = G_CONSTANT i32 0 + %cmp1:_(s1) = G_ICMP intpred(eq), %x:_(s32), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(ne), %y:_(s32), %zero:_ + %and:_(s1) = G_AND %cmp1, %cmp2 + %zext:_(s32) = G_ZEXT %and:_(s1) + $w0 = COPY %zext + RET_ReallyLR implicit $w0 + +... +--- +name: invalid_and_ne_0_ne_0_s32 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $w0, $w1 + + ; CHECK-LABEL: name: invalid_and_ne_0_ne_0_s32 + ; CHECK: liveins: $w0, $w1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s32) = COPY $w0 + ; CHECK-NEXT: %y:_(s32) = COPY $w1 + ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(ne), %x(s32), %zero + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(ne), %y(s32), %zero + ; CHECK-NEXT: %and:_(s1) = G_AND %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s32) = G_ZEXT %and(s1) + ; CHECK-NEXT: $w0 = COPY %zext(s32) + ; CHECK-NEXT: RET_ReallyLR implicit $w0 + %x:_(s32) = COPY $w0 + %y:_(s32) = COPY $w1 + %zero:_(s32) = G_CONSTANT i32 0 + %cmp1:_(s1) = G_ICMP intpred(ne), %x:_(s32), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(ne), %y:_(s32), %zero:_ + %and:_(s1) = G_AND %cmp1, %cmp2 + %zext:_(s32) = G_ZEXT %and:_(s1) + $w0 = COPY %zext + RET_ReallyLR implicit $w0 + +... +--- +name: valid_or_ne_0_ne_0_s32 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $w0, $w1 + + ; CHECK-LABEL: name: valid_or_ne_0_ne_0_s32 + ; CHECK: liveins: $w0, $w1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s32) = COPY $w0 + ; CHECK-NEXT: %y:_(s32) = COPY $w1 + ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 + ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR %x, %y + ; CHECK-NEXT: %or:_(s1) = G_ICMP intpred(ne), [[OR]](s32), %zero + ; CHECK-NEXT: %zext:_(s32) = G_ZEXT %or(s1) + ; CHECK-NEXT: $w0 = COPY %zext(s32) + ; CHECK-NEXT: RET_ReallyLR implicit $w0 + %x:_(s32) = COPY $w0 + %y:_(s32) = COPY $w1 + %zero:_(s32) = G_CONSTANT i32 0 + %cmp1:_(s1) = G_ICMP intpred(ne), %x:_(s32), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(ne), %y:_(s32), %zero:_ + %or:_(s1) = G_OR %cmp1, %cmp2 + %zext:_(s32) = G_ZEXT %or:_(s1) + $w0 = COPY %zext + RET_ReallyLR implicit $w0 + +... +--- +name: invalid_or_ne_1_ne_0_s32 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $w0, $w1 + + ; CHECK-LABEL: name: invalid_or_ne_1_ne_0_s32 + ; CHECK: liveins: $w0, $w1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s32) = COPY $w0 + ; CHECK-NEXT: %y:_(s32) = COPY $w1 + ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 + ; CHECK-NEXT: %one:_(s32) = G_CONSTANT i32 1 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(ne), %x(s32), %one + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(ne), %y(s32), %zero + ; CHECK-NEXT: %or:_(s1) = G_OR %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s32) = G_ZEXT %or(s1) + ; CHECK-NEXT: $w0 = COPY %zext(s32) + ; CHECK-NEXT: RET_ReallyLR implicit $w0 + %x:_(s32) = COPY $w0 + %y:_(s32) = COPY $w1 + %zero:_(s32) = G_CONSTANT i32 0 + %one:_(s32) = G_CONSTANT i32 1 + %cmp1:_(s1) = G_ICMP intpred(ne), %x:_(s32), %one:_ + %cmp2:_(s1) = G_ICMP intpred(ne), %y:_(s32), %zero:_ + %or:_(s1) = G_OR %cmp1, %cmp2 + %zext:_(s32) = G_ZEXT %or:_(s1) + $w0 = COPY %zext + RET_ReallyLR implicit $w0 + +... +--- +name: invalid_or_ne_0_ne_1_s32 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $w0, $w1 + + ; CHECK-LABEL: name: invalid_or_ne_0_ne_1_s32 + ; CHECK: liveins: $w0, $w1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s32) = COPY $w0 + ; CHECK-NEXT: %y:_(s32) = COPY $w1 + ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 + ; CHECK-NEXT: %one:_(s32) = G_CONSTANT i32 1 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(ne), %x(s32), %zero + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(ne), %y(s32), %one + ; CHECK-NEXT: %or:_(s1) = G_OR %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s32) = G_ZEXT %or(s1) + ; CHECK-NEXT: $w0 = COPY %zext(s32) + ; CHECK-NEXT: RET_ReallyLR implicit $w0 + %x:_(s32) = COPY $w0 + %y:_(s32) = COPY $w1 + %zero:_(s32) = G_CONSTANT i32 0 + %one:_(s32) = G_CONSTANT i32 1 + %cmp1:_(s1) = G_ICMP intpred(ne), %x:_(s32), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(ne), %y:_(s32), %one:_ + %or:_(s1) = G_OR %cmp1, %cmp2 + %zext:_(s32) = G_ZEXT %or:_(s1) + $w0 = COPY %zext + RET_ReallyLR implicit $w0 + +... +--- +name: invalid_or_eq_0_ne_0_s32 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $w0, $w1 + + ; CHECK-LABEL: name: invalid_or_eq_0_ne_0_s32 + ; CHECK: liveins: $w0, $w1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s32) = COPY $w0 + ; CHECK-NEXT: %y:_(s32) = COPY $w1 + ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(eq), %x(s32), %zero + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(ne), %y(s32), %zero + ; CHECK-NEXT: %or:_(s1) = G_OR %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s32) = G_ZEXT %or(s1) + ; CHECK-NEXT: $w0 = COPY %zext(s32) + ; CHECK-NEXT: RET_ReallyLR implicit $w0 + %x:_(s32) = COPY $w0 + %y:_(s32) = COPY $w1 + %zero:_(s32) = G_CONSTANT i32 0 + %cmp1:_(s1) = G_ICMP intpred(eq), %x:_(s32), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(ne), %y:_(s32), %zero:_ + %or:_(s1) = G_OR %cmp1, %cmp2 + %zext:_(s32) = G_ZEXT %or:_(s1) + $w0 = COPY %zext + RET_ReallyLR implicit $w0 + +... +--- +name: invalid_or_ne_0_eq_0_s32 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $w0, $w1 + + ; CHECK-LABEL: name: invalid_or_ne_0_eq_0_s32 + ; CHECK: liveins: $w0, $w1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s32) = COPY $w0 + ; CHECK-NEXT: %y:_(s32) = COPY $w1 + ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(ne), %x(s32), %zero + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(eq), %y(s32), %zero + ; CHECK-NEXT: %or:_(s1) = G_OR %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s32) = G_ZEXT %or(s1) + ; CHECK-NEXT: $w0 = COPY %zext(s32) + ; CHECK-NEXT: RET_ReallyLR implicit $w0 + %x:_(s32) = COPY $w0 + %y:_(s32) = COPY $w1 + %zero:_(s32) = G_CONSTANT i32 0 + %cmp1:_(s1) = G_ICMP intpred(ne), %x:_(s32), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(eq), %y:_(s32), %zero:_ + %or:_(s1) = G_OR %cmp1, %cmp2 + %zext:_(s32) = G_ZEXT %or:_(s1) + $w0 = COPY %zext + RET_ReallyLR implicit $w0 + +... + +--- +name: valid_and_eq_0_eq_0_s64 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $x0, $x1 + + ; CHECK-LABEL: name: valid_and_eq_0_eq_0_s64 + ; CHECK: liveins: $x0, $x1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s64) = COPY $x0 + ; CHECK-NEXT: %y:_(s64) = COPY $x1 + ; CHECK-NEXT: %zero:_(s64) = G_CONSTANT i64 0 + ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s64) = G_OR %x, %y + ; CHECK-NEXT: %and:_(s1) = G_ICMP intpred(eq), [[OR]](s64), %zero + ; CHECK-NEXT: %zext:_(s64) = G_ZEXT %and(s1) + ; CHECK-NEXT: $x0 = COPY %zext(s64) + ; CHECK-NEXT: RET_ReallyLR implicit $x0 + %x:_(s64) = COPY $x0 + %y:_(s64) = COPY $x1 + %zero:_(s64) = G_CONSTANT i64 0 + %cmp1:_(s1) = G_ICMP intpred(eq), %x:_(s64), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(eq), %y:_(s64), %zero:_ + %and:_(s1) = G_AND %cmp1, %cmp2 + %zext:_(s64) = G_ZEXT %and:_(s1) + $x0 = COPY %zext + RET_ReallyLR implicit $x0 + +... +--- +name: invalid_and_eq_1_eq_0_s64 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $x0, $x1 + + ; CHECK-LABEL: name: invalid_and_eq_1_eq_0_s64 + ; CHECK: liveins: $x0, $x1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s64) = COPY $x0 + ; CHECK-NEXT: %y:_(s64) = COPY $x1 + ; CHECK-NEXT: %zero:_(s64) = G_CONSTANT i64 0 + ; CHECK-NEXT: %one:_(s64) = G_CONSTANT i64 1 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(eq), %x(s64), %one + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(eq), %y(s64), %zero + ; CHECK-NEXT: %and:_(s1) = G_AND %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s64) = G_ZEXT %and(s1) + ; CHECK-NEXT: $x0 = COPY %zext(s64) + ; CHECK-NEXT: RET_ReallyLR implicit $x0 + %x:_(s64) = COPY $x0 + %y:_(s64) = COPY $x1 + %zero:_(s64) = G_CONSTANT i64 0 + %one:_(s64) = G_CONSTANT i64 1 + %cmp1:_(s1) = G_ICMP intpred(eq), %x:_(s64), %one:_ + %cmp2:_(s1) = G_ICMP intpred(eq), %y:_(s64), %zero:_ + %and:_(s1) = G_AND %cmp1, %cmp2 + %zext:_(s64) = G_ZEXT %and:_(s1) + $x0 = COPY %zext + RET_ReallyLR implicit $x0 + +... +--- +name: invalid_and_eq_0_eq_1_s64 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $x0, $x1 + + ; CHECK-LABEL: name: invalid_and_eq_0_eq_1_s64 + ; CHECK: liveins: $x0, $x1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s64) = COPY $x0 + ; CHECK-NEXT: %y:_(s64) = COPY $x1 + ; CHECK-NEXT: %zero:_(s64) = G_CONSTANT i64 0 + ; CHECK-NEXT: %one:_(s64) = G_CONSTANT i64 1 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(eq), %x(s64), %zero + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(eq), %y(s64), %one + ; CHECK-NEXT: %and:_(s1) = G_AND %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s64) = G_ZEXT %and(s1) + ; CHECK-NEXT: $x0 = COPY %zext(s64) + ; CHECK-NEXT: RET_ReallyLR implicit $x0 + %x:_(s64) = COPY $x0 + %y:_(s64) = COPY $x1 + %zero:_(s64) = G_CONSTANT i64 0 + %one:_(s64) = G_CONSTANT i64 1 + %cmp1:_(s1) = G_ICMP intpred(eq), %x:_(s64), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(eq), %y:_(s64), %one:_ + %and:_(s1) = G_AND %cmp1, %cmp2 + %zext:_(s64) = G_ZEXT %and:_(s1) + $x0 = COPY %zext + RET_ReallyLR implicit $x0 + +... +--- +name: invalid_and_ne_0_eq_0_s64 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $x0, $x1 + + ; CHECK-LABEL: name: invalid_and_ne_0_eq_0_s64 + ; CHECK: liveins: $x0, $x1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s64) = COPY $x0 + ; CHECK-NEXT: %y:_(s64) = COPY $x1 + ; CHECK-NEXT: %zero:_(s64) = G_CONSTANT i64 0 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(ne), %x(s64), %zero + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(eq), %y(s64), %zero + ; CHECK-NEXT: %and:_(s1) = G_AND %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s64) = G_ZEXT %and(s1) + ; CHECK-NEXT: $x0 = COPY %zext(s64) + ; CHECK-NEXT: RET_ReallyLR implicit $x0 + %x:_(s64) = COPY $x0 + %y:_(s64) = COPY $x1 + %zero:_(s64) = G_CONSTANT i64 0 + %cmp1:_(s1) = G_ICMP intpred(ne), %x:_(s64), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(eq), %y:_(s64), %zero:_ + %and:_(s1) = G_AND %cmp1, %cmp2 + %zext:_(s64) = G_ZEXT %and:_(s1) + $x0 = COPY %zext + RET_ReallyLR implicit $x0 + +... +--- +name: invalid_and_eq_0_ne_0_s64 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $x0, $x1 + + ; CHECK-LABEL: name: invalid_and_eq_0_ne_0_s64 + ; CHECK: liveins: $x0, $x1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s64) = COPY $x0 + ; CHECK-NEXT: %y:_(s64) = COPY $x1 + ; CHECK-NEXT: %zero:_(s64) = G_CONSTANT i64 0 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(eq), %x(s64), %zero + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(ne), %y(s64), %zero + ; CHECK-NEXT: %and:_(s1) = G_AND %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s64) = G_ZEXT %and(s1) + ; CHECK-NEXT: $x0 = COPY %zext(s64) + ; CHECK-NEXT: RET_ReallyLR implicit $x0 + %x:_(s64) = COPY $x0 + %y:_(s64) = COPY $x1 + %zero:_(s64) = G_CONSTANT i64 0 + %cmp1:_(s1) = G_ICMP intpred(eq), %x:_(s64), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(ne), %y:_(s64), %zero:_ + %and:_(s1) = G_AND %cmp1, %cmp2 + %zext:_(s64) = G_ZEXT %and:_(s1) + $x0 = COPY %zext + RET_ReallyLR implicit $x0 + +... +--- +name: invalid_and_ne_0_ne_0_s64 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $x0, $x1 + + ; CHECK-LABEL: name: invalid_and_ne_0_ne_0_s64 + ; CHECK: liveins: $x0, $x1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s64) = COPY $x0 + ; CHECK-NEXT: %y:_(s64) = COPY $x1 + ; CHECK-NEXT: %zero:_(s64) = G_CONSTANT i64 0 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(ne), %x(s64), %zero + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(ne), %y(s64), %zero + ; CHECK-NEXT: %and:_(s1) = G_AND %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s64) = G_ZEXT %and(s1) + ; CHECK-NEXT: $x0 = COPY %zext(s64) + ; CHECK-NEXT: RET_ReallyLR implicit $x0 + %x:_(s64) = COPY $x0 + %y:_(s64) = COPY $x1 + %zero:_(s64) = G_CONSTANT i64 0 + %cmp1:_(s1) = G_ICMP intpred(ne), %x:_(s64), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(ne), %y:_(s64), %zero:_ + %and:_(s1) = G_AND %cmp1, %cmp2 + %zext:_(s64) = G_ZEXT %and:_(s1) + $x0 = COPY %zext + RET_ReallyLR implicit $x0 + +... +--- +name: valid_or_ne_0_ne_0_s64 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $x0, $x1 + + ; CHECK-LABEL: name: valid_or_ne_0_ne_0_s64 + ; CHECK: liveins: $x0, $x1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s64) = COPY $x0 + ; CHECK-NEXT: %y:_(s64) = COPY $x1 + ; CHECK-NEXT: %zero:_(s64) = G_CONSTANT i64 0 + ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s64) = G_OR %x, %y + ; CHECK-NEXT: %or:_(s1) = G_ICMP intpred(ne), [[OR]](s64), %zero + ; CHECK-NEXT: %zext:_(s64) = G_ZEXT %or(s1) + ; CHECK-NEXT: $x0 = COPY %zext(s64) + ; CHECK-NEXT: RET_ReallyLR implicit $x0 + %x:_(s64) = COPY $x0 + %y:_(s64) = COPY $x1 + %zero:_(s64) = G_CONSTANT i64 0 + %cmp1:_(s1) = G_ICMP intpred(ne), %x:_(s64), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(ne), %y:_(s64), %zero:_ + %or:_(s1) = G_OR %cmp1, %cmp2 + %zext:_(s64) = G_ZEXT %or:_(s1) + $x0 = COPY %zext + RET_ReallyLR implicit $x0 + +... +--- +name: invalid_or_ne_1_ne_0_s64 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $x0, $x1 + + ; CHECK-LABEL: name: invalid_or_ne_1_ne_0_s64 + ; CHECK: liveins: $x0, $x1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s64) = COPY $x0 + ; CHECK-NEXT: %y:_(s64) = COPY $x1 + ; CHECK-NEXT: %zero:_(s64) = G_CONSTANT i64 0 + ; CHECK-NEXT: %one:_(s64) = G_CONSTANT i64 1 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(ne), %x(s64), %one + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(ne), %y(s64), %zero + ; CHECK-NEXT: %or:_(s1) = G_OR %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s64) = G_ZEXT %or(s1) + ; CHECK-NEXT: $x0 = COPY %zext(s64) + ; CHECK-NEXT: RET_ReallyLR implicit $x0 + %x:_(s64) = COPY $x0 + %y:_(s64) = COPY $x1 + %zero:_(s64) = G_CONSTANT i64 0 + %one:_(s64) = G_CONSTANT i64 1 + %cmp1:_(s1) = G_ICMP intpred(ne), %x:_(s64), %one:_ + %cmp2:_(s1) = G_ICMP intpred(ne), %y:_(s64), %zero:_ + %or:_(s1) = G_OR %cmp1, %cmp2 + %zext:_(s64) = G_ZEXT %or:_(s1) + $x0 = COPY %zext + RET_ReallyLR implicit $x0 + +... +--- +name: invalid_or_ne_0_ne_1_s64 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $x0, $x1 + + ; CHECK-LABEL: name: invalid_or_ne_0_ne_1_s64 + ; CHECK: liveins: $x0, $x1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s64) = COPY $x0 + ; CHECK-NEXT: %y:_(s64) = COPY $x1 + ; CHECK-NEXT: %zero:_(s64) = G_CONSTANT i64 0 + ; CHECK-NEXT: %one:_(s64) = G_CONSTANT i64 1 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(ne), %x(s64), %zero + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(ne), %y(s64), %one + ; CHECK-NEXT: %or:_(s1) = G_OR %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s64) = G_ZEXT %or(s1) + ; CHECK-NEXT: $x0 = COPY %zext(s64) + ; CHECK-NEXT: RET_ReallyLR implicit $x0 + %x:_(s64) = COPY $x0 + %y:_(s64) = COPY $x1 + %zero:_(s64) = G_CONSTANT i64 0 + %one:_(s64) = G_CONSTANT i64 1 + %cmp1:_(s1) = G_ICMP intpred(ne), %x:_(s64), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(ne), %y:_(s64), %one:_ + %or:_(s1) = G_OR %cmp1, %cmp2 + %zext:_(s64) = G_ZEXT %or:_(s1) + $x0 = COPY %zext + RET_ReallyLR implicit $x0 + +... +--- +name: invalid_or_eq_0_ne_0_s64 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $x0, $x1 + + ; CHECK-LABEL: name: invalid_or_eq_0_ne_0_s64 + ; CHECK: liveins: $x0, $x1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s64) = COPY $x0 + ; CHECK-NEXT: %y:_(s64) = COPY $x1 + ; CHECK-NEXT: %zero:_(s64) = G_CONSTANT i64 0 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(eq), %x(s64), %zero + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(ne), %y(s64), %zero + ; CHECK-NEXT: %or:_(s1) = G_OR %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s64) = G_ZEXT %or(s1) + ; CHECK-NEXT: $x0 = COPY %zext(s64) + ; CHECK-NEXT: RET_ReallyLR implicit $x0 + %x:_(s64) = COPY $x0 + %y:_(s64) = COPY $x1 + %zero:_(s64) = G_CONSTANT i64 0 + %cmp1:_(s1) = G_ICMP intpred(eq), %x:_(s64), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(ne), %y:_(s64), %zero:_ + %or:_(s1) = G_OR %cmp1, %cmp2 + %zext:_(s64) = G_ZEXT %or:_(s1) + $x0 = COPY %zext + RET_ReallyLR implicit $x0 + +... +--- +name: invalid_or_ne_0_eq_0_s64 +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $x0, $x1 + + ; CHECK-LABEL: name: invalid_or_ne_0_eq_0_s64 + ; CHECK: liveins: $x0, $x1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s64) = COPY $x0 + ; CHECK-NEXT: %y:_(s64) = COPY $x1 + ; CHECK-NEXT: %zero:_(s64) = G_CONSTANT i64 0 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(ne), %x(s64), %zero + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(eq), %y(s64), %zero + ; CHECK-NEXT: %or:_(s1) = G_OR %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s64) = G_ZEXT %or(s1) + ; CHECK-NEXT: $x0 = COPY %zext(s64) + ; CHECK-NEXT: RET_ReallyLR implicit $x0 + %x:_(s64) = COPY $x0 + %y:_(s64) = COPY $x1 + %zero:_(s64) = G_CONSTANT i64 0 + %cmp1:_(s1) = G_ICMP intpred(ne), %x:_(s64), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(eq), %y:_(s64), %zero:_ + %or:_(s1) = G_OR %cmp1, %cmp2 + %zext:_(s64) = G_ZEXT %or:_(s1) + $x0 = COPY %zext + RET_ReallyLR implicit $x0 + +... +--- +name: invalid_p0_src +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $x0, $x1 + + ; CHECK-LABEL: name: invalid_p0_src + ; CHECK: liveins: $x0, $x1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(p0) = COPY $x0 + ; CHECK-NEXT: %y:_(p0) = COPY $x1 + ; CHECK-NEXT: %zero:_(p0) = G_CONSTANT i64 0 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(eq), %x(p0), %zero + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(eq), %y(p0), %zero + ; CHECK-NEXT: %and:_(s1) = G_AND %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s64) = G_ZEXT %and(s1) + ; CHECK-NEXT: $x0 = COPY %zext(s64) + ; CHECK-NEXT: RET_ReallyLR implicit $x0 + %x:_(p0) = COPY $x0 + %y:_(p0) = COPY $x1 + %zero:_(p0) = G_CONSTANT i64 0 + %cmp1:_(s1) = G_ICMP intpred(eq), %x:_(p0), %zero:_ + %cmp2:_(s1) = G_ICMP intpred(eq), %y:_(p0), %zero:_ + %and:_(s1) = G_AND %cmp1, %cmp2 + %zext:_(s64) = G_ZEXT %and:_(s1) + $x0 = COPY %zext + RET_ReallyLR implicit $x0 + +... +--- +name: invalid_diff_src_ty +tracksRegLiveness: true +legalized: true +body: | + bb.0: + liveins: $w0, $x1 + + ; CHECK-LABEL: name: invalid_diff_src_ty + ; CHECK: liveins: $w0, $x1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %x:_(s32) = COPY $w0 + ; CHECK-NEXT: %y:_(s64) = COPY $x1 + ; CHECK-NEXT: %zero_s32:_(s32) = G_CONSTANT i32 0 + ; CHECK-NEXT: %zero_s64:_(s64) = G_CONSTANT i64 0 + ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(eq), %x(s32), %zero_s32 + ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(eq), %y(s64), %zero_s64 + ; CHECK-NEXT: %and:_(s1) = G_AND %cmp1, %cmp2 + ; CHECK-NEXT: %zext:_(s64) = G_ZEXT %and(s1) + ; CHECK-NEXT: $x0 = COPY %zext(s64) + ; CHECK-NEXT: RET_ReallyLR implicit $x0 + %x:_(s32) = COPY $w0 + %y:_(s64) = COPY $x1 + %zero_s32:_(s32) = G_CONSTANT i32 0 + %zero_s64:_(s64) = G_CONSTANT i64 0 + %cmp1:_(s1) = G_ICMP intpred(eq), %x:_(s32), %zero_s32:_ + %cmp2:_(s1) = G_ICMP intpred(eq), %y:_(s64), %zero_s64:_ + %and:_(s1) = G_AND %cmp1, %cmp2 + %zext:_(s64) = G_ZEXT %and:_(s1) + $x0 = COPY %zext + RET_ReallyLR implicit $x0 + +... diff --git a/llvm/test/CodeGen/AArch64/cmp-chains.ll b/llvm/test/CodeGen/AArch64/cmp-chains.ll index c4ad84d9fa25b..4eaa25608d16f 100644 --- a/llvm/test/CodeGen/AArch64/cmp-chains.ll +++ b/llvm/test/CodeGen/AArch64/cmp-chains.ll @@ -186,21 +186,12 @@ define i32 @cmp_or4(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 ; (x0 != 0) || (x1 != 0) define i32 @true_or2(i32 %0, i32 %1) { -; SDISEL-LABEL: true_or2: -; SDISEL: // %bb.0: -; SDISEL-NEXT: orr w8, w0, w1 -; SDISEL-NEXT: cmp w8, #0 -; SDISEL-NEXT: cset w0, ne -; SDISEL-NEXT: ret -; -; GISEL-LABEL: true_or2: -; GISEL: // %bb.0: -; GISEL-NEXT: cmp w0, #0 -; GISEL-NEXT: cset w8, ne -; GISEL-NEXT: cmp w1, #0 -; GISEL-NEXT: cset w9, ne -; GISEL-NEXT: orr w0, w8, w9 -; GISEL-NEXT: ret +; CHECK-LABEL: true_or2: +; CHECK: // %bb.0: +; CHECK-NEXT: orr w8, w0, w1 +; CHECK-NEXT: cmp w8, #0 +; CHECK-NEXT: cset w0, ne +; CHECK-NEXT: ret %3 = icmp ne i32 %0, 0 %4 = icmp ne i32 %1, 0 %5 = select i1 %3, i1 true, i1 %4 @@ -210,25 +201,13 @@ define i32 @true_or2(i32 %0, i32 %1) { ; (x0 != 0) || (x1 != 0) || (x2 != 0) define i32 @true_or3(i32 %0, i32 %1, i32 %2) { -; SDISEL-LABEL: true_or3: -; SDISEL: // %bb.0: -; SDISEL-NEXT: orr w8, w0, w1 -; SDISEL-NEXT: orr w8, w8, w2 -; SDISEL-NEXT: cmp w8, #0 -; SDISEL-NEXT: cset w0, ne -; SDISEL-NEXT: ret -; -; GISEL-LABEL: true_or3: -; GISEL: // %bb.0: -; GISEL-NEXT: cmp w0, #0 -; GISEL-NEXT: cset w8, ne -; GISEL-NEXT: cmp w1, #0 -; GISEL-NEXT: cset w9, ne -; GISEL-NEXT: cmp w2, #0 -; GISEL-NEXT: orr w8, w8, w9 -; GISEL-NEXT: cset w9, ne -; GISEL-NEXT: orr w0, w8, w9 -; GISEL-NEXT: ret +; CHECK-LABEL: true_or3: +; CHECK: // %bb.0: +; CHECK-NEXT: orr w8, w0, w1 +; CHECK-NEXT: orr w8, w8, w2 +; CHECK-NEXT: cmp w8, #0 +; CHECK-NEXT: cset w0, ne +; CHECK-NEXT: ret %4 = icmp ne i32 %0, 0 %5 = icmp ne i32 %1, 0 %6 = select i1 %4, i1 true, i1 %5 @@ -237,5 +216,3 @@ define i32 @true_or3(i32 %0, i32 %1, i32 %2) { %9 = zext i1 %8 to i32 ret i32 %9 } -;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: -; CHECK: {{.*}}