Skip to content

Commit 9479f6d

Browse files
committed
[PowerPC] Fix assert from machine verify pass that unmatched register class about fcmp selection in fast-isel
Bad machine code: Illegal virtual register for instruction function: TestULE basic block: %bb.0 entry (0x1000a39b158) instruction: %2:crrc = FCMPUD %1:vsfrc, %3:f8rc operand 1: %1:vsfrc Fix assert about missing match between fcmp instruction and register class. We should use vsx related cmp instruction xvcmpudp instead of fcmpu when vsx is opened. add -verifymachineinstrs option into related test cases to enable the verify pass. Differential Revision: https://reviews.llvm.org/D55686 llvm-svn: 350685
1 parent ed0d6c6 commit 9479f6d

File tree

3 files changed

+29
-22
lines changed

3 files changed

+29
-22
lines changed

llvm/lib/Target/PowerPC/PPCFastISel.cpp

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -861,8 +861,20 @@ bool PPCFastISel::PPCEmitCmp(const Value *SrcValue1, const Value *SrcValue2,
861861
}
862862
}
863863

864+
unsigned SrcReg1 = getRegForValue(SrcValue1);
865+
if (SrcReg1 == 0)
866+
return false;
867+
868+
unsigned SrcReg2 = 0;
869+
if (!UseImm) {
870+
SrcReg2 = getRegForValue(SrcValue2);
871+
if (SrcReg2 == 0)
872+
return false;
873+
}
874+
864875
unsigned CmpOpc;
865876
bool NeedsExt = false;
877+
auto RC = MRI.getRegClass(SrcReg1);
866878
switch (SrcVT.SimpleTy) {
867879
default: return false;
868880
case MVT::f32:
@@ -879,8 +891,11 @@ bool PPCFastISel::PPCEmitCmp(const Value *SrcValue1, const Value *SrcValue2,
879891
CmpOpc = PPC::EFSCMPGT;
880892
break;
881893
}
882-
} else
894+
} else if (isVSSRCRegClass(RC)) {
895+
llvm_unreachable("Unsupposed f32 VSX comparison");
896+
} else {
883897
CmpOpc = PPC::FCMPUS;
898+
}
884899
break;
885900
case MVT::f64:
886901
if (HasSPE) {
@@ -896,8 +911,11 @@ bool PPCFastISel::PPCEmitCmp(const Value *SrcValue1, const Value *SrcValue2,
896911
CmpOpc = PPC::EFDCMPGT;
897912
break;
898913
}
899-
} else
914+
} else if (isVSFRCRegClass(RC)) {
915+
CmpOpc = PPC::XSCMPUDP;
916+
} else {
900917
CmpOpc = PPC::FCMPUD;
918+
}
901919
break;
902920
case MVT::i1:
903921
case MVT::i8:
@@ -918,17 +936,6 @@ bool PPCFastISel::PPCEmitCmp(const Value *SrcValue1, const Value *SrcValue2,
918936
break;
919937
}
920938

921-
unsigned SrcReg1 = getRegForValue(SrcValue1);
922-
if (SrcReg1 == 0)
923-
return false;
924-
925-
unsigned SrcReg2 = 0;
926-
if (!UseImm) {
927-
SrcReg2 = getRegForValue(SrcValue2);
928-
if (SrcReg2 == 0)
929-
return false;
930-
}
931-
932939
if (NeedsExt) {
933940
unsigned ExtReg = createResultReg(&PPC::GPRCRegClass);
934941
if (!PPCEmitIntExt(SrcVT, SrcReg1, MVT::i32, ExtReg, IsZExt))

llvm/test/CodeGen/PowerPC/fast-isel-fcmp-nan.ll

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; RUN: llc -mtriple powerpc64le-unknown-linux-gnu -fast-isel -O0 < %s | FileCheck %s
1+
; RUN: llc -verify-machineinstrs -mtriple powerpc64le-unknown-linux-gnu -fast-isel -O0 < %s | FileCheck %s
22

33
define i1 @TestULT(double %t0) {
44
; CHECK-LABEL: TestULT:
@@ -17,7 +17,7 @@ good:
1717

1818
define i1 @TestULE(double %t0) {
1919
; CHECK-LABEL: TestULE:
20-
; CHECK: fcmpu
20+
; CHECK: xscmpudp
2121
; CHECK-NEXT: ble
2222
; CHECK: blr
2323
entry:
@@ -33,7 +33,7 @@ good:
3333

3434
define i1 @TestUNE(double %t0) {
3535
; CHECK-LABEL: TestUNE:
36-
; CHECK: fcmpu
36+
; CHECK: xscmpudp
3737
; CHECK-NEXT: bne
3838
; CHECK: blr
3939
entry:
@@ -79,7 +79,7 @@ good:
7979

8080
define i1 @TestUGE(double %t0) {
8181
; CHECK-LABEL: TestUGE:
82-
; CHECK: fcmpu
82+
; CHECK: xscmpudp
8383
; CHECK-NEXT: bge
8484
; CHECK: blr
8585
entry:
@@ -95,7 +95,7 @@ good:
9595

9696
define i1 @TestOLT(double %t0) {
9797
; CHECK-LABEL: TestOLT:
98-
; CHECK: fcmpu
98+
; CHECK: xscmpudp
9999
; CHECK-NEXT: blt
100100
; CHECK: blr
101101
entry:
@@ -141,7 +141,7 @@ good:
141141

142142
define i1 @TestOEQ(double %t0) {
143143
; CHECK-LABEL: TestOEQ:
144-
; CHECK: fcmpu
144+
; CHECK: xscmpudp
145145
; CHECK-NEXT: beq
146146
; CHECK: blr
147147
entry:
@@ -157,7 +157,7 @@ good:
157157

158158
define i1 @TestOGT(double %t0) {
159159
; CHECK-LABEL: TestOGT:
160-
; CHECK: fcmpu
160+
; CHECK: xscmpudp
161161
; CHECK-NEXT: bgt
162162
; CHECK: blr
163163
entry:

llvm/test/CodeGen/PowerPC/vsx-self-copy.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
; RUN: llc -mcpu=pwr7 -mattr=+vsx < %s | FileCheck %s
2-
; RUN: llc -mcpu=pwr7 -mattr=+vsx -fast-isel -O0 < %s | FileCheck %s
1+
; RUN: llc -mcpu=pwr7 -mattr=+vsx < %s -verify-machineinstrs | FileCheck %s
2+
; RUN: llc -mcpu=pwr7 -mattr=+vsx -fast-isel -O0 < %s -verify-machineinstrs | FileCheck %s
33
target datalayout = "E-m:e-i64:64-n32:64"
44
target triple = "powerpc64-unknown-linux-gnu"
55

0 commit comments

Comments
 (0)