[llvm] r258366 - [SelectionDAG] Fix constant offset folding to avoid commuting non-commutative operators.

Dan Gohman via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 20 15:16:59 PST 2016


Author: djg
Date: Wed Jan 20 17:16:59 2016
New Revision: 258366

URL: http://llvm.org/viewvc/llvm-project?rev=258366&view=rev
Log:
[SelectionDAG] Fix constant offset folding to avoid commuting non-commutative operators.

This fixes a miscompile in MultiSource/Benchmarks/MiBench/consumer-lame
introduced in r258296.

Added:
    llvm/trunk/test/CodeGen/X86/negative-offset.ll
Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=258366&r1=258365&r2=258366&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Wed Jan 20 17:16:59 2016
@@ -3312,8 +3312,9 @@ SDValue SelectionDAG::FoldConstantArithm
   // fold (add Sym, c) -> Sym+c
   if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(Cst1))
     return FoldSymbolOffset(Opcode, VT, GA, Cst2);
-  if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(Cst2))
-    return FoldSymbolOffset(Opcode, VT, GA, Cst1);
+  if (isCommutativeBinOp(Opcode))
+    if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(Cst2))
+      return FoldSymbolOffset(Opcode, VT, GA, Cst1);
 
   // For vectors extract each constant element into Inputs so we can constant
   // fold them individually.

Added: llvm/trunk/test/CodeGen/X86/negative-offset.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/negative-offset.ll?rev=258366&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/negative-offset.ll (added)
+++ llvm/trunk/test/CodeGen/X86/negative-offset.ll Wed Jan 20 17:16:59 2016
@@ -0,0 +1,18 @@
+; RUN: llc < %s -asm-verbose=false | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+; Test that a constant consisting of a global symbol with a negative offset
+; is properly folded and isel'd.
+
+; CHECK-LABEL: negative_offset:
+; CHECK: movl   $G, %eax
+; CHECK: notq   %rax
+; CHECK: addq   %rdi, %rax
+; CHECK: retq
+ at G = external global [8 x i32]
+define i8* @negative_offset(i8* %a) {
+  %t = getelementptr i8, i8* %a, i64 sub (i64 -1, i64 ptrtoint ([8 x i32]* @G to i64))
+  ret i8* %t
+}




More information about the llvm-commits mailing list