Pointer arithmetic should be done with the index the same size as the pointer.
authorBill Wendling <isanbard@gmail.com>
Thu, 18 Oct 2007 08:32:37 +0000 (08:32 +0000)
committerBill Wendling <isanbard@gmail.com>
Thu, 18 Oct 2007 08:32:37 +0000 (08:32 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43120 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
test/CodeGen/PowerPC/2007-10-18-PtrArithmetic.ll [new file with mode: 0644]

index da2c1dccb5968beb430d99f66b816a493c71cb2a..c11103682506495f971e054e94b5130984ac295e 100644 (file)
@@ -4134,6 +4134,13 @@ SDOperand SelectionDAGLegalize::ExpandEXTRACT_VECTOR_ELT(SDOperand Op) {
     unsigned EltSize = MVT::getSizeInBits(Op.getValueType())/8;
     Idx = DAG.getNode(ISD::MUL, Idx.getValueType(), Idx,
                       DAG.getConstant(EltSize, Idx.getValueType()));
+
+    if (MVT::getSizeInBits(Idx.getValueType()) >
+        MVT::getSizeInBits(TLI.getPointerTy()))
+      Idx = DAG.getNode(ISD::TRUNCATE, TLI.getPointerTy(), StackPtr);
+    else
+      Idx = DAG.getNode(ISD::SIGN_EXTEND, TLI.getPointerTy(), StackPtr);
+
     StackPtr = DAG.getNode(ISD::ADD, Idx.getValueType(), Idx, StackPtr);
 
     Op = DAG.getLoad(Op.getValueType(), Ch, StackPtr, NULL, 0);
diff --git a/test/CodeGen/PowerPC/2007-10-18-PtrArithmetic.ll b/test/CodeGen/PowerPC/2007-10-18-PtrArithmetic.ll
new file mode 100644 (file)
index 0000000..bd11b5d
--- /dev/null
@@ -0,0 +1,22 @@
+; RUN: llvm-as < %s | llc -march=ppc64 -mattr=+altivec
+       %struct.inoutprops = type <{ i8, [3 x i8] }>
+
+define void @bork(float* %argA, float* %argB, float* %res, i8 %inoutspec.0) {
+entry:
+       %.mask = and i8 %inoutspec.0, -16               ; <i8> [#uses=1]
+       %tmp6 = icmp eq i8 %.mask, 16           ; <i1> [#uses=1]
+       br i1 %tmp6, label %cond_true, label %UnifiedReturnBlock
+
+cond_true:             ; preds = %entry
+       %tmp89 = bitcast float* %res to <4 x i32>*              ; <<4 x i32>*> [#uses=1]
+       %tmp1011 = bitcast float* %argA to <4 x i32>*           ; <<4 x i32>*> [#uses=1]
+       %tmp14 = load <4 x i32>* %tmp1011, align 16             ; <<4 x i32>> [#uses=1]
+       %tmp1516 = bitcast float* %argB to <4 x i32>*           ; <<4 x i32>*> [#uses=1]
+       %tmp18 = load <4 x i32>* %tmp1516, align 16             ; <<4 x i32>> [#uses=1]
+       %tmp19 = sdiv <4 x i32> %tmp14, %tmp18          ; <<4 x i32>> [#uses=1]
+       store <4 x i32> %tmp19, <4 x i32>* %tmp89, align 16
+       ret void
+
+UnifiedReturnBlock:            ; preds = %entry
+       ret void
+}