From: Matt Arsenault Date: Fri, 18 Jan 2019 20:49:17 +0000 (+0000) Subject: GlobalISel: Verify G_ICMP/G_FCMP vector types X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=34b76d05a1c774f85cc6bef6369de6fe9da7bdd3;p=llvm GlobalISel: Verify G_ICMP/G_FCMP vector types git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351591 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/MachineVerifier.cpp b/lib/CodeGen/MachineVerifier.cpp index aae09588b6a..a36c13f537d 100644 --- a/lib/CodeGen/MachineVerifier.cpp +++ b/lib/CodeGen/MachineVerifier.cpp @@ -1187,6 +1187,17 @@ void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) { } 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() || diff --git a/test/Verifier/test_g_fcmp.mir b/test/Verifier/test_g_fcmp.mir new file mode 100644 index 00000000000..baaa2483536 --- /dev/null +++ b/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 + +... diff --git a/test/Verifier/test_g_icmp.mir b/test/Verifier/test_g_icmp.mir new file mode 100644 index 00000000000..e2d9d6419cc --- /dev/null +++ b/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 + +...