[llvm] r204833 - Fix for incorrect address sinking in the presence of potential overflows.

Jim Grosbach grosbach at apple.com
Wed Mar 26 10:27:02 PDT 2014


Author: grosbach
Date: Wed Mar 26 12:27:01 2014
New Revision: 204833

URL: http://llvm.org/viewvc/llvm-project?rev=204833&view=rev
Log:
Fix for incorrect address sinking in the presence of potential overflows.

In some cases it is possible for CGP to attempt to reuse a base address from
another basic block. In those cases we have to be sure that all the address
math was either done at the same bit width, or that none of it overflowed
before it was extended.

Patch by Louis Gerbarg <lgg at apple.com>

rdar://16307442

Added:
    llvm/trunk/test/CodeGen/X86/sunkaddr-ext.ll
Modified:
    llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp

Modified: llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp?rev=204833&r1=204832&r2=204833&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp (original)
+++ llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp Wed Mar 26 12:27:01 2014
@@ -2438,7 +2438,14 @@ bool CodeGenPrepare::OptimizeMemoryInst(
                  cast<IntegerType>(V->getType())->getBitWidth()) {
         V = Builder.CreateTrunc(V, IntPtrTy, "sunkaddr");
       } else {
-        V = Builder.CreateSExt(V, IntPtrTy, "sunkaddr");
+        // It is only safe to sign extend the BaseReg if we know that the math
+        // required to create it did not overflow before we extend it. Since
+        // the original IR value was tossed in favor of a constant back when
+        // the AddrMode was created we need to bail out gracefully if widths
+        // do not match instead of extending it.
+        if (Result != AddrMode.BaseReg)
+            cast<Instruction>(Result)->eraseFromParent();
+        return false;
       }
       if (AddrMode.Scale != 1)
         V = Builder.CreateMul(V, ConstantInt::get(IntPtrTy, AddrMode.Scale),

Added: llvm/trunk/test/CodeGen/X86/sunkaddr-ext.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/sunkaddr-ext.ll?rev=204833&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/sunkaddr-ext.ll (added)
+++ llvm/trunk/test/CodeGen/X86/sunkaddr-ext.ll Wed Mar 26 12:27:01 2014
@@ -0,0 +1,26 @@
+; RUN: llc < %s | FileCheck %s
+
+; Test to make sure that if math that can roll over has been used we don't
+; use the potential overflow as the basis for an address calculation later by
+; sinking it into a different basic block.
+
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.9.0"
+
+; Function Attrs: nounwind ssp uwtable
+define void @test_sink(i8* %arg1, i32 %arg2, i8 %arg3) #0 {
+  %tmp1 = add i32 -2147483648, %arg2
+  %tmp2 = add i32 -2147483648, %tmp1
+  %tmp3 = getelementptr i8* %arg1, i32 %arg2
+  br label %bb1
+
+bb1:
+  %tmp4 = getelementptr i8* %arg1, i32 %tmp2
+  store i8 %arg3, i8* %tmp4
+  ret void;
+}
+
+; CHECK-LABEL: test_sink:
+; CHECK:   movslq  %esi, [[TEMP:%[a-z0-9]+]]
+; CHECK:   movb    %dl, (%rdi,[[TEMP]])
+; CHECK:   retq





More information about the llvm-commits mailing list