diff --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp --- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -2729,7 +2729,10 @@ return false; Optional CR = GA->getGlobal()->getAbsoluteSymbolRange(); - return CR && CR->getSignedMin().sge(-1ull << Width) && + if (!CR) + return Width == 32 && TM.getCodeModel() == CodeModel::Small; + + return CR->getSignedMin().sge(-1ull << Width) && CR->getSignedMax().slt(1ull << Width); } @@ -3123,7 +3126,7 @@ bool IsNegOne = isAllOnesConstant(StoredVal.getOperand(1)); // ADD/SUB with 1/-1 and carry flag isn't used can use inc/dec. if ((IsOne || IsNegOne) && hasNoCarryFlagUses(StoredVal.getValue(1))) { - unsigned NewOpc = + unsigned NewOpc = ((Opc == X86ISD::ADD) == IsOne) ? SelectOpcode(X86::INC64m, X86::INC32m, X86::INC16m, X86::INC8m) : SelectOpcode(X86::DEC64m, X86::DEC32m, X86::DEC16m, X86::DEC8m); diff --git a/llvm/test/CodeGen/X86/br-fold.ll b/llvm/test/CodeGen/X86/br-fold.ll --- a/llvm/test/CodeGen/X86/br-fold.ll +++ b/llvm/test/CodeGen/X86/br-fold.ll @@ -7,7 +7,7 @@ ; X64_DARWIN: orq ; X64_DARWIN-NEXT: ud2 -; X64_LINUX: orq %rax, %rcx +; X64_LINUX: orq $_ZN11xercesc_2_56XMLUni16fgNotationStringE, %rax ; X64_LINUX-NEXT: jne ; X64_LINUX-NEXT: %bb8.i329 @@ -18,7 +18,7 @@ ; X64_WINDOWS_GNU: orq .refptr._ZN11xercesc_2_56XMLUni16fgNotationStringE(%rip), %rax ; X64_WINDOWS_GNU-NEXT: jne -; PS4: orq %rax, %rcx +; PS4: orq $_ZN11xercesc_2_56XMLUni16fgNotationStringE, %rax ; PS4-NEXT: ud2 @_ZN11xercesc_2_513SchemaSymbols21fgURI_SCHEMAFORSCHEMAE = external constant [33 x i16], align 32 ; <[33 x i16]*> [#uses=1] diff --git a/llvm/test/CodeGen/X86/critical-edge-split-2.ll b/llvm/test/CodeGen/X86/critical-edge-split-2.ll --- a/llvm/test/CodeGen/X86/critical-edge-split-2.ll +++ b/llvm/test/CodeGen/X86/critical-edge-split-2.ll @@ -15,18 +15,18 @@ ; CHECK-NEXT: testl %edi, %edi ; CHECK-NEXT: jne .LBB0_2 ; CHECK-NEXT: # %bb.1: # %cond.false.i -; CHECK-NEXT: movl $g_4, %eax -; CHECK-NEXT: movl $g_2+4, %ecx -; CHECK-NEXT: xorl %esi, %esi -; CHECK-NEXT: cmpq %rax, %rcx -; CHECK-NEXT: sete %sil +; CHECK-NEXT: movl $g_2+4, %eax +; CHECK-NEXT: xorl %ecx, %ecx +; CHECK-NEXT: cmpq $g_4, %rax +; CHECK-NEXT: sete %cl ; CHECK-NEXT: movl $1, %eax ; CHECK-NEXT: xorl %edx, %edx -; CHECK-NEXT: divl %esi +; CHECK-NEXT: divl %ecx ; CHECK-NEXT: movl %edx, %eax ; CHECK-NEXT: .LBB0_2: # %cond.end.i ; CHECK-NEXT: # kill: def $ax killed $ax killed $eax ; CHECK-NEXT: retq + entry: br i1 %C, label %cond.end.i, label %cond.false.i diff --git a/llvm/test/CodeGen/X86/pr33290.ll b/llvm/test/CodeGen/X86/pr33290.ll --- a/llvm/test/CodeGen/X86/pr33290.ll +++ b/llvm/test/CodeGen/X86/pr33290.ll @@ -22,17 +22,16 @@ ; X64-LABEL: e: ; X64: # %bb.0: # %entry ; X64-NEXT: movq {{.*}}(%rip), %rax -; X64-NEXT: movl $a, %esi ; X64-NEXT: .p2align 4, 0x90 ; X64-NEXT: .LBB0_1: # %for.cond ; X64-NEXT: # =>This Inner Loop Header: Depth=1 -; X64-NEXT: movzbl {{.*}}(%rip), %edx -; X64-NEXT: addq %rsi, %rdx -; X64-NEXT: setb %cl -; X64-NEXT: addq $2, %rdx -; X64-NEXT: adcb $0, %cl -; X64-NEXT: movb %cl, {{.*}}(%rip) -; X64-NEXT: movl %edx, (%rax) +; X64-NEXT: movzbl {{.*}}(%rip), %ecx +; X64-NEXT: addq $a, %rcx +; X64-NEXT: setb %dl +; X64-NEXT: addq $2, %rcx +; X64-NEXT: adcb $0, %dl +; X64-NEXT: movb %dl, {{.*}}(%rip) +; X64-NEXT: movl %ecx, (%rax) ; X64-NEXT: jmp .LBB0_1 entry: %0 = load i32*, i32** @b, align 8 diff --git a/llvm/test/CodeGen/X86/relocimm-small-model.ll b/llvm/test/CodeGen/X86/relocimm-small-model.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/X86/relocimm-small-model.ll @@ -0,0 +1,25 @@ +; RUN: llc < %s | FileCheck %s --check-prefix=CHECK-SMALL +; RUN: llc --code-model=medium < %s | FileCheck %s --check-prefix=CHECK-MEDIUM + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@a = external dso_local global i32, align 4 + +declare void @f() + +define void @foo(i64 %b) { +; CHECK-MEDIUM: cmpq %rax, %rdi +; CHECK-SMALL: cmpq $a, %rdi +entry: + %cmp = icmp eq i64 %b, ptrtoint (i32* @a to i64) + br i1 %cmp, label %if.then, label %if.end + +if.then: ; preds = %entry + tail call void @f() + br label %if.end + +if.end: ; preds = %if.then, %entry + ret void +} +