This fixes an issue with matching trunc -> assertsext -> zext on x86-64, which would not zero the high 32-bits. See PR20494 for details.
Recommitting - This time, with a hopefully working test.
Differential Revision: http://reviews.llvm.org/D6128
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221672
91177308-0d34-0410-b5e6-
96231b3b80d8
return N->getOpcode() != ISD::TRUNCATE &&
N->getOpcode() != TargetOpcode::EXTRACT_SUBREG &&
N->getOpcode() != ISD::CopyFromReg &&
+ N->getOpcode() != ISD::AssertSext &&
N->getOpcode() != X86ISD::CMOV;
}]>;
--- /dev/null
+; RUN: llc < %s -O2 -march=x86-64 | FileCheck %s\r
+; Checks that a zeroing mov is inserted for the trunc/zext pair even when\r
+; the source of the zext is an AssertSext node\r
+; PR20494\r
+\r
+define i64 @main(i64 %a) { \r
+; CHECK-LABEL: main\r
+; CHECK: movl %e{{..}}, %eax\r
+; CHECK: ret\r
+ %or = or i64 %a, -2\r
+ %trunc = trunc i64 %or to i32\r
+ br label %l\r
+l:\r
+ %ext = zext i32 %trunc to i64\r
+ ret i64 %ext\r
+}\r