diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll b/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll index c5c275ec8d4ae..4713752f6979f 100644 --- a/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll +++ b/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll @@ -578,6 +578,62 @@ out: ret i1 false } +define i1 @clamp_low3(i32 %a) { +; CHECK-LABEL: @clamp_low3( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[A:%.*]], 5 +; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]] +; CHECK: a_guard: +; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp sgt i32 [[A]], 5 +; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], -1 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 [[ADD]], i32 5 +; CHECK-NEXT: [[RES:%.*]] = icmp eq i32 [[SEL]], 4 +; CHECK-NEXT: ret i1 [[RES]] +; CHECK: out: +; CHECK-NEXT: ret i1 false +; +entry: + %cmp = icmp sge i32 %a, 5 + br i1 %cmp, label %a_guard, label %out + +a_guard: + %sel_cmp = icmp sgt i32 %a, 5 + %add = add i32 %a, -1 + %sel = select i1 %sel_cmp, i32 %add, i32 5 + %res = icmp eq i32 %sel, 4 + ret i1 %res +out: + ret i1 false +} + +define i1 @clamp_low4(i32 %a) { +; CHECK-LABEL: @clamp_low4( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[A:%.*]], 5 +; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]] +; CHECK: a_guard: +; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp sle i32 [[A]], 5 +; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], -1 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 5, i32 [[ADD]] +; CHECK-NEXT: [[RES:%.*]] = icmp eq i32 [[SEL]], 4 +; CHECK-NEXT: ret i1 [[RES]] +; CHECK: out: +; CHECK-NEXT: ret i1 false +; +entry: + %cmp = icmp sge i32 %a, 5 + br i1 %cmp, label %a_guard, label %out + +a_guard: + %sel_cmp = icmp sle i32 %a, 5 + %add = add i32 %a, -1 + %sel = select i1 %sel_cmp, i32 5, i32 %add + %res = icmp eq i32 %sel, 4 + ret i1 %res +out: + ret i1 false +} + define i1 @clamp_high1(i32 %a) { ; CHECK-LABEL: @clamp_high1( ; CHECK-NEXT: entry: @@ -632,13 +688,69 @@ out: ret i1 false } -; Just showing arbitrary constants work, not really a clamp define i1 @clamp_high3(i32 %a) { ; CHECK-LABEL: @clamp_high3( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[A:%.*]], 5 ; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]] ; CHECK: a_guard: +; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp slt i32 [[A]], 5 +; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 [[ADD]], i32 5 +; CHECK-NEXT: [[RES:%.*]] = icmp eq i32 [[SEL]], 6 +; CHECK-NEXT: ret i1 [[RES]] +; CHECK: out: +; CHECK-NEXT: ret i1 false +; +entry: + %cmp = icmp sle i32 %a, 5 + br i1 %cmp, label %a_guard, label %out + +a_guard: + %sel_cmp = icmp slt i32 %a, 5 + %add = add i32 %a, 1 + %sel = select i1 %sel_cmp, i32 %add, i32 5 + %res = icmp eq i32 %sel, 6 + ret i1 %res +out: + ret i1 false +} + +define i1 @clamp_high4(i32 %a) { +; CHECK-LABEL: @clamp_high4( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[A:%.*]], 5 +; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]] +; CHECK: a_guard: +; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp sge i32 [[A]], 5 +; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 5, i32 [[ADD]] +; CHECK-NEXT: [[RES:%.*]] = icmp eq i32 [[SEL]], 6 +; CHECK-NEXT: ret i1 [[RES]] +; CHECK: out: +; CHECK-NEXT: ret i1 false +; +entry: + %cmp = icmp sle i32 %a, 5 + br i1 %cmp, label %a_guard, label %out + +a_guard: + %sel_cmp = icmp sge i32 %a, 5 + %add = add i32 %a, 1 + %sel = select i1 %sel_cmp, i32 5, i32 %add + %res = icmp eq i32 %sel, 6 + ret i1 %res +out: + ret i1 false +} + +; Just showing arbitrary constants work, not really a clamp +define i1 @not_clamp_high(i32 %a) { +; CHECK-LABEL: @not_clamp_high( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[A:%.*]], 5 +; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]] +; CHECK: a_guard: ; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp ne i32 [[A]], 5 ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 100 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 [[ADD]], i32 5