[llvm] r320568 - Reintroduce r320049, r320014 and r319894.
Igor Laevsky via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 13 03:21:18 PST 2017
Author: igor.laevsky
Date: Wed Dec 13 03:21:18 2017
New Revision: 320568
URL: http://llvm.org/viewvc/llvm-project?rev=320568&view=rev
Log:
Reintroduce r320049, r320014 and r319894.
OpenGL issues should be fixed by now.
Added:
llvm/trunk/test/Transforms/InstCombine/pr28725.ll
- copied unchanged from r320465, llvm/trunk/test/Transforms/InstCombine/pr28725.ll
llvm/trunk/test/Transforms/InstSimplify/insertelement.ll
- copied unchanged from r320465, llvm/trunk/test/Transforms/InstSimplify/insertelement.ll
Modified:
llvm/trunk/include/llvm/Analysis/ConstantFolding.h
llvm/trunk/include/llvm/Analysis/InstructionSimplify.h
llvm/trunk/lib/Analysis/InstructionSimplify.cpp
llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
llvm/trunk/test/Transforms/InstCombine/out-of-bounds-indexes.ll
llvm/trunk/test/Transforms/InstCombine/vector_insertelt_shuffle.ll
llvm/trunk/test/Transforms/InstSimplify/pr28725.ll
Modified: llvm/trunk/include/llvm/Analysis/ConstantFolding.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ConstantFolding.h?rev=320568&r1=320567&r2=320568&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/ConstantFolding.h (original)
+++ llvm/trunk/include/llvm/Analysis/ConstantFolding.h Wed Dec 13 03:21:18 2017
@@ -102,6 +102,13 @@ Constant *ConstantFoldInsertValueInstruc
Constant *ConstantFoldExtractValueInstruction(Constant *Agg,
ArrayRef<unsigned> Idxs);
+/// \brief Attempt to constant fold an insertelement instruction with the
+/// specified operands and indices. The constant result is returned if
+/// successful; if not, null is returned.
+Constant *ConstantFoldInsertElementInstruction(Constant *Val,
+ Constant *Elt,
+ Constant *Idx);
+
/// \brief Attempt to constant fold an extractelement instruction with the
/// specified operands and indices. The constant result is returned if
/// successful; if not, null is returned.
Modified: llvm/trunk/include/llvm/Analysis/InstructionSimplify.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/InstructionSimplify.h?rev=320568&r1=320567&r2=320568&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/InstructionSimplify.h (original)
+++ llvm/trunk/include/llvm/Analysis/InstructionSimplify.h Wed Dec 13 03:21:18 2017
@@ -161,6 +161,10 @@ Value *SimplifyGEPInst(Type *SrcTy, Arra
Value *SimplifyInsertValueInst(Value *Agg, Value *Val, ArrayRef<unsigned> Idxs,
const SimplifyQuery &Q);
+/// Given operands for an InsertElement, fold the result or return null.
+Value *SimplifyInsertElementInst(Value *Vec, Value *Elt, Value *Idx,
+ const SimplifyQuery &Q);
+
/// Given operands for an ExtractValueInst, fold the result or return null.
Value *SimplifyExtractValueInst(Value *Agg, ArrayRef<unsigned> Idxs,
const SimplifyQuery &Q);
Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=320568&r1=320567&r2=320568&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
+++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Wed Dec 13 03:21:18 2017
@@ -3827,6 +3827,28 @@ Value *llvm::SimplifyInsertValueInst(Val
return ::SimplifyInsertValueInst(Agg, Val, Idxs, Q, RecursionLimit);
}
+Value *llvm::SimplifyInsertElementInst(Value *Vec, Value *Val, Value *Idx,
+ const SimplifyQuery &Q) {
+ // Try to constant fold.
+ auto *VecC = dyn_cast<Constant>(Vec);
+ auto *ValC = dyn_cast<Constant>(Val);
+ auto *IdxC = dyn_cast<Constant>(Idx);
+ if (VecC && ValC && IdxC)
+ return ConstantFoldInsertElementInstruction(VecC, ValC, IdxC);
+
+ // Fold into undef if index is out of bounds.
+ if (auto *CI = dyn_cast<ConstantInt>(Idx)) {
+ uint64_t NumElements = cast<VectorType>(Vec->getType())->getNumElements();
+
+ if (CI->uge(NumElements))
+ return UndefValue::get(Vec->getType());
+ }
+
+ // TODO: We should also fold if index is iteslf an undef.
+
+ return nullptr;
+}
+
/// Given operands for an ExtractValueInst, see if we can fold the result.
/// If not, this returns null.
static Value *SimplifyExtractValueInst(Value *Agg, ArrayRef<unsigned> Idxs,
@@ -4700,6 +4722,12 @@ Value *llvm::SimplifyInstruction(Instruc
IV->getIndices(), Q);
break;
}
+ case Instruction::InsertElement: {
+ auto *IE = cast<InsertElementInst>(I);
+ Result = SimplifyInsertElementInst(IE->getOperand(0), IE->getOperand(1),
+ IE->getOperand(2), Q);
+ break;
+ }
case Instruction::ExtractValue: {
auto *EVI = cast<ExtractValueInst>(I);
Result = SimplifyExtractValueInst(EVI->getAggregateOperand(),
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp?rev=320568&r1=320567&r2=320568&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp Wed Dec 13 03:21:18 2017
@@ -781,6 +781,10 @@ Instruction *InstCombiner::visitInsertEl
Value *ScalarOp = IE.getOperand(1);
Value *IdxOp = IE.getOperand(2);
+ if (auto *V = SimplifyInsertElementInst(
+ VecOp, ScalarOp, IdxOp, SQ.getWithInstruction(&IE)))
+ return replaceInstUsesWith(IE, V);
+
// Inserting an undef or into an undefined place, remove this.
if (isa<UndefValue>(ScalarOp) || isa<UndefValue>(IdxOp))
replaceInstUsesWith(IE, VecOp);
Modified: llvm/trunk/test/Transforms/InstCombine/out-of-bounds-indexes.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/out-of-bounds-indexes.ll?rev=320568&r1=320567&r2=320568&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/out-of-bounds-indexes.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/out-of-bounds-indexes.ll Wed Dec 13 03:21:18 2017
@@ -31,3 +31,11 @@ define i128 @test_non64bit(i128 %a) {
}
declare void @llvm.assume(i1)
+
+define <4 x double> @inselt_bad_index(<4 x double> %a) {
+; CHECK-LABEL: @inselt_bad_index(
+; CHECK-NEXT: ret <4 x double> undef
+;
+ %I = insertelement <4 x double> %a, double 0.0, i64 4294967296
+ ret <4 x double> %I
+}
Modified: llvm/trunk/test/Transforms/InstCombine/vector_insertelt_shuffle.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/vector_insertelt_shuffle.ll?rev=320568&r1=320567&r2=320568&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/vector_insertelt_shuffle.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/vector_insertelt_shuffle.ll Wed Dec 13 03:21:18 2017
@@ -54,10 +54,10 @@ define <4 x float> @bazz(<4 x float> %x,
ret <4 x float> %ins6
}
+; Out of bounds index folds to undef
define <4 x float> @bazzz(<4 x float> %x) {
; CHECK-LABEL: @bazzz(
-; CHECK-NEXT: [[INS2:%.*]] = insertelement <4 x float> %x, float 2.000000e+00, i32 2
-; CHECK-NEXT: ret <4 x float> [[INS2]]
+; CHECK-NEXT: ret <4 x float> <float undef, float undef, float 2.000000e+00, float undef>
;
%ins1 = insertelement<4 x float> %x, float 1.0, i32 5
%ins2 = insertelement<4 x float> %ins1, float 2.0, i32 2
Modified: llvm/trunk/test/Transforms/InstSimplify/pr28725.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/pr28725.ll?rev=320568&r1=320567&r2=320568&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstSimplify/pr28725.ll (original)
+++ llvm/trunk/test/Transforms/InstSimplify/pr28725.ll Wed Dec 13 03:21:18 2017
@@ -1,6 +1,4 @@
; RUN: opt -S -instsimplify < %s | FileCheck %s
-target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-pc-windows-msvc"
%S = type { i16, i32 }
define <2 x i16> @test1() {
@@ -9,5 +7,6 @@ entry:
ret <2 x i16> %b
}
+; InstCombine will be able to fold this into zeroinitializer
; CHECK-LABEL: @test1(
-; CHECK: ret <2 x i16> zeroinitializer
+; CHECK: ret <2 x i16> <i16 extractvalue (%S select (i1 icmp eq (i16 extractelement (<2 x i16> bitcast (<1 x i32> <i32 1> to <2 x i16>), i32 0), i16 0), %S zeroinitializer, %S { i16 0, i32 1 }), 0), i16 0>
More information about the llvm-commits
mailing list