Index: lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp =================================================================== --- lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -819,32 +819,15 @@ // FIXME: We capture more information than the dag can represent. For // now, just use the tightest assertzext/assertsext possible. - bool isSExt = true; + bool isSExt; EVT FromVT(MVT::Other); - if (NumSignBits == RegSize) { - isSExt = true; // ASSERT SEXT 1 - FromVT = MVT::i1; - } else if (NumZeroBits >= RegSize - 1) { - isSExt = false; // ASSERT ZEXT 1 - FromVT = MVT::i1; - } else if (NumSignBits > RegSize - 8) { - isSExt = true; // ASSERT SEXT 8 - FromVT = MVT::i8; - } else if (NumZeroBits >= RegSize - 8) { - isSExt = false; // ASSERT ZEXT 8 - FromVT = MVT::i8; - } else if (NumSignBits > RegSize - 16) { - isSExt = true; // ASSERT SEXT 16 - FromVT = MVT::i16; - } else if (NumZeroBits >= RegSize - 16) { - isSExt = false; // ASSERT ZEXT 16 - FromVT = MVT::i16; - } else if (NumSignBits > RegSize - 32) { - isSExt = true; // ASSERT SEXT 32 - FromVT = MVT::i32; - } else if (NumZeroBits >= RegSize - 32) { - isSExt = false; // ASSERT ZEXT 32 - FromVT = MVT::i32; + if (NumZeroBits) { + FromVT = EVT::getIntegerVT(*DAG.getContext(), RegSize - NumZeroBits); + isSExt = false; + } else if (NumSignBits > 1) { + FromVT = + EVT::getIntegerVT(*DAG.getContext(), RegSize - NumSignBits + 1); + isSExt = true; } else { continue; } Index: lib/Target/Hexagon/HexagonISelLowering.cpp =================================================================== --- lib/Target/Hexagon/HexagonISelLowering.cpp +++ lib/Target/Hexagon/HexagonISelLowering.cpp @@ -836,7 +836,7 @@ SDValue Op = N.getOperand(0); if (Op.getOpcode() != ISD::AssertSext) return false; - MVT OrigTy = cast(Op.getOperand(1))->getVT().getSimpleVT(); + EVT OrigTy = cast(Op.getOperand(1))->getVT(); unsigned ThisBW = ty(N).getSizeInBits(); unsigned OrigBW = OrigTy.getSizeInBits(); // The type that was sign-extended to get the AssertSext must be Index: test/CodeGen/AMDGPU/frame-index-elimination.ll =================================================================== --- test/CodeGen/AMDGPU/frame-index-elimination.ll +++ test/CodeGen/AMDGPU/frame-index-elimination.ll @@ -140,7 +140,7 @@ ; GCN: s_and_saveexec_b64 ; CI: v_add_i32_e32 v0, vcc, 4, [[ADD]] -; CI: buffer_load_dword v1, v0, s[0:3], s4 offen{{$}} +; CI: buffer_load_dword v1, v1, s[0:3], s4 offen offset:4{{$}} ; GFX9: v_add_u32_e32 v0, 4, [[ADD]] ; GFX9: buffer_load_dword v1, v{{[0-9]+}}, s[0:3], s4 offen offset:4{{$}} Index: test/CodeGen/Thumb/i8-phi-ext.ll =================================================================== --- /dev/null +++ test/CodeGen/Thumb/i8-phi-ext.ll @@ -0,0 +1,21 @@ +; RUN: llc < %s | FileCheck %s + +target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" +target triple = "thumbv6m---eabi" + +; CHECK-LABEL: test_fn +; CHECK-NOT: uxtb +define dso_local zeroext i8 @test_fn(i32 %x, void (...)* nocapture %f) { +entry: + %tobool = icmp eq i32 %x, 0 + br i1 %tobool, label %if.end, label %if.then + +if.then: ; preds = %entry + %callee.knr.cast = bitcast void (...)* %f to void ()* + tail call void %callee.knr.cast() #1 + br label %if.end + +if.end: ; preds = %entry, %if.then + %z.0 = phi i8 [ 3, %if.then ], [ 0, %entry ] + ret i8 %z.0 +} Index: test/CodeGen/X86/pr32282.ll =================================================================== --- test/CodeGen/X86/pr32282.ll +++ test/CodeGen/X86/pr32282.ll @@ -65,7 +65,7 @@ ; X64-NEXT: # %bb.2: ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: xorl %edx, %edx -; X64-NEXT: idivq %rcx +; X64-NEXT: divq %rcx ; X64-NEXT: jmp .LBB0_3 ; X64-NEXT: .LBB0_1: ; X64-NEXT: xorl %eax, %eax