[llvm] c9c32fe - [CVP] Add additional select tests (NFC)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 10 07:59:39 PDT 2023


Author: Nikita Popov
Date: 2023-07-10T16:59:28+02:00
New Revision: c9c32fe069266be5b58a9420bb4b9f76976a8ae9

URL: https://github.com/llvm/llvm-project/commit/c9c32fe069266be5b58a9420bb4b9f76976a8ae9
DIFF: https://github.com/llvm/llvm-project/commit/c9c32fe069266be5b58a9420bb4b9f76976a8ae9.diff

LOG: [CVP] Add additional select tests (NFC)

Added: 
    

Modified: 
    llvm/test/Transforms/CorrelatedValuePropagation/select.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/CorrelatedValuePropagation/select.ll b/llvm/test/Transforms/CorrelatedValuePropagation/select.ll
index 8ffd9536d79706..f10ebd6e4af8c4 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/select.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/select.ll
@@ -1,35 +1,76 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
 ; RUN: opt < %s -passes=correlated-propagation -S | FileCheck %s
 
-define i8 @simple(i1) {
-; CHECK-LABEL: @simple(
+declare void @use(i8, i8)
+
+define i8 @simple_phi(i1 %c, i8 %a, i8 %b) {
+; CHECK-LABEL: define i8 @simple_phi
+; CHECK-SAME: (i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[S:%.*]] = select i1 [[TMP0:%.*]], i8 0, i8 1
-; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
+; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 [[A]], i8 [[B]]
+; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
 ; CHECK:       then:
-; CHECK-NEXT:    ret i8 0
+; CHECK-NEXT:    ret i8 [[A]]
 ; CHECK:       else:
-; CHECK-NEXT:    ret i8 1
+; CHECK-NEXT:    ret i8 [[B]]
 ;
 entry:
-  %s = select i1 %0, i8 0, i8 1
-  br i1 %0, label %then, label %else
+  %s = select i1 %c, i8 %a, i8 %b
+  br i1 %c, label %then, label %else
 
 then:
-  %a = phi i8 [ %s, %entry ]
-  ret i8 %a
+  %phi1 = phi i8 [ %s, %entry ]
+  ret i8 %phi1
 
 else:
-  %b = phi i8 [ %s, %entry ]
-  ret i8 %b
+  %phi2 = phi i8 [ %s, %entry ]
+  ret i8 %phi2
 }
 
-define void @loop(i32) {
-; CHECK-LABEL: @loop(
+define i8 @phi_other_edge(i1 %c, i8 %a, i8 %b, i32 %sw) {
+; CHECK-LABEL: define i8 @phi_other_edge
+; CHECK-SAME: (i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]], i32 [[SW:%.*]]) {
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    switch i32 [[SW]], label [[TEST:%.*]] [
+; CHECK-NEXT:    i32 0, label [[THEN:%.*]]
+; CHECK-NEXT:    i32 1, label [[ELSE:%.*]]
+; CHECK-NEXT:    ]
+; CHECK:       test:
+; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 [[A]], i8 [[B]]
+; CHECK-NEXT:    br i1 [[C]], label [[THEN]], label [[ELSE]]
+; CHECK:       then:
+; CHECK-NEXT:    [[PHI1:%.*]] = phi i8 [ [[A]], [[TEST]] ], [ 1, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    ret i8 [[PHI1]]
+; CHECK:       else:
+; CHECK-NEXT:    [[PHI2:%.*]] = phi i8 [ [[B]], [[TEST]] ], [ 2, [[ENTRY]] ]
+; CHECK-NEXT:    ret i8 [[PHI2]]
+;
+entry:
+  switch i32 %sw, label %test [
+  i32 0, label %then
+  i32 1, label %else
+  ]
+
+test:
+  %s = select i1 %c, i8 %a, i8 %b
+  br i1 %c, label %then, label %else
+
+then:
+  %phi1 = phi i8 [ %s, %test ], [ 1, %entry ]
+  ret i8 %phi1
+
+else:
+  %phi2 = phi i8 [ %s, %test ], [ 2, %entry ]
+  ret i8 %phi2
+}
+
+define void @phi_loop(i32) {
+; CHECK-LABEL: define void @phi_loop
+; CHECK-SAME: (i32 [[TMP0:%.*]]) {
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
-; CHECK-NEXT:    [[IDX:%.*]] = phi i32 [ [[TMP0:%.*]], [[ENTRY:%.*]] ], [ [[TMP2:%.*]], [[LOOP]] ]
+; CHECK-NEXT:    [[IDX:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[TMP2:%.*]], [[LOOP]] ]
 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32 [[IDX]], 0
 ; CHECK-NEXT:    [[TMP2]] = add i32 [[IDX]], -1
 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[TMP1]], i32 0, i32 [[TMP2]]
@@ -51,11 +92,38 @@ out:
   ret void
 }
 
+define void @simple_multiple_uses(i1 %c, i8 %a, i8 %b) {
+; CHECK-LABEL: define void @simple_multiple_uses
+; CHECK-SAME: (i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[S:%.*]] = select i1 [[C]], i8 [[A]], i8 [[B]]
+; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
+; CHECK:       then:
+; CHECK-NEXT:    call void @use(i8 [[S]], i8 [[S]])
+; CHECK-NEXT:    ret void
+; CHECK:       else:
+; CHECK-NEXT:    call void @use(i8 [[S]], i8 [[S]])
+; CHECK-NEXT:    ret void
+;
+entry:
+  %s = select i1 %c, i8 %a, i8 %b
+  br i1 %c, label %then, label %else
+
+then:
+  call void @use(i8 %s, i8 %s)
+  ret void
+
+else:
+  call void @use(i8 %s, i8 %s)
+  ret void
+}
+
 define i8 @not_correlated(i1, i1) {
-; CHECK-LABEL: @not_correlated(
+; CHECK-LABEL: define i8 @not_correlated
+; CHECK-SAME: (i1 [[TMP0:%.*]], i1 [[TMP1:%.*]]) {
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[S:%.*]] = select i1 [[TMP0:%.*]], i8 0, i8 1
-; CHECK-NEXT:    br i1 [[TMP1:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
+; CHECK-NEXT:    [[S:%.*]] = select i1 [[TMP0]], i8 0, i8 1
+; CHECK-NEXT:    br i1 [[TMP1]], label [[THEN:%.*]], label [[ELSE:%.*]]
 ; CHECK:       then:
 ; CHECK-NEXT:    ret i8 [[S]]
 ; CHECK:       else:
@@ -78,7 +146,7 @@ else:
 @b = global i32 0, align 4
 
 define i32 @PR23752() {
-; CHECK-LABEL: @PR23752(
+; CHECK-LABEL: define i32 @PR23752() {
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
@@ -103,12 +171,13 @@ if.end:
 }
 
 define i1 @test1(ptr %p, i1 %unknown) {
-; CHECK-LABEL: @test1(
-; CHECK-NEXT:    [[PVAL:%.*]] = load i32, ptr [[P:%.*]], align 4
+; CHECK-LABEL: define i1 @test1
+; CHECK-SAME: (ptr [[P:%.*]], i1 [[UNKNOWN:%.*]]) {
+; CHECK-NEXT:    [[PVAL:%.*]] = load i32, ptr [[P]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[PVAL]], 255
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[NEXT:%.*]], label [[EXIT:%.*]]
 ; CHECK:       next:
-; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[UNKNOWN:%.*]], i32 [[PVAL]], i32 5
+; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[UNKNOWN]], i32 [[PVAL]], i32 5
 ; CHECK-NEXT:    ret i1 false
 ; CHECK:       exit:
 ; CHECK-NEXT:    ret i1 true
@@ -128,12 +197,13 @@ exit:
 
 ; Check that we take a conservative meet
 define i1 @test2(ptr %p, i32 %qval, i1 %unknown) {
-; CHECK-LABEL: @test2(
-; CHECK-NEXT:    [[PVAL:%.*]] = load i32, ptr [[P:%.*]], align 4
+; CHECK-LABEL: define i1 @test2
+; CHECK-SAME: (ptr [[P:%.*]], i32 [[QVAL:%.*]], i1 [[UNKNOWN:%.*]]) {
+; CHECK-NEXT:    [[PVAL:%.*]] = load i32, ptr [[P]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[PVAL]], 255
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[NEXT:%.*]], label [[EXIT:%.*]]
 ; CHECK:       next:
-; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[UNKNOWN:%.*]], i32 [[PVAL]], i32 [[QVAL:%.*]]
+; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[UNKNOWN]], i32 [[PVAL]], i32 [[QVAL]]
 ; CHECK-NEXT:    [[RES:%.*]] = icmp eq i32 [[MIN]], 255
 ; CHECK-NEXT:    ret i1 [[RES]]
 ; CHECK:       exit:
@@ -154,12 +224,13 @@ exit:
 
 ; Same as @test2, but for the opposite select input
 define i1 @test3(ptr %p, i32 %qval, i1 %unknown) {
-; CHECK-LABEL: @test3(
-; CHECK-NEXT:    [[PVAL:%.*]] = load i32, ptr [[P:%.*]], align 4
+; CHECK-LABEL: define i1 @test3
+; CHECK-SAME: (ptr [[P:%.*]], i32 [[QVAL:%.*]], i1 [[UNKNOWN:%.*]]) {
+; CHECK-NEXT:    [[PVAL:%.*]] = load i32, ptr [[P]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[PVAL]], 255
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[NEXT:%.*]], label [[EXIT:%.*]]
 ; CHECK:       next:
-; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[UNKNOWN:%.*]], i32 [[QVAL:%.*]], i32 [[PVAL]]
+; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[UNKNOWN]], i32 [[QVAL]], i32 [[PVAL]]
 ; CHECK-NEXT:    [[RES:%.*]] = icmp eq i32 [[MIN]], 255
 ; CHECK-NEXT:    ret i1 [[RES]]
 ; CHECK:       exit:
@@ -183,12 +254,13 @@ exit:
 ; is to get around the fact that all integers (including constants
 ; and non-constants) are actually represented as constant-ranges.
 define i1 @test4(ptr %p, i32 %qval, i1 %unknown) {
-; CHECK-LABEL: @test4(
-; CHECK-NEXT:    [[PVAL:%.*]] = load i32, ptr [[P:%.*]], align 4
+; CHECK-LABEL: define i1 @test4
+; CHECK-SAME: (ptr [[P:%.*]], i32 [[QVAL:%.*]], i1 [[UNKNOWN:%.*]]) {
+; CHECK-NEXT:    [[PVAL:%.*]] = load i32, ptr [[P]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[PVAL]], 255
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[NEXT:%.*]], label [[EXIT:%.*]]
 ; CHECK:       next:
-; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[UNKNOWN:%.*]], double 1.000000e+00, double 0.000000e+00
+; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[UNKNOWN]], double 1.000000e+00, double 0.000000e+00
 ; CHECK-NEXT:    [[RES:%.*]] = fcmp oeq double [[MIN]], 3.000000e+02
 ; CHECK-NEXT:    ret i1 [[RES]]
 ; CHECK:       exit:
@@ -211,8 +283,9 @@ exit:
 ;;
 
 define i1 @test5(ptr %p, i1 %unknown) {
-; CHECK-LABEL: @test5(
-; CHECK-NEXT:    [[PVAL:%.*]] = load i32, ptr [[P:%.*]], align 4
+; CHECK-LABEL: define i1 @test5
+; CHECK-SAME: (ptr [[P:%.*]], i1 [[UNKNOWN:%.*]]) {
+; CHECK-NEXT:    [[PVAL:%.*]] = load i32, ptr [[P]], align 4, !noundef [[META0:![0-9]+]]
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[PVAL]], 255
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[NEXT:%.*]], label [[EXIT:%.*]]
 ; CHECK:       next:
@@ -237,8 +310,9 @@ exit:
 }
 
 define i1 @test6(ptr %p, i1 %unknown) {
-; CHECK-LABEL: @test6(
-; CHECK-NEXT:    [[PVAL:%.*]] = load i32, ptr [[P:%.*]], align 4
+; CHECK-LABEL: define i1 @test6
+; CHECK-SAME: (ptr [[P:%.*]], i1 [[UNKNOWN:%.*]]) {
+; CHECK-NEXT:    [[PVAL:%.*]] = load i32, ptr [[P]], align 4, !noundef [[META0]]
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i32 [[PVAL]], 255
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[NEXT:%.*]], label [[EXIT:%.*]]
 ; CHECK:       next:
@@ -263,8 +337,9 @@ exit:
 }
 
 define i64 @select_cond_may_undef(i32 %a) {
-; CHECK-LABEL: @select_cond_may_undef(
-; CHECK-NEXT:    [[IS_A_NONNEGATIVE:%.*]] = icmp sgt i32 [[A:%.*]], 1
+; CHECK-LABEL: define i64 @select_cond_may_undef
+; CHECK-SAME: (i32 [[A:%.*]]) {
+; CHECK-NEXT:    [[IS_A_NONNEGATIVE:%.*]] = icmp sgt i32 [[A]], 1
 ; CHECK-NEXT:    [[NARROW:%.*]] = select i1 [[IS_A_NONNEGATIVE]], i32 [[A]], i32 0
 ; CHECK-NEXT:    [[MAX:%.*]] = sext i32 [[NARROW]] to i64
 ; CHECK-NEXT:    ret i64 [[MAX]]


        


More information about the llvm-commits mailing list