[PATCH] D37069: [x86] use the IR type of formal args to create assertzext/assertsext and scalar truncate nodes

Sanjay Patel via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 24 06:07:53 PDT 2017


spatel added inline comments.


================
Comment at: lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:8734
 
         ArgValues.push_back(getCopyFromParts(DAG, dl, &InVals[i], NumParts,
                                              PartVT, VT, nullptr, AssertOp,
----------------
aaboud wrote:
> spatel wrote:
> > aaboud wrote:
> > > Do we still need this?
> > > It is the reason for the second AssertZext instruction.
> > I don't think we'll get the 2nd assert for the affected tests with this patch because we trunc to i1, but let me know if you're seeing something else.
> > 
> > But yes, we do need this code - or at least there's some other change needed to account for that part. If I just don't set AssertOp, we'll get these x86 test fails and from what I saw it's because we need extra masking ops without the assert:
> > Failing Tests (5):
> >     LLVM :: CodeGen/X86/bool-zext.ll
> >     LLVM :: CodeGen/X86/illegal-bitfield-loadstore.ll
> >     LLVM :: CodeGen/X86/negate-i1.ll
> >     LLVM :: CodeGen/X86/sext-i1.ll
> >     LLVM :: CodeGen/X86/tail-call-casts.ll
> > 
> I was using this test to debug the second AssertSext:
> 
> 
> ```
> target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
> 
> 
> define i32  @sbar(i1 signext %a) {
>  %b = xor i1 %a, 1
>  %sext = sext i1 %b to i32
>  ret i32 %sext
> }
> ```
> 
> command line:
> llc -mtriple=x86_64-unknown-unknown -o - 
> 
> DAG after this line:
> 
> ```
> SelectionDAG has 9 nodes:
>             t0: ch = EntryToken
>           t2: i32,ch = CopyFromReg t0, Register:i32 %vreg0
>         t4: i32 = AssertSext t2, ValueType:ch:i8
>       t5: i8 = truncate t4
>     t7: i8 = AssertSext t5, ValueType:ch:i1
>   t8: i1 = truncate t7
>   t0: ch = EntryToken
> ```
Yes - that's exactly the case that this patch should be hitting. I see:
Creating new node: t4: i32 = AssertSext t2, ValueType:ch:i1
Creating new node: t5: i1 = truncate t4
...so there's no extra trunc+assertzext with this patch. You're not seeing that?


https://reviews.llvm.org/D37069





More information about the llvm-commits mailing list