Skip to content

Loading a vector of i1 loads the wrong value #49286

Closed
@Joemalle

Description

@Joemalle
mannequin
Bugzilla Link 49942
Version 10.0
OS All
Blocks #30613
CC @RKSimon,@Nuullll

Extended Description

This program:

@&#8203;useFlag = private global <4 x i1> <i1 true, i1 true, i1 true, i1 true>


define i32 @&#8203;get(i32 %arg)  {
    %ld = load <4 x i1>, <4 x i1>* @&#8203;useFlag
    %zx = zext <4 x i1> %ld to <4 x i32>
    %ee = extractelement <4 x i32> %zx, i32 %arg
    ret i32 %ee
}

define i32 @&#8203;main() {
  %g = call i32 @&#8203;get(i32 2)
  ret i32 %g
}

will return 0. I'd expect it to return 1 since it should load i1 true and then zext that to i32 1.

Note that if you get(i32 0) then it returns 1 as expected. Also, with -O3 this returns 1 correctly since the load is optimized out.

Tested with:

$ clang-10 --version
clang version 10.0.0
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

Sorry if this is a duplicate! I found some related notes on lists.llvm.org, but not a bug report.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions