[llvm] [SimplifyCFG] Make i1 legal to build lookup tables (PR #87431)

Arthur Carcano via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 10 08:07:12 PDT 2024


https://github.com/krtab updated https://github.com/llvm/llvm-project/pull/87431

>From cb6f3c15cab1ff728f340ba5b323d4772c7f134a Mon Sep 17 00:00:00 2001
From: Arthur Carcano <arthur.carcano at ocamlpro.com>
Date: Wed, 10 Apr 2024 17:04:45 +0200
Subject: [PATCH 1/2] Add a test for missing folding

---
 llvm/test/Transforms/SimplifyCFG/fold-i1.ll | 92 +++++++++++++++++++++
 1 file changed, 92 insertions(+)
 create mode 100644 llvm/test/Transforms/SimplifyCFG/fold-i1.ll

diff --git a/llvm/test/Transforms/SimplifyCFG/fold-i1.ll b/llvm/test/Transforms/SimplifyCFG/fold-i1.ll
new file mode 100644
index 00000000000000..52603b61deb659
--- /dev/null
+++ b/llvm/test/Transforms/SimplifyCFG/fold-i1.ll
@@ -0,0 +1,92 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
+; RUN: opt < %s -S -passes='simplifycfg<switch-to-lookup>' | FileCheck %s
+
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+
+define { i1, i8 } @f(i8 noundef %character) unnamed_addr {
+; CHECK-LABEL: define { i1, i8 } @f(
+; CHECK-SAME: i8 noundef [[CHARACTER:%.*]]) unnamed_addr {
+; CHECK-NEXT:  start:
+; CHECK-NEXT:    switch i8 [[CHARACTER]], label [[BB11:%.*]] [
+; CHECK-NEXT:      i8 48, label [[BB2:%.*]]
+; CHECK-NEXT:      i8 49, label [[BB3:%.*]]
+; CHECK-NEXT:      i8 50, label [[BB4:%.*]]
+; CHECK-NEXT:      i8 51, label [[BB5:%.*]]
+; CHECK-NEXT:      i8 52, label [[BB6:%.*]]
+; CHECK-NEXT:      i8 53, label [[BB7:%.*]]
+; CHECK-NEXT:      i8 54, label [[BB8:%.*]]
+; CHECK-NEXT:      i8 55, label [[BB9:%.*]]
+; CHECK-NEXT:      i8 56, label [[BB10:%.*]]
+; CHECK-NEXT:    ]
+; CHECK:       bb2:
+; CHECK-NEXT:    br label [[BB11]]
+; CHECK:       bb3:
+; CHECK-NEXT:    br label [[BB11]]
+; CHECK:       bb4:
+; CHECK-NEXT:    br label [[BB11]]
+; CHECK:       bb5:
+; CHECK-NEXT:    br label [[BB11]]
+; CHECK:       bb6:
+; CHECK-NEXT:    br label [[BB11]]
+; CHECK:       bb7:
+; CHECK-NEXT:    br label [[BB11]]
+; CHECK:       bb8:
+; CHECK-NEXT:    br label [[BB11]]
+; CHECK:       bb9:
+; CHECK-NEXT:    br label [[BB11]]
+; CHECK:       bb10:
+; CHECK-NEXT:    br label [[BB11]]
+; CHECK:       bb11:
+; CHECK-NEXT:    [[_0_SROA_11_0:%.*]] = phi i8 [ 8, [[BB10]] ], [ 7, [[BB9]] ], [ 6, [[BB8]] ], [ 5, [[BB7]] ], [ 4, [[BB6]] ], [ 3, [[BB5]] ], [ 2, [[BB4]] ], [ 1, [[BB3]] ], [ 0, [[BB2]] ], [ undef, [[START:%.*]] ]
+; CHECK-NEXT:    [[_0_SROA_0_0:%.*]] = phi i1 [ true, [[BB10]] ], [ true, [[BB9]] ], [ true, [[BB8]] ], [ true, [[BB7]] ], [ true, [[BB6]] ], [ true, [[BB5]] ], [ true, [[BB4]] ], [ true, [[BB3]] ], [ true, [[BB2]] ], [ false, [[START]] ]
+; CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { i1, i8 } poison, i1 [[_0_SROA_0_0]], 0
+; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { i1, i8 } [[TMP0]], i8 [[_0_SROA_11_0]], 1
+; CHECK-NEXT:    ret { i1, i8 } [[TMP1]]
+;
+start:
+  switch i8 %character, label %bb11 [
+  i8 48, label %bb2
+  i8 49, label %bb3
+  i8 50, label %bb4
+  i8 51, label %bb5
+  i8 52, label %bb6
+  i8 53, label %bb7
+  i8 54, label %bb8
+  i8 55, label %bb9
+  i8 56, label %bb10
+  ]
+
+bb2:
+  br label %bb11
+
+bb3:
+  br label %bb11
+
+bb4:
+  br label %bb11
+
+bb5:
+  br label %bb11
+
+bb6:
+  br label %bb11
+
+bb7:
+  br label %bb11
+
+bb8:
+  br label %bb11
+
+bb9:
+  br label %bb11
+
+bb10:
+  br label %bb11
+
+bb11:
+  %_0.sroa.11.0 = phi i8 [ 8, %bb10 ], [ 7, %bb9 ], [ 6, %bb8 ], [ 5, %bb7 ], [ 4, %bb6 ], [ 3, %bb5 ], [ 2, %bb4 ], [ 1, %bb3 ], [ 0, %bb2 ], [ undef, %start ]
+  %_0.sroa.0.0 = phi i1 [ true, %bb10 ], [ true, %bb9 ], [ true, %bb8 ], [ true, %bb7 ], [ true, %bb6 ], [ true, %bb5 ], [ true, %bb4 ], [ true, %bb3 ], [ true, %bb2 ], [ false, %start ]
+  %0 = insertvalue { i1, i8 } poison, i1 %_0.sroa.0.0, 0
+  %1 = insertvalue { i1, i8 } %0, i8 %_0.sroa.11.0, 1
+  ret { i1, i8 } %1
+}

>From 863cd178ab8c62cf302321082298be105e649d5b Mon Sep 17 00:00:00 2001
From: Arthur Carcano <arthur.carcano at ocamlpro.com>
Date: Wed, 3 Apr 2024 01:27:41 +0200
Subject: [PATCH 2/2] [SimplifyCFG] Make i1 legal to build lookup tables

---
 llvm/lib/Transforms/Utils/SimplifyCFG.cpp   |  2 ++
 llvm/test/Transforms/SimplifyCFG/fold-i1.ll | 36 +++------------------
 2 files changed, 6 insertions(+), 32 deletions(-)

diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index 55bbffb18879fb..af6ace5675bf52 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -6448,6 +6448,8 @@ static bool isTypeLegalForLookupTable(Type *Ty, const TargetTransformInfo &TTI,
   // on ABI alignment and padding in the table to allow the load to be widened.
   // Or we could widen the constants and truncate the load.
   unsigned BitWidth = IT->getBitWidth();
+  if (BitWidth == 1)
+    return true;
   return BitWidth >= 8 && isPowerOf2_32(BitWidth) &&
          DL.fitsInLegalInteger(IT->getBitWidth());
 }
diff --git a/llvm/test/Transforms/SimplifyCFG/fold-i1.ll b/llvm/test/Transforms/SimplifyCFG/fold-i1.ll
index 52603b61deb659..444f51fb2438bc 100644
--- a/llvm/test/Transforms/SimplifyCFG/fold-i1.ll
+++ b/llvm/test/Transforms/SimplifyCFG/fold-i1.ll
@@ -7,38 +7,10 @@ define { i1, i8 } @f(i8 noundef %character) unnamed_addr {
 ; CHECK-LABEL: define { i1, i8 } @f(
 ; CHECK-SAME: i8 noundef [[CHARACTER:%.*]]) unnamed_addr {
 ; CHECK-NEXT:  start:
-; CHECK-NEXT:    switch i8 [[CHARACTER]], label [[BB11:%.*]] [
-; CHECK-NEXT:      i8 48, label [[BB2:%.*]]
-; CHECK-NEXT:      i8 49, label [[BB3:%.*]]
-; CHECK-NEXT:      i8 50, label [[BB4:%.*]]
-; CHECK-NEXT:      i8 51, label [[BB5:%.*]]
-; CHECK-NEXT:      i8 52, label [[BB6:%.*]]
-; CHECK-NEXT:      i8 53, label [[BB7:%.*]]
-; CHECK-NEXT:      i8 54, label [[BB8:%.*]]
-; CHECK-NEXT:      i8 55, label [[BB9:%.*]]
-; CHECK-NEXT:      i8 56, label [[BB10:%.*]]
-; CHECK-NEXT:    ]
-; CHECK:       bb2:
-; CHECK-NEXT:    br label [[BB11]]
-; CHECK:       bb3:
-; CHECK-NEXT:    br label [[BB11]]
-; CHECK:       bb4:
-; CHECK-NEXT:    br label [[BB11]]
-; CHECK:       bb5:
-; CHECK-NEXT:    br label [[BB11]]
-; CHECK:       bb6:
-; CHECK-NEXT:    br label [[BB11]]
-; CHECK:       bb7:
-; CHECK-NEXT:    br label [[BB11]]
-; CHECK:       bb8:
-; CHECK-NEXT:    br label [[BB11]]
-; CHECK:       bb9:
-; CHECK-NEXT:    br label [[BB11]]
-; CHECK:       bb10:
-; CHECK-NEXT:    br label [[BB11]]
-; CHECK:       bb11:
-; CHECK-NEXT:    [[_0_SROA_11_0:%.*]] = phi i8 [ 8, [[BB10]] ], [ 7, [[BB9]] ], [ 6, [[BB8]] ], [ 5, [[BB7]] ], [ 4, [[BB6]] ], [ 3, [[BB5]] ], [ 2, [[BB4]] ], [ 1, [[BB3]] ], [ 0, [[BB2]] ], [ undef, [[START:%.*]] ]
-; CHECK-NEXT:    [[_0_SROA_0_0:%.*]] = phi i1 [ true, [[BB10]] ], [ true, [[BB9]] ], [ true, [[BB8]] ], [ true, [[BB7]] ], [ true, [[BB6]] ], [ true, [[BB5]] ], [ true, [[BB4]] ], [ true, [[BB3]] ], [ true, [[BB2]] ], [ false, [[START]] ]
+; CHECK-NEXT:    [[SWITCH_TABLEIDX:%.*]] = sub i8 [[CHARACTER]], 48
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i8 [[SWITCH_TABLEIDX]], 9
+; CHECK-NEXT:    [[_0_SROA_11_0:%.*]] = select i1 [[TMP2]], i8 [[SWITCH_TABLEIDX]], i8 undef
+; CHECK-NEXT:    [[_0_SROA_0_0:%.*]] = select i1 [[TMP2]], i1 true, i1 false
 ; CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { i1, i8 } poison, i1 [[_0_SROA_0_0]], 0
 ; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { i1, i8 } [[TMP0]], i8 [[_0_SROA_11_0]], 1
 ; CHECK-NEXT:    ret { i1, i8 } [[TMP1]]



More information about the llvm-commits mailing list