llvm-project/llvm/test/Feature
Michael J. Spencer 1f10c5ea94 [IR] Make {extract,insert}element accept an index of any integer type.
Given the following C code llvm currently generates suboptimal code for
x86-64:

__m128 bss4( const __m128 *ptr, size_t i, size_t j )
{
    float f = ptr[i][j];
    return (__m128) { f, f, f, f };
}

=================================================

define <4 x float> @_Z4bss4PKDv4_fmm(<4 x float>* nocapture readonly %ptr, i64 %i, i64 %j) #0 {
  %a1 = getelementptr inbounds <4 x float>* %ptr, i64 %i
  %a2 = load <4 x float>* %a1, align 16, !tbaa !1
  %a3 = trunc i64 %j to i32
  %a4 = extractelement <4 x float> %a2, i32 %a3
  %a5 = insertelement <4 x float> undef, float %a4, i32 0
  %a6 = insertelement <4 x float> %a5, float %a4, i32 1
  %a7 = insertelement <4 x float> %a6, float %a4, i32 2
  %a8 = insertelement <4 x float> %a7, float %a4, i32 3
  ret <4 x float> %a8
}

=================================================

        shlq    $4, %rsi
        addq    %rdi, %rsi
        movslq  %edx, %rax
        vbroadcastss    (%rsi,%rax,4), %xmm0
        retq

=================================================

The movslq is uneeded, but is present because of the trunc to i32 and then
sext back to i64 that the backend adds for vbroadcastss.

We can't remove it because it changes the meaning. The IR that clang
generates is already suboptimal. What clang really should emit is:

  %a4 = extractelement <4 x float> %a2, i64 %j

This patch makes that legal. A separate patch will teach clang to do it.

Differential Revision: http://reviews.llvm.org/D3519

llvm-svn: 207801
2014-05-01 22:12:39 +00:00
..
NamedMDNode.ll
NamedMDNode2.ll
README.txt
aliases.ll Prevent alias from pointing to weak aliases. 2014-03-27 15:26:56 +00:00
alignment.ll
attributes.ll
basictest.ll
callingconventions.ll
calltest.ll
casttest.ll
cfgstructures.ll
cold.ll
const_pv.ll
constexpr.ll
constpointer.ll
escaped_label.ll
exception.ll
float.ll
fold-fpcast.ll
forwardreftest.ll
global_pv.ll
global_section.ll
globalredefinition3.ll
globalvars.ll
indirectcall.ll
indirectcall2.ll
inlineasm.ll
instructions.ll [IR] Make {extract,insert}element accept an index of any integer type. 2014-05-01 22:12:39 +00:00
intrinsic-noduplicate.ll Expose "noduplicate" attribute as a property for intrinsics. 2014-03-18 23:51:07 +00:00
intrinsics.ll Change math intrinsic attributes from readonly to readnone. These 2014-03-06 00:18:15 +00:00
load_module.ll Remove "lto_on_osx" xfails, now that -rdynamic works on Darwin. 2013-08-04 23:55:24 +00:00
md_on_instruction.ll Debug Info: update testing cases to specify the debug info version number. 2013-11-23 01:16:29 +00:00
memorymarkers.ll
metadata.ll
minsize_attr.ll
newcasts.ll Add addrspacecast instruction. 2013-11-15 01:34:59 +00:00
optnone-llc.ll Disable each MachineFunctionPass for 'optnone' functions, unless that 2014-03-31 17:43:35 +00:00
optnone-opt.ll Disable most IR-level transform passes on functions marked 'optnone'. 2014-02-06 00:07:05 +00:00
optnone.ll The 'optnone' attribute means don't inline anything into this function 2013-11-18 21:44:03 +00:00
packed.ll
packed_struct.ll
paramattrs.ll
ppcld.ll
prefixdata.ll Implement function prefix data as an IR feature. 2013-09-16 01:08:15 +00:00
properties.ll
prototype.ll
recursivetype.ll
simplecalltest.ll
small.ll
smallest.ll
sparcld.ll
terminators.ll
testalloca.ll
testconstants.ll
testlogical.ll
testtype.ll
testvarargs.ll
undefined.ll
unreachable.ll
varargs.ll
varargs_new.ll
vector-cast-constant-exprs.ll
weak_constant.ll
weirdnames.ll
x86ld.ll

README.txt

This directory contains test cases for individual source features of LLVM.
It is designed to make sure that the major components of LLVM support all of the
features of LLVM, for very small examples.  Entire programs should not go here.

Regression tests for individual bug fixes should go into the test/Regression dir.