Index: lib/Target/X86/X86ISelLowering.cpp =================================================================== --- lib/Target/X86/X86ISelLowering.cpp +++ lib/Target/X86/X86ISelLowering.cpp @@ -20299,7 +20299,7 @@ SDValue Sum = DAG.getNode(X86ISD::UMUL, DL, VTs, LHS, RHS); SDValue SetCC = - DAG.getNode(X86ISD::SETCC, DL, MVT::i8, + DAG.getNode(X86ISD::SETCC, DL, N->getValueType(1), DAG.getConstant(X86::COND_O, DL, MVT::i32), SDValue(Sum.getNode(), 2)); Index: test/CodeGen/X86/xaluo.ll =================================================================== --- test/CodeGen/X86/xaluo.ll +++ test/CodeGen/X86/xaluo.ll @@ -1,6 +1,6 @@ ; RUN: llc -mtriple=x86_64-darwin-unknown < %s | FileCheck %s --check-prefix=CHECK --check-prefix=SDAG ; RUN: llc -mtriple=x86_64-darwin-unknown -fast-isel -fast-isel-abort=1 < %s | FileCheck %s --check-prefix=CHECK --check-prefix=FAST - +; RUN: llc -mtriple=x86_64-darwin-unknown -mcpu=knl < %s | FileCheck %s --check-prefix=KNL ; ; Get the actual value of the overflow bit. ; @@ -734,6 +734,25 @@ ret i1 true } +define i1 @bug27873(i64 %c1, i1 %c2) { +; KNL-LABEL: bug27873: +; KNL: ## BB#0: +; KNL-NEXT: andl $1, %esi +; KNL-NEXT: movl $160, %ecx +; KNL-NEXT: movq %rdi, %rax +; KNL-NEXT: mulq %rcx +; KNL-NEXT: kmovw %esi, %k0 +; KNL-NEXT: seto %al +; KNL-NEXT: kmovw %eax, %k1 +; KNL-NEXT: korw %k1, %k0, %k0 +; KNL-NEXT: kmovw %k0, %eax +; KNL-NEXT: retq + %mul = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %c1, i64 160) + %mul.overflow = extractvalue { i64, i1 } %mul, 1 + %x1 = or i1 %c2, %mul.overflow + ret i1 %x1 +} + declare {i8, i1} @llvm.sadd.with.overflow.i8 (i8, i8 ) nounwind readnone declare {i16, i1} @llvm.sadd.with.overflow.i16(i16, i16) nounwind readnone declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone