Skip to content

InstCombine: incorrect select operand simplification with undef #47040

@nunoplopes

Description

@nunoplopes
Bugzilla Link 47696
Resolution FIXED
Resolved on Oct 23, 2020 18:33
Version trunk
OS All
Blocks #47292
CC @RKSimon,@nikic,@regehr,@rotateright
Fixed by commit(s) 9d1c8c0

Extended Description

Test: Transforms/InstCombine/select-binop-cmp.ll

Seems to be a regression from https://reviews.llvm.org/D87480
The undef operand in the icmp needs to be fixed to 0 for the transformation to be correct. See here: https://alive2.llvm.org/ce/z/YYhL33

define <2 x i8> @​select_xor_icmp_vec_undef(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
%A = icmp eq <2 x i8> %x, { 0, undef }
%B = xor <2 x i8> %x, %z
%C = select <2 x i1> %A, <2 x i8> %B, <2 x i8> %y
ret <2 x i8> %C
}
=>
define <2 x i8> @​select_xor_icmp_vec_undef(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
%A = icmp eq <2 x i8> %x, { 0, undef }
%C = select <2 x i1> %A, <2 x i8> %z, <2 x i8> %y
ret <2 x i8> %C
}
Transformation doesn't verify!
ERROR: Target's return value is more undefined

Example:
<2 x i8> %x = < poison, #x01 (1) >
<2 x i8> %y = < poison, #x00 (0) >
<2 x i8> %z = < poison, #x01 (1) >

Source:
<2 x i1> %A = < poison, any >
<2 x i8> %B = < poison, #x00 (0) >
<2 x i8> %C = < poison, #x00 (0) >

Target:
<2 x i1> %A = < poison, #x1 (1) >
<2 x i8> %C = < poison, #x01 (1) >
Source value: < poison, #x00 (0) >
Target value: < poison, #x01 (1) >

https://web.ist.utl.pt/nuno.lopes/alive2/index.php?hash=1546033e6d866cfc&test=Transforms%2FInstCombine%2Fselect-binop-cmp.ll

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