]> granicus.if.org Git - llvm/commitdiff
[Mips][FastISel] Fix handling of icmp with i1 type
authorPetar Jovanovic <petar.jovanovic@mips.com>
Tue, 17 Jul 2018 14:57:46 +0000 (14:57 +0000)
committerPetar Jovanovic <petar.jovanovic@mips.com>
Tue, 17 Jul 2018 14:57:46 +0000 (14:57 +0000)
The Mips FastISel back-end does not extend i1 values while lowering icmp.
Ensure that we bail into DAG ISel when handling this case.

Patch by Dragan Mladjenovic.

Differential Revision: https://reviews.llvm.org/D49290

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337288 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Mips/MipsFastISel.cpp
test/CodeGen/Mips/Fast-ISel/icmpi1.ll [new file with mode: 0644]
test/CodeGen/Mips/Fast-ISel/sel1.ll

index 3b0edfe0b632e5ec977b53f38800720c14eeda53..7b39507812edc07ac30a3fc043a565e45fbbe315 100644 (file)
@@ -2062,6 +2062,10 @@ unsigned MipsFastISel::getRegEnsuringSimpleIntegerWidening(const Value *V,
   if (VReg == 0)
     return 0;
   MVT VMVT = TLI.getValueType(DL, V->getType(), true).getSimpleVT();
+
+  if (VMVT == MVT::i1)
+    return 0;
+
   if ((VMVT == MVT::i8) || (VMVT == MVT::i16)) {
     unsigned TempReg = createResultReg(&Mips::GPR32RegClass);
     if (!emitIntExt(VMVT, VReg, MVT::i32, TempReg, IsUnsigned))
diff --git a/test/CodeGen/Mips/Fast-ISel/icmpi1.ll b/test/CodeGen/Mips/Fast-ISel/icmpi1.ll
new file mode 100644 (file)
index 0000000..97d4eb8
--- /dev/null
@@ -0,0 +1,14 @@
+; RUN: llc -march=mipsel -relocation-model=pic -O0 -fast-isel=true -mcpu=mips32r2 \
+; RUN:     < %s -verify-machineinstrs | FileCheck %s
+
+
+define zeroext i1 @foo(i8* nocapture readonly) {
+; CHECK-LABEL: foo
+; CHECK:         lbu $[[REG0:[0-9]+]], 0($4)
+; CHECK-NEXT:    xori $[[REG1:[0-9]+]], $[[REG0]], 1
+; CHECK-NEXT:    andi $2, $[[REG1]], 1
+  %2 = load i8, i8* %0, align 1
+  %3 = trunc i8 %2 to i1
+  %4 = icmp ne i1 %3, true
+  ret i1 %4
+}
index 04d94eed77a14e1b6c0ad7052e5b97085c620e8c..90446ed339a17429a0f106f2a684243bb15676f4 100644 (file)
@@ -7,13 +7,12 @@ define i1 @sel_i1(i1 %j, i1 %k, i1 %l) {
 ; CHECK-LABEL: sel_i1:
 ; CHECK:       # %bb.0: # %entry
 ; CHECK-NEXT:    xor $1, $4, $zero
-; CHECK-NEXT:    sltu $1, $zero, $1
 ; CHECK-NEXT:    andi $1, $1, 1
 ; CHECK-NEXT:    movn $6, $5, $1
 ; CHECK-NEXT:    jr $ra
 ; CHECK-NEXT:    move $2, $6
 entry:
-  %cond = icmp ne i1 %j, 0
+  %cond = xor i1 %j, false
   %res = select i1 %cond, i1 %k, i1 %l
   ret i1 %res
 }