diff --git a/lib/Target/Mips/MipsConstantIslandPass.cpp b/lib/Target/Mips/MipsConstantIslandPass.cpp index 63d07f35478..f3a61e84cb7 100644 --- a/lib/Target/Mips/MipsConstantIslandPass.cpp +++ b/lib/Target/Mips/MipsConstantIslandPass.cpp @@ -1275,6 +1275,10 @@ bool MipsConstantIslands::handleConstantPoolUser(unsigned CPUserIndex) { // Decrement the old entry, and remove it if refcount becomes 0. decrementCPEReferenceCount(CPI, CPEMI); + // No existing clone of this CPE is within range. + // We will be generating a new clone. Get a UID for it. + unsigned ID = createPICLabelUId(); + // Now that we have an island to add the CPE to, clone the original CPE and // add it to the island. U.HighWaterMark = NewIsland; @@ -1290,9 +1294,7 @@ bool MipsConstantIslands::handleConstantPoolUser(unsigned CPUserIndex) { BBInfo[NewIsland->getNumber()].Size += Size; adjustBBOffsetsAfter(llvm::prior(MachineFunction::iterator(NewIsland))); - // No existing clone of this CPE is within range. - // We will be generating a new clone. Get a UID for it. - unsigned ID = createPICLabelUId(); + // Finally, change the CPI in the instruction operand to be ID. for (unsigned i = 0, e = UserMI->getNumOperands(); i != e; ++i) diff --git a/test/CodeGen/Mips/ci2.ll b/test/CodeGen/Mips/ci2.ll new file mode 100644 index 00000000000..7187f0c7588 --- /dev/null +++ b/test/CodeGen/Mips/ci2.ll @@ -0,0 +1,39 @@ +; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -soft-float -mips16-hard-float -relocation-model=static -mips16-constant-islands < %s | FileCheck %s -check-prefix=constisle + +@i = common global i32 0, align 4 +@b = common global i32 0, align 4 +@l = common global i32 0, align 4 + +; Function Attrs: nounwind +define void @foo() #0 { +entry: + store i32 305419896, i32* @i, align 4 + %0 = load i32* @b, align 4 + %tobool = icmp ne i32 %0, 0 + br i1 %tobool, label %if.then, label %if.else + +if.then: ; preds = %entry + store i32 10, i32* @b, align 4 + br label %if.end + +if.else: ; preds = %entry + store i32 20, i32* @b, align 4 + br label %if.end + +if.end: ; preds = %if.else, %if.then + call void asm sideeffect ".space 100000", ""() #1, !srcloc !1 + store i32 305419896, i32* @l, align 4 + ret void +; constisle: $CPI0_1: +; constisle .4byte 305419896 # 0x12345678 +; constisle #APP +; constisle .space 100000 +; constisle #NO_APP +; constisle $CPI0_0: +; constisle .4byte 305419896 # 0x12345678 +} + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind } + +!1 = metadata !{i32 103}