Fix isa<> check which could never be true.

It was incorrectly checking a Function* being an IntrinsicInst* which
isn't possible.  It should always have been checking the CallInst* instead.

Added test case for x86 which ensures we only get one constant load.
It was 2 before this change.

rdar://problem/13267920

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175853 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Pete Cooper 2013-02-22 01:50:38 +00:00
parent 667754e239
commit b704ffbb46
2 changed files with 33 additions and 1 deletions

View File

@ -705,7 +705,7 @@ bool FastISel::SelectCall(const User *I) {
// all the values which have already been materialized,
// appear after the call. It also makes sense to skip intrinsics
// since they tend to be inlined.
if (!isa<IntrinsicInst>(F))
if (!isa<IntrinsicInst>(Call))
flushLocalValueMap();
// An arbitrary call. Bail.

View File

@ -0,0 +1,32 @@
; RUN: llc < %s -march=x86-64 -O0 | FileCheck %s
; Make sure fast-isel doesn't reset the materialised constant map
; across an intrinsic call.
; CHECK: movl $100000
; CHECK-NOT: movl $100000
define i1 @test1(i32 %v1, i32 %v2, i32* %X) nounwind {
entry:
%a = shl i32 100000, %v1
%t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %a, i32 %v2)
%ext = extractvalue {i32, i1} %t, 0
%sum = shl i32 100000, %ext
%obit = extractvalue {i32, i1} %t, 1
br i1 %obit, label %overflow, label %normal
normal:
store i32 %sum, i32* %X
br label %overflow
overflow:
ret i1 false
; X32: test4:
; X32: addl
; X32-NEXT: jo
; X64: test4:
; X64: addl %e[[A1:si|dx]], %e[[A0:di|cx]]
; X64-NEXT: jo
}
declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32)