Index: llvm/trunk/lib/Transforms/Scalar/InferAddressSpaces.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/InferAddressSpaces.cpp +++ llvm/trunk/lib/Transforms/Scalar/InferAddressSpaces.cpp @@ -553,10 +553,17 @@ if (Value *NewOperand = ValueWithNewAddrSpace.lookup(Operand)) { IsNew = true; NewOperands.push_back(cast(NewOperand)); - } else { - // Otherwise, reuses the old operand. - NewOperands.push_back(Operand); + continue; } + if (auto CExpr = dyn_cast(Operand)) + if (Value *NewOperand = cloneConstantExprWithNewAddressSpace( + CExpr, NewAddrSpace, ValueWithNewAddrSpace)) { + IsNew = true; + NewOperands.push_back(cast(NewOperand)); + continue; + } + // Otherwise, reuses the old operand. + NewOperands.push_back(Operand); } // If !IsNew, we will replace the Value with itself. However, replaced values Index: llvm/trunk/test/Transforms/InferAddressSpaces/AMDGPU/infer-getelementptr.ll =================================================================== --- llvm/trunk/test/Transforms/InferAddressSpaces/AMDGPU/infer-getelementptr.ll +++ llvm/trunk/test/Transforms/InferAddressSpaces/AMDGPU/infer-getelementptr.ll @@ -71,3 +71,15 @@ ret void } + +; CHECK-LABEL: @unorder_constexpr_gep_bitcast( +; CHECK-NEXT: %x0 = load i32, i32 addrspace(3)* bitcast ([648 x double] addrspace(3)* @lds to i32 addrspace(3)*), align 4 +; CHECK-NEXT: %x1 = load i32, i32 addrspace(3)* getelementptr (i32, i32 addrspace(3)* bitcast ([648 x double] addrspace(3)* @lds to i32 addrspace(3)*), i32 1), align 4 +define void @unorder_constexpr_gep_bitcast() { + %x0 = load i32, i32* bitcast ([648 x double]* addrspacecast ([648 x double] addrspace(3)* @lds to [648 x double]*) to i32*), align 4 + %x1 = load i32, i32* getelementptr (i32, i32* bitcast ([648 x double]* addrspacecast ([648 x double] addrspace(3)* @lds to [648 x double]*) to i32*), i32 1), align 4 + call void @use(i32 %x0, i32 %x1) + ret void +} + +declare void @use(i32, i32) Index: llvm/trunk/test/Transforms/InferAddressSpaces/NVPTX/clone_constexpr.ll =================================================================== --- llvm/trunk/test/Transforms/InferAddressSpaces/NVPTX/clone_constexpr.ll +++ llvm/trunk/test/Transforms/InferAddressSpaces/NVPTX/clone_constexpr.ll @@ -11,7 +11,7 @@ ; CHECK: %idxprom.i = zext i32 %x0 to i64 ; CHECK: %arrayidx.i = getelementptr %struct.S, %struct.S* addrspacecast (%struct.S addrspace(3)* @g1 to %struct.S*), i64 0, i32 0, i64 %idxprom.i ; CHECK: tail call void @f1(i32* %arrayidx.i, i32 undef) #0 -; CHECK: %x1 = load i32, i32* getelementptr (%struct.S, %struct.S* addrspacecast (%struct.S addrspace(3)* @g1 to %struct.S*), i64 0, i32 0, i64 0), align 4 +; CHECK: %x1 = load i32, i32 addrspace(3)* getelementptr inbounds (%struct.S, %struct.S addrspace(3)* @g1, i64 0, i32 0, i64 0), align 4 ; CHECK: %L.sroa.0.0.insert.ext.i = zext i32 %x1 to i64 ; CHECK: tail call void @f2(i64* null, i64 %L.sroa.0.0.insert.ext.i) #0 ; CHECK: ret void