[llvm-bugs] [Bug 44902] New: i386 EXTRACT_VECTOR_ELT of v4i1 produces wrong code

via llvm-bugs llvm-bugs at lists.llvm.org
Thu Feb 13 13:45:26 PST 2020


https://bugs.llvm.org/show_bug.cgi?id=44902

            Bug ID: 44902
           Summary: i386 EXTRACT_VECTOR_ELT of v4i1 produces wrong code
           Product: new-bugs
           Version: trunk
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: new bugs
          Assignee: unassignedbugs at nondot.org
          Reporter: andrew at ziglang.org
                CC: htmldeveloper at gmail.com, llvm-bugs at lists.llvm.org

Reporting this on behalf of downstream bug
https://github.com/ziglang/zig/issues/4447 (reporter does not have a bugzilla
account; new account registration has been closed for years)

; ModuleID = 'foo'
source_filename = "foo"
target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
target triple = "i386-unknown-windows-msvc"

@0 = internal unnamed_addr constant <4 x i1> <i1 true, i1 false, i1 true, i1
false>, align 4

; Function Attrs: nobuiltin nounwind uwtable
define x86_stdcallcc void @WinMainCRTStartup() {
Entry:
  call fastcc void @fun(<4 x i1> <i1 true, i1 false, i1 true, i1 false>)
  ret void
}

; Function Attrs: nobuiltin nounwind uwtable
define internal fastcc void @fun(<4 x i1>) unnamed_addr {
Entry:
  %x = alloca <4 x i1>, align 4
  store <4 x i1> %0, <4 x i1>* %x, align 4
  %1 = load <4 x i1>, <4 x i1>* %x
  %2 = extractelement <4 x i1> %1, i32 0
  %3 = icmp ne i1 %2, true
  br i1 %3, label %Then, label %Else

Then:                                             ; preds = %Entry
  call void @llvm.debugtrap()
  br label %EndIf

Else:                                             ; preds = %Entry
  br label %EndIf

EndIf:                                            ; preds = %Else, %Then
  %4 = load <4 x i1>, <4 x i1>* %x
  %5 = extractelement <4 x i1> %4, i32 1
  %6 = icmp ne i1 %5, false
  br i1 %6, label %Then1, label %Else2

Then1:                                            ; preds = %EndIf
  call void @llvm.debugtrap()
  br label %EndIf3

Else2:                                            ; preds = %EndIf
  br label %EndIf3

EndIf3:                                           ; preds = %Else2, %Then1
  %7 = load <4 x i1>, <4 x i1>* %x
  %8 = extractelement <4 x i1> %7, i32 2
  %9 = icmp ne i1 %8, true
  br i1 %9, label %Then4, label %Else5

Then4:                                            ; preds = %EndIf3
  call void @llvm.debugtrap()
  br label %EndIf6

Else5:                                            ; preds = %EndIf3
  br label %EndIf6

EndIf6:                                           ; preds = %Else5, %Then4
  %10 = load <4 x i1>, <4 x i1>* %x
  %11 = extractelement <4 x i1> %10, i32 3
  %12 = icmp ne i1 %11, false
  br i1 %12, label %Then7, label %Else8

Then7:                                            ; preds = %EndIf6
  call void @llvm.debugtrap()
  br label %EndIf9

Else8:                                            ; preds = %EndIf6
  br label %EndIf9

EndIf9:                                           ; preds = %Else8, %Then7
  ret void
}

; Function Attrs: nounwind
declare void @llvm.debugtrap()




The extract_vector_elt (plus the any_extend I guess) is legalized as a
CopyToReg + and 1 as you can see below. I think the problem is only in the
evaluation of the and operand that shouldn't be always 1.


Initial selection DAG: %bb.3 'fun:EndIf'
SelectionDAG has 19 nodes:
  t0: ch = EntryToken
  t2: i32 = Constant<0>
    t4: v4i1,ch = load<(dereferenceable load 1 from %ir.x, align 4)> t0,
FrameIndex:i32<0>, undef:i32
  t6: i1 = extract_vector_elt t4, Constant:i32<1>
        t7: i8 = any_extend t6
      t9: ch = CopyToReg t0, Register:i8 %20, t7
        t12: i1 = setcc t6, Constant:i1<0>, setne:ch
      t14: i1 = xor t12, Constant:i1<-1>
    t16: ch = brcond t9, t14, BasicBlock:ch<Else2 0x5588bc3e3478>
  t18: ch = br t16, BasicBlock:ch<Then1 0x5588bc3e33b8>


Optimized lowered selection DAG: %bb.3 'fun:EndIf'
SelectionDAG has 16 nodes:
  t0: ch = EntryToken
    t4: v4i1,ch = load<(dereferenceable load 1 from %ir.x, align 4)> t0,
FrameIndex:i32<0>, undef:i32
  t6: i1 = extract_vector_elt t4, Constant:i32<1>
        t7: i8 = any_extend t6
      t9: ch = CopyToReg t0, Register:i8 %20, t7
      t20: i1 = setcc t6, Constant:i1<0>, seteq:ch
    t21: ch = brcond t9, t20, BasicBlock:ch<Else2 0x5588bc3e3478>
  t18: ch = br t21, BasicBlock:ch<Then1 0x5588bc3e33b8>


Type-legalized selection DAG: %bb.3 'fun:EndIf'
SelectionDAG has 16 nodes:
  t0: ch = EntryToken
  t32: i8,ch = load<(dereferenceable load 1 from %ir.x, align 4), anyext from
i1> t0, FrameIndex:i32<0>, undef:i32
      t9: ch = CopyToReg t0, Register:i8 %20, t32
          t28: i8 = and t32, Constant:i8<1>
        t26: i8 = setcc t28, Constant:i8<0>, seteq:ch
      t34: i8 = and t26, Constant:i8<1>
    t21: ch = brcond t9, t34, BasicBlock:ch<Else2 0x5588bc3e3478>
  t18: ch = br t21, BasicBlock:ch<Then1 0x5588bc3e33b8>

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20200213/24b0d335/attachment-0001.html>


More information about the llvm-bugs mailing list