Index: lib/Transforms/Scalar/LoopStrengthReduce.cpp =================================================================== --- lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -3646,6 +3646,12 @@ // Don't do this if there is more than one offset. if (LU.MinOffset != LU.MaxOffset) return; + // Check if transformation is valid. It is illegal to multiply pointer. + if (Base.ScaledReg && Base.ScaledReg->getType()->isPointerTy()) + return; + for (const SCEV *BaseReg : Base.BaseRegs) + if (BaseReg->getType()->isPointerTy()) + return; assert(!Base.BaseGV && "ICmpZero use is not legal!"); // Check each interesting stride. Index: test/Transforms/LoopStrengthReduce/pr27056.ll =================================================================== --- test/Transforms/LoopStrengthReduce/pr27056.ll +++ test/Transforms/LoopStrengthReduce/pr27056.ll @@ -45,6 +45,7 @@ ; CHECK-LABEL: define void @b_copy_ctor( ; CHECK: catchpad ; CHECK-NEXT: icmp eq %struct.L -; CHECK-NEXT: getelementptr {{.*}} i64 sub (i64 0, i64 ptrtoint (%struct.L* @GV2 to i64)) +; CHECK-NEXT: %4 = sub i64 0, %1 +; CHECK-NEXT: getelementptr {{.*}} getelementptr inbounds (%struct.L, %struct.L* @GV2, i32 0, i32 0), i64 %4 declare void @a_copy_ctor()