Skip to content

Commit

Permalink
[InstCombine] Fix shift calculation in InstCombineCasts (llvm#84027)
Browse files Browse the repository at this point in the history
Fixes llvm#84025.
  • Loading branch information
DianQK authored Mar 5, 2024
1 parent f51ade2 commit e96c0c1
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 2 deletions.
4 changes: 2 additions & 2 deletions llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2167,14 +2167,14 @@ static bool collectInsertionElements(Value *V, unsigned Shift,
Type *ElementIntTy = IntegerType::get(C->getContext(), ElementSize);

for (unsigned i = 0; i != NumElts; ++i) {
unsigned ShiftI = Shift + i * ElementSize;
unsigned ShiftI = i * ElementSize;
Constant *Piece = ConstantFoldBinaryInstruction(
Instruction::LShr, C, ConstantInt::get(C->getType(), ShiftI));
if (!Piece)
return false;

Piece = ConstantExpr::getTrunc(Piece, ElementIntTy);
if (!collectInsertionElements(Piece, ShiftI, Elements, VecEltTy,
if (!collectInsertionElements(Piece, ShiftI + Shift, Elements, VecEltTy,
isBigEndian))
return false;
}
Expand Down
15 changes: 15 additions & 0 deletions llvm/test/Transforms/InstCombine/bitcast.ll
Original file line number Diff line number Diff line change
Expand Up @@ -686,6 +686,21 @@ define ptr @bitcast_from_single_element_pointer_vector_to_pointer(<1 x ptr> %ptr
ret ptr %ptr
}

; Sure that we calculate the correct shift.
define <4 x i32> @bitcast_shl(i32 %arg) {
; CHECK-LABEL: @bitcast_shl(
; CHECK-NEXT: [[I5:%.*]] = insertelement <4 x i32> <i32 0, i32 0, i32 65, i32 poison>, i32 [[ARG:%.*]], i64 3
; CHECK-NEXT: ret <4 x i32> [[I5]]
;
%i = zext i32 %arg to i64
%i1 = shl i64 %i, 32
%i2 = or i64 %i1, 65
%i3 = zext i64 %i2 to i128
%i4 = shl i128 %i3, 64
%i5 = bitcast i128 %i4 to <4 x i32>
ret <4 x i32> %i5
}

declare void @f1()
declare void @f2()
define ptr @select_bitcast_unsized_pointer(i1 %c) {
Expand Down

0 comments on commit e96c0c1

Please sign in to comment.