Fix an edge case involving branches in fast-isel on x86.
authorEli Friedman <eli.friedman@gmail.com>
Wed, 27 Apr 2011 01:34:27 +0000 (01:34 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Wed, 27 Apr 2011 01:34:27 +0000 (01:34 +0000)
rdar://problem/9303306 .

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

lib/Target/X86/X86FastISel.cpp
test/CodeGen/X86/fast-isel-i1.ll

index b35ec0d3a3f9154fb28ab42583258bc808ab2eaf..257b4741ceef4329bbac0fc3d8109f447421414f 100644 (file)
@@ -1098,11 +1098,13 @@ bool X86FastISel::X86SelectBranch(const Instruction *I) {
   }
 
   // Otherwise do a clumsy setcc and re-test it.
+  // Note that i1 essentially gets ANY_EXTEND'ed to i8 where it isn't used
+  // in an explicit cast, so make sure to handle that correctly.
   unsigned OpReg = getRegForValue(BI->getCondition());
   if (OpReg == 0) return false;
 
-  BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(X86::TEST8rr))
-    .addReg(OpReg).addReg(OpReg);
+  BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(X86::TEST8ri))
+    .addReg(OpReg).addImm(1);
   BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(X86::JNE_4))
     .addMBB(TrueMBB);
   FastEmitBranch(FalseMBB, DL);
index d0665783ce6462fd97d43a53645b9e42e7883038..5d572c1de500779c6a7b5b042702de498b2a96ab 100644 (file)
@@ -1,19 +1,40 @@
-; RUN: llc < %s -march=x86 -fast-isel | grep {andb     \$1, %}
+; RUN: llc < %s -march=x86 -fast-isel | FileCheck %s
 
-declare i64 @bar(i64)
+declare i64 @test1a(i64)
 
-define i32 @foo(i64 %x) nounwind {
-       %y = add i64 %x, -3             ; <i64> [#uses=1]
-       %t = call i64 @bar(i64 %y)              ; <i64> [#uses=1]
-       %s = mul i64 %t, 77             ; <i64> [#uses=1]
-       %z = trunc i64 %s to i1         ; <i1> [#uses=1]
+define i32 @test1(i64 %x) nounwind {
+; CHECK: test1:
+; CHECK: andb $1, %
+       %y = add i64 %x, -3
+       %t = call i64 @test1a(i64 %y)
+       %s = mul i64 %t, 77
+       %z = trunc i64 %s to i1
        br label %next
 
 next:          ; preds = %0
-       %u = zext i1 %z to i32          ; <i32> [#uses=1]
-       %v = add i32 %u, 1999           ; <i32> [#uses=1]
+       %u = zext i1 %z to i32
+       %v = add i32 %u, 1999
        br label %exit
 
 exit:          ; preds = %next
        ret i32 %v
 }
+
+define void @test2(i8* %a) nounwind {
+entry:
+; CHECK: test2:
+; CHECK: movb {{.*}} %al
+; CHECK-NEXT: xorb $1, %al
+; CHECK-NEXT: testb $1
+  %tmp = load i8* %a, align 1
+  %tobool = trunc i8 %tmp to i1
+  %tobool2 = xor i1 %tobool, true
+  br i1 %tobool2, label %if.then, label %if.end
+
+if.then:
+  call void @test2(i8* null)
+  br label %if.end
+
+if.end:
+  ret void
+}