diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -6197,9 +6197,9 @@ std::swap(N1, N2); } else { switch (Opcode) { - case ISD::SIGN_EXTEND_INREG: case ISD::SUB: return getUNDEF(VT); // fold op(undef, arg2) -> undef + case ISD::SIGN_EXTEND_INREG: case ISD::UDIV: case ISD::SDIV: case ISD::UREM: diff --git a/llvm/test/CodeGen/AArch64/pr55178.ll b/llvm/test/CodeGen/AArch64/pr55178.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/pr55178.ll @@ -0,0 +1,20 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu | FileCheck %s + +; This used to generate incorrect code because we sign extended +; the undef to undef instead of to 0. + +define i1 @test14(i8 %X) { +; CHECK-LABEL: test14: +; CHECK: // %bb.0: +; CHECK-NEXT: mov w8, #-113 +; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0 +; CHECK-NEXT: lsl w8, w8, w0 +; CHECK-NEXT: sxtb w8, w8 +; CHECK-NEXT: cmp w8, #0 +; CHECK-NEXT: cset w0, gt +; CHECK-NEXT: ret + %1 = shl i8 -113, %X + %cmp = icmp slt i8 undef, %1 + ret i1 %cmp +} diff --git a/llvm/test/CodeGen/SystemZ/regcoal_remat_empty_subrange.ll b/llvm/test/CodeGen/SystemZ/regcoal_remat_empty_subrange.ll --- a/llvm/test/CodeGen/SystemZ/regcoal_remat_empty_subrange.ll +++ b/llvm/test/CodeGen/SystemZ/regcoal_remat_empty_subrange.ll @@ -14,17 +14,15 @@ define void @main() { ; CHECK-LABEL: main: ; CHECK: # %bb.0: +; CHECK-NEXT: larl %r2, g_151 ; CHECK-NEXT: lhi %r0, 1 -; CHECK-NEXT: larl %r1, g_151 -; CHECK-NEXT: lghi %r3, 0 -; CHECK-NEXT: chi %r0, 0 -; CHECK-NEXT: locghile %r3, 1 -; CHECK-NEXT: o %r0, 0(%r1) -; CHECK-NEXT: dsgfr %r2, %r0 -; CHECK-NEXT: larl %r1, g_222 -; CHECK-NEXT: lghi %r5, 0 -; CHECK-NEXT: stgrl %r2, g_39 -; CHECK-NEXT: stc %r5, 19(%r1) +; CHECK-NEXT: o %r0, 0(%r2) +; CHECK-NEXT: lghi %r1, 1 +; CHECK-NEXT: larl %r2, g_222 +; CHECK-NEXT: dsgfr %r0, %r0 +; CHECK-NEXT: lghi %r1, 0 +; CHECK-NEXT: stgrl %r0, g_39 +; CHECK-NEXT: stc %r1, 19(%r2) ; CHECK-NEXT: br %r14 %tmp = load i32, i32* @g_151, align 4 %tmp3 = or i32 %tmp, 1