summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin Colombet <qcolombet@apple.com>2014-04-22 01:20:34 +0000
committerQuentin Colombet <qcolombet@apple.com>2014-04-22 01:20:34 +0000
commit8959c39450b6fd86ba6556b0ccdb8c260f8a93a4 (patch)
tree4c94f9fa80160f1497b6a11b7af7e184adcdeed9
parentbb67355af8ca3a546d286cb682ee3054cda3cf87 (diff)
downloadllvm-8959c39450b6fd86ba6556b0ccdb8c260f8a93a4.tar.gz
llvm-8959c39450b6fd86ba6556b0ccdb8c260f8a93a4.tar.bz2
llvm-8959c39450b6fd86ba6556b0ccdb8c260f8a93a4.tar.xz
[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
-rw-r--r--lib/CodeGen/CodeGenPrepare.cpp4
-rw-r--r--test/CodeGen/ARM64/bitfield-extract.ll23
2 files changed, 25 insertions, 2 deletions
diff --git a/lib/CodeGen/CodeGenPrepare.cpp b/lib/CodeGen/CodeGenPrepare.cpp
index 27fdd5187b..573e3d7b8c 100644
--- a/lib/CodeGen/CodeGenPrepare.cpp
+++ b/lib/CodeGen/CodeGenPrepare.cpp
@@ -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;
diff --git a/test/CodeGen/ARM64/bitfield-extract.ll b/test/CodeGen/ARM64/bitfield-extract.ll
index 4a62cfaf7f..4ddd36c523 100644
--- a/test/CodeGen/ARM64/bitfield-extract.ll
+++ b/test/CodeGen/ARM64/bitfield-extract.ll
@@ -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
+}