diff --git a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp --- a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp +++ b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp @@ -76,6 +76,9 @@ STATISTIC(NumMulNW, "Number of no-wrap deductions for mul"); STATISTIC(NumMulNSW, "Number of no-signed-wrap deductions for mul"); STATISTIC(NumMulNUW, "Number of no-unsigned-wrap deductions for mul"); +STATISTIC(NumShlNW, "Number of no-wrap deductions for shl"); +STATISTIC(NumShlNSW, "Number of no-signed-wrap deductions for shl"); +STATISTIC(NumShlNUW, "Number of no-unsigned-wrap deductions for shl"); STATISTIC(NumOverflows, "Number of overflow checks removed"); STATISTIC(NumSaturating, "Number of saturating arithmetics converted to normal arithmetics"); @@ -450,6 +453,11 @@ OpcNSW = &NumMulNSW; OpcNUW = &NumMulNUW; break; + case Instruction::Shl: + OpcNW = &NumShlNW; + OpcNSW = &NumShlNSW; + OpcNUW = &NumShlNUW; + break; default: llvm_unreachable("Will not be called with other binops"); } @@ -861,6 +869,7 @@ case Instruction::Add: case Instruction::Sub: case Instruction::Mul: + case Instruction::Shl: BBChanged |= processBinOp(cast(II), LVI); break; case Instruction::And: diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll b/llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll --- a/llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll +++ b/llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll @@ -173,7 +173,7 @@ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[Y:%.*]], 5 ; CHECK-NEXT: br i1 [[CMP2]], label [[CONT2:%.*]], label [[OUT]] ; CHECK: cont2: -; CHECK-NEXT: [[SHIFTED:%.*]] = shl i32 [[X]], [[Y]] +; CHECK-NEXT: [[SHIFTED:%.*]] = shl nuw nsw i32 [[X]], [[Y]] ; CHECK-NEXT: br label [[CONT3:%.*]] ; CHECK: cont3: ; CHECK-NEXT: br label [[OUT]] @@ -212,7 +212,7 @@ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[Y:%.*]], 15 ; CHECK-NEXT: br i1 [[CMP2]], label [[CONT2:%.*]], label [[OUT]] ; CHECK: cont2: -; CHECK-NEXT: [[SHIFTED:%.*]] = shl i32 [[X]], [[Y]] +; CHECK-NEXT: [[SHIFTED:%.*]] = shl nuw nsw i32 [[X]], [[Y]] ; CHECK-NEXT: br label [[CONT3:%.*]] ; CHECK: cont3: ; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i32 [[SHIFTED]], 65536 diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/shl.ll b/llvm/test/Transforms/CorrelatedValuePropagation/shl.ll --- a/llvm/test/Transforms/CorrelatedValuePropagation/shl.ll +++ b/llvm/test/Transforms/CorrelatedValuePropagation/shl.ll @@ -85,7 +85,7 @@ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[B:%.*]], 7 ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SHL:%.*]] = shl i8 [[A:%.*]], [[B]] +; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i8 [[A:%.*]], [[B]] ; CHECK-NEXT: ret i8 [[SHL]] ; CHECK: exit: ; CHECK-NEXT: ret i8 0 @@ -104,7 +104,7 @@ define i8 @test5(i8 %b) { ; CHECK-LABEL: @test5( -; CHECK-NEXT: [[SHL:%.*]] = shl i8 0, [[B:%.*]] +; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i8 0, [[B:%.*]] ; CHECK-NEXT: ret i8 [[SHL]] ; %shl = shl i8 0, %b @@ -113,7 +113,7 @@ define i8 @test6(i8 %b) { ; CHECK-LABEL: @test6( -; CHECK-NEXT: [[SHL:%.*]] = shl i8 1, [[B:%.*]] +; CHECK-NEXT: [[SHL:%.*]] = shl nuw i8 1, [[B:%.*]] ; CHECK-NEXT: ret i8 [[SHL]] ; %shl = shl i8 1, %b @@ -126,7 +126,7 @@ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[B:%.*]], 7 ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SHL:%.*]] = shl i8 1, [[B]] +; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i8 1, [[B]] ; CHECK-NEXT: ret i8 [[SHL]] ; CHECK: exit: ; CHECK-NEXT: ret i8 0 @@ -145,7 +145,7 @@ define i8 @test8(i8 %b) { ; CHECK-LABEL: @test8( -; CHECK-NEXT: [[SHL:%.*]] = shl i8 -1, [[B:%.*]] +; CHECK-NEXT: [[SHL:%.*]] = shl nsw i8 -1, [[B:%.*]] ; CHECK-NEXT: ret i8 [[SHL]] ; %shl = shl i8 -1, %b @@ -158,7 +158,7 @@ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[B:%.*]], 0 ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SHL:%.*]] = shl i8 -1, [[B]] +; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i8 -1, [[B]] ; CHECK-NEXT: ret i8 -1 ; CHECK: exit: ; CHECK-NEXT: ret i8 0 @@ -190,7 +190,7 @@ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[B:%.*]], 2 ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SHL:%.*]] = shl i8 42, [[B]] +; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i8 42, [[B]] ; CHECK-NEXT: ret i8 [[SHL]] ; CHECK: exit: ; CHECK-NEXT: ret i8 0 @@ -213,7 +213,7 @@ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[B:%.*]], 3 ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SHL:%.*]] = shl i8 42, [[B]] +; CHECK-NEXT: [[SHL:%.*]] = shl nuw i8 42, [[B]] ; CHECK-NEXT: ret i8 [[SHL]] ; CHECK: exit: ; CHECK-NEXT: ret i8 0 @@ -268,7 +268,7 @@ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[B:%.*]], 2 ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SHL:%.*]] = shl i8 -42, [[B]] +; CHECK-NEXT: [[SHL:%.*]] = shl nsw i8 -42, [[B]] ; CHECK-NEXT: ret i8 [[SHL]] ; CHECK: exit: ; CHECK-NEXT: ret i8 0 @@ -314,7 +314,7 @@ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[B:%.*]], 2 ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SHL:%.*]] = shl i8 42, [[B]] +; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i8 42, [[B]] ; CHECK-NEXT: ret i8 [[SHL]] ; CHECK: exit: ; CHECK-NEXT: ret i8 0 @@ -337,7 +337,7 @@ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[B:%.*]], 3 ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SHL:%.*]] = shl i8 42, [[B]] +; CHECK-NEXT: [[SHL:%.*]] = shl nuw i8 42, [[B]] ; CHECK-NEXT: ret i8 [[SHL]] ; CHECK: exit: ; CHECK-NEXT: ret i8 0