[llvm] r341102 - [X86] Weaken an overly aggressive assert.

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 30 12:35:38 PDT 2018


Author: ctopper
Date: Thu Aug 30 12:35:38 2018
New Revision: 341102

URL: http://llvm.org/viewvc/llvm-project?rev=341102&view=rev
Log:
[X86] Weaken an overly aggressive assert.

This assert tried to check that AND constants are only on the RHS. But its possible for both operands to be constants if one is opaque which will prevent the AND from being constant folded.

Fixes PR38771

Added:
    llvm/trunk/test/CodeGen/X86/pr38771.ll
Modified:
    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp

Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=341102&r1=341101&r2=341102&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Thu Aug 30 12:35:38 2018
@@ -18035,7 +18035,13 @@ SDValue X86TargetLowering::EmitTest(SDVa
         if (!ZeroCheck)
           break;
 
-        assert(!isa<ConstantSDNode>(Op0) && "AND node isn't canonicalized");
+        // And with cosntant should be canonicalized unless we're dealing
+        // with opaque constants.
+        assert((!isa<ConstantSDNode>(Op0) ||
+                (isa<ConstantSDNode>(Op1) &&
+                 (cast<ConstantSDNode>(Op0)->isOpaque() ||
+                  cast<ConstantSDNode>(Op1)->isOpaque()))) &&
+               "AND node isn't canonicalized");
         auto *CN = dyn_cast<ConstantSDNode>(Op1);
         if (!CN)
           break;

Added: llvm/trunk/test/CodeGen/X86/pr38771.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pr38771.ll?rev=341102&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/pr38771.ll (added)
+++ llvm/trunk/test/CodeGen/X86/pr38771.ll Thu Aug 30 12:35:38 2018
@@ -0,0 +1,24 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
+
+define void @function() nounwind {
+; CHECK-LABEL: function:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    movabsq $281474976710656, %rax # imm = 0x1000000000000
+; CHECK-NEXT:    notq %rax
+; CHECK-NEXT:    movl $2147483647, %ecx # imm = 0x7FFFFFFF
+; CHECK-NEXT:    shldq $65, %rax, %rcx
+; CHECK-NEXT:    xorl %eax, %eax
+; CHECK-NEXT:    movb $64, %dl
+; CHECK-NEXT:    testb %dl, %dl
+; CHECK-NEXT:    cmoveq %rcx, %rax
+; CHECK-NEXT:    movq %rax, (%rax)
+; CHECK-NEXT:    movl $0, (%rax)
+; CHECK-NEXT:    retq
+entry:
+  %B68 = sub i96 39614081257132168796771975167, 281474976710656
+  %B49 = or i96 39614081257132168796771975167, 39614081257132168796771975167
+  %B33 = lshr i96 %B68, %B68
+  store i96 %B33, i96* undef
+  ret void
+}




More information about the llvm-commits mailing list