[CodeGenPrepare] Use APInt to check the value of the immediate in a and
authorQuentin Colombet <qcolombet@apple.com>
Tue, 22 Apr 2014 01:20:34 +0000 (01:20 +0000)
committerQuentin Colombet <qcolombet@apple.com>
Tue, 22 Apr 2014 01:20:34 +0000 (01:20 +0000)
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

lib/CodeGen/CodeGenPrepare.cpp
test/CodeGen/ARM64/bitfield-extract.ll

index 27fdd5187bdfa35c7f9b9782ca49f556fd8a9c28..573e3d7b8cd2924aa3105553c94b44e85780e29b 100644 (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;
index 4a62cfaf7fca37cea3299027935fc64248b1caf0..4ddd36c523345cb013a03d13d34ebe1dcf7d57e5 100644 (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
+}