[CodeGenPrepare] Use APInt to check the value of the immediate in a and

while checking candidate for bit field extract.
Otherwise the value may not fit in uint64_t and this will trigger an
assertion.

This fixes PR19503.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206834 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Quentin Colombet 2014-04-22 01:20:34 +00:00
parent bb67355af8
commit 8959c39450
2 changed files with 25 additions and 2 deletions

View File

@ -639,9 +639,9 @@ bool isExtractBitsCandidateUse(Instruction *User) {
!isa<ConstantInt>(User->getOperand(1)))
return false;
unsigned Cimm = dyn_cast<ConstantInt>(User->getOperand(1))->getZExtValue();
const APInt &Cimm = cast<ConstantInt>(User->getOperand(1))->getValue();
if (Cimm & (Cimm + 1))
if ((Cimm & (Cimm + 1)).getBoolValue())
return false;
}
return true;

View File

@ -477,3 +477,26 @@ return: ; preds = %if.end13, %if.then1
%retval.0 = phi i32 [ %conv, %if.then ], [ %add, %if.then7 ], [ %add23, %if.then17 ], [ 64, %if.end13 ]
ret i32 %retval.0
}
; Make sure we do not assert if the immediate in and is bigger than i64.
; PR19503.
; OPT-LABEL: @fct20
; OPT: lshr
; OPT-NOT: lshr
; OPT: ret
; CHECK-LABEL: fct20:
; CHECK: ret
define i80 @fct20(i128 %a, i128 %b) {
entry:
%shr = lshr i128 %a, 18
%conv = trunc i128 %shr to i80
%tobool = icmp eq i128 %b, 0
br i1 %tobool, label %then, label %end
then:
%and = and i128 %shr, 483673642326615442599424
%conv2 = trunc i128 %and to i80
br label %end
end:
%conv3 = phi i80 [%conv, %entry], [%conv2, %then]
ret i80 %conv3
}