Index: lib/CodeGen/MachineVerifier.cpp =================================================================== --- lib/CodeGen/MachineVerifier.cpp +++ lib/CodeGen/MachineVerifier.cpp @@ -1197,6 +1197,17 @@ } break; } + case TargetOpcode::G_ICMP: + case TargetOpcode::G_FCMP: { + LLT DstTy = MRI->getType(MI->getOperand(0).getReg()); + LLT SrcTy = MRI->getType(MI->getOperand(2).getReg()); + + if ((DstTy.isVector() != SrcTy.isVector()) || + (DstTy.isVector() && DstTy.getNumElements() != SrcTy.getNumElements())) + report("Generic vector icmp/fcmp must preserve number of lanes", MI); + + break; + } case TargetOpcode::STATEPOINT: if (!MI->getOperand(StatepointOpers::IDPos).isImm() || !MI->getOperand(StatepointOpers::NBytesPos).isImm() || Index: test/Verifier/test_g_fcmp.mir =================================================================== --- /dev/null +++ test/Verifier/test_g_fcmp.mir @@ -0,0 +1,40 @@ +#RUN: not llc -o - -global-isel -run-pass=none -verify-machineinstrs %s 2>&1 | FileCheck %s +# REQUIRES: global-isel, aarch64-registered-target + +--- +name: test_fcmp +legalized: true +regBankSelected: false +selected: false +tracksRegLiveness: true +liveins: +body: | + bb.0: + + %0:_(s32) = G_FCONSTANT float 0.0 + %1:_(s32) = G_FCONSTANT float 1.0 + + ; Vector result, scalar source + ; CHECK: Bad machine code: Generic vector icmp/fcmp must preserve number of lanes + %2:_(<2 x s1>) = G_FCMP floatpred(oeq), %0, %1 + + ; Scalar result, vector source + ; CHECK: Bad machine code: Generic vector icmp/fcmp must preserve number of lanes + %3:_(<2 x s32>) = G_IMPLICIT_DEF + %4:_(<2 x s32>) = G_IMPLICIT_DEF + %5:_(s1) = G_FCMP floatpred(oeq), %3, %4 + + ; mismatched element count + ; CHECK: Bad machine code: Generic vector icmp/fcmp must preserve number of + %6:_(<2 x s32>) = G_IMPLICIT_DEF + %7:_(<2 x s32>) = G_IMPLICIT_DEF + %8:_(<4 x s1>) = G_FCMP floatpred(oeq), %6, %7 + + + ; mismatched scalar element type + ; CHECK: *** Bad machine code: Type mismatch in generic instruction *** + %9:_(s32) = G_FCONSTANT float 0.0 + %10:_(s64) = G_FCONSTANT float 1.0 + %11:_(s1) = G_FCMP floatpred(oeq), %9, %10 + +... Index: test/Verifier/test_g_icmp.mir =================================================================== --- /dev/null +++ test/Verifier/test_g_icmp.mir @@ -0,0 +1,40 @@ +#RUN: not llc -o - -global-isel -run-pass=none -verify-machineinstrs %s 2>&1 | FileCheck %s +# REQUIRES: global-isel, aarch64-registered-target + +--- +name: test_icmp +legalized: true +regBankSelected: false +selected: false +tracksRegLiveness: true +liveins: +body: | + bb.0: + + %0:_(s32) = G_CONSTANT i32 0 + %1:_(s32) = G_CONSTANT i32 1 + + ; Vector result, scalar source + ; CHECK: Bad machine code: Generic vector icmp/fcmp must preserve number of lanes + %2:_(<2 x s1>) = G_ICMP intpred(eq), %0, %1 + + ; Scalar result, vector source + ; CHECK: Bad machine code: Generic vector icmp/fcmp must preserve number of lanes + %3:_(<2 x s32>) = G_IMPLICIT_DEF + %4:_(<2 x s32>) = G_IMPLICIT_DEF + %5:_(s1) = G_ICMP intpred(eq), %3, %4 + + ; mismatched element count + ; CHECK: Bad machine code: Generic vector icmp/fcmp must preserve number of + %6:_(<2 x s32>) = G_IMPLICIT_DEF + %7:_(<2 x s32>) = G_IMPLICIT_DEF + %8:_(<4 x s1>) = G_ICMP intpred(eq), %6, %7 + + + ; mismatched scalar element type + ; CHECK: *** Bad machine code: Type mismatch in generic instruction *** + %9:_(s32) = G_CONSTANT i32 0 + %10:_(s64) = G_CONSTANT i32 1 + %11:_(s1) = G_ICMP intpred(eq), %9, %10 + +...