[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