OSDN Git Service

[X86] Fix a bug with fetch_add(INT32_MIN)
authorRobin Morisset <morisset@google.com>
Tue, 7 Oct 2014 23:53:57 +0000 (23:53 +0000)
committerRobin Morisset <morisset@google.com>
Tue, 7 Oct 2014 23:53:57 +0000 (23:53 +0000)
commit28127ffb510e58d8b52b389279aab05c8f99a590
tree0a9478f3ab3072ac8061612814fdad60e44a9073
parent806e08c5a002a8288a001350eb009679462b972d
[X86] Fix a bug with fetch_add(INT32_MIN)

Summary:
Fix pr21099

The pseudocode of what we were doing (spread through two functions) was:
if (operand.doesNotFitIn32Bits())
  Opc.initializeWithFoo();
if (operand < 0)
  operand = -operand;
if (operand.doesFitIn8Bits())
  Opc.initializeWithBar();
else if (operand.doesFitIn32Bits())
  Opc.initializeWithBlah();
doStuff(Opc);

So for operand == INT32_MIN, Opc was never initialized because the operand changes
from fitting in 32 bits to not fitting, causing the various bugs/error messages
noted by pr21099.

This patch adds an extra test at the beginning for this case, and an
llvm_unreachable to have better error message if the operand ends up
not fitting in 32-bits at the end.

Test Plan: new test + make check

Reviewers: jfb

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D5655

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219257 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/X86/X86ISelDAGToDAG.cpp
test/CodeGen/X86/pr21099.ll [new file with mode: 0644]