diff options
| author | Zhaoshi Zheng <zhaoshiz@coduaurora.org> | 2018-09-26 00:59:09 +0000 | 
|---|---|---|
| committer | Zhaoshi Zheng <zhaoshiz@coduaurora.org> | 2018-09-26 00:59:09 +0000 | 
| commit | 95710337b4dfc77fc9a92eb21168b8bbd62df88a (patch) | |
| tree | bd6f883084f58397eaa7b0e446cf4f0654564403 /llvm/test/CodeGen | |
| parent | c949857a7f4e08ff29db8e542e98884c044bf1ce (diff) | |
| download | bcm5719-llvm-95710337b4dfc77fc9a92eb21168b8bbd62df88a.tar.gz bcm5719-llvm-95710337b4dfc77fc9a92eb21168b8bbd62df88a.zip  | |
Revert "Revert "[ConstHoist] Do not rebase single (or few) dependent constant""
This reverts commit bd7b44f35ee9fbe365eb25ce55437ea793b39346.
Reland r342994: disabled the optimization and explicitly enable it in test.
-mllvm -consthoist-min-num-to-rebase<unsigned>=0
[ConstHoist] Do not rebase single (or few) dependent constant
If an instance (InsertionPoint or IP) of Base constant A has only one or few
rebased constants depending on it, do NOT rebase. One extra ADD instruction is
required to materialize each rebased constant, assuming A and the rebased have
the same materialization cost.
Differential Revision: https://reviews.llvm.org/D52243
llvm-svn: 343053
Diffstat (limited to 'llvm/test/CodeGen')
| -rw-r--r-- | llvm/test/CodeGen/Thumb/consthoist-few-dependents.ll | 191 | 
1 files changed, 191 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/Thumb/consthoist-few-dependents.ll b/llvm/test/CodeGen/Thumb/consthoist-few-dependents.ll new file mode 100644 index 00000000000..4141cf38a93 --- /dev/null +++ b/llvm/test/CodeGen/Thumb/consthoist-few-dependents.ll @@ -0,0 +1,191 @@ +; RUN: opt -consthoist -S %s -o - | FileCheck %s --check-prefix=OPT +; RUN: opt -consthoist -S -consthoist-min-num-to-rebase=1 %s -o - | FileCheck %s --check-prefix=OPT --check-prefix=OPT-1 +; RUN: opt -consthoist -S -consthoist-min-num-to-rebase=2 %s -o - | FileCheck %s --check-prefix=OPT --check-prefix=OPT-2 +; RUN: opt -consthoist -S -consthoist-min-num-to-rebase=3 %s -o - | FileCheck %s --check-prefix=OPT --check-prefix=OPT-3 + +; RUN: llc -consthoist-min-num-to-rebase=2 %s -o - | FileCheck %s --check-prefix=LLC + +target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" +target triple = "thumbv6m-none-unknown-musleabi" + +; Test that constant 0 and 1 of i1 type is NOT hoisted due low +; materializing cost. + +; OPT-LABEL: avalon +; OPT: bb1: +; OPT: store i1 true +; OPT: bb2: +; OPT: store i1 false +; OPT: bb3: +; OPT: store i1 false +; OPT: store i1 false +; OPT-NOT: add + +; LLC-LABEL: avalon +; LLC-DAG: movs r{{[0-9]+}}, #0 +; LLC-DAG: movs r{{[0-9]+}}, #0 +; LLC-DAG: movs r{{[0-9]+}}, #1 +; LLC-NOT: add + +@global = local_unnamed_addr global i1 undef, align 1 +@global.0 = local_unnamed_addr global i1 undef, align 1 + +define void @avalon() #0 { +bb: +  switch i8 undef, label %bb5 [ +    i8 0, label %bb1 +    i8 -1, label %bb2 +    i8 1, label %bb3 +  ] + +bb1: +  store i1 1, i1* @global, align 1 +  unreachable + +bb2: +  store i1 0, i1* @global, align 1 +  unreachable + +bb3: +  store i1 0, i1* @global.0, align 1 +  store i1 0, i1* @global, align 1 +  unreachable + +bb5: +  ret void +} + +; Test that for i8 type, constant -1 is not rebased since it's the only +; dependent of base constant -2. +; This test is also covered by r342898, see +; test/CodeGen/Thumb/consthoist-imm8-costs-1.ll + +; OPT-2-LABEL: barney +; OPT-2: bb1: +; OPT-2: store i8 -1 +; OPT-2: bb2: +; OPT-2: store i8 -2 +; OPT-2: bb3: +; OPT-2: store i8 -2 +; OPT-2: store i8 -2 +; OPT-2-NOT: add + +; LLC-LABEL: barney +; LLC-DAG: movs r{{[0-9]+}}, #254 +; LLC-DAG: movs r{{[0-9]+}}, #255 +; LLC-NOT: mvn +; LLC-NOT: add + +@global.1 = local_unnamed_addr global i8 undef, align 1 +@global.2 = local_unnamed_addr global i8 undef, align 1 + +define void @barney() #0 { +bb: +  switch i8 undef, label %bb5 [ +    i8 0, label %bb1 +    i8 -1, label %bb2 +    i8 1, label %bb3 +  ] + +bb1:                                              ; preds = %bb +  store i8 -1, i8* @global.1, align 1 +  unreachable + +bb2:                                              ; preds = %bb +  store i8 -2, i8* @global.1, align 1 +  unreachable + +bb3:                                              ; preds = %bb +  store i8 -2, i8* @global.2, align 1 +  store i8 -2, i8* @global.1, align 1 +  unreachable + +bb5:                                              ; preds = %bb +  ret void +} + +; Test that for i16 type constant 65532 is not rebased if it's the only +; dependent of base constant 65531. Cost would be the same if rebased. +; If rebased, 3 two-byte instructions: +;   movs    r0, #4 +;   mvns    r0, r0 +;   adds    r0, r0, #1 +; If NOT rebased, 1 two-byte instruction plus 1 four-byte CP entry: +;           ldr     r1, .LCPI2_3 +;           ... +;   .LCPI2_3: +;           .long   65532 + +; OPT-LABEL: carla + +; -consthoist-min-num-to-rebase=1, check that 65532 and single use of 65531 +; in bb2 is rebased +; OPT-1: bb1: +; OPT-1: %[[C1:const[0-9]?]] = bitcast i16 -5 to i16 +; OPT-1-NEXT: %const_mat = add i16 %[[C1]], 1 +; OPT-1-NEXT: store i16 %const_mat, i16* @global.3, align 1 +; OPT-1: bb2: +; OPT-1-NEXT: %[[C2:const[0-9]?]] = bitcast i16 -5 to i16 +; OPT-1-NEXT: store i16 %[[C2]], i16* @global.3, align 1 +; OPT-1: bb3: +; OPT-1-NEXT: %[[C3:const[0-9]?]] = bitcast i16 -5 to i16 +; OPT-1-NEXT: store i16 %[[C3]], i16* @global.4, align 1 +; OPT-1-NEXT: store i16 %[[C3]], i16* @global.3, align 1 + +; -consthoist-min-num-to-rebase=2, check that 65532 and single use of 65531 +; in bb2 is not rebased +; OPT-2: bb1: +; OPT-2-NEXT: store i16 -4, i16* @global.3, align 1 +; OPT-2: bb2: +; OPT-2-NEXT: store i16 -5, i16* @global.3, align 1 +; OPT-2: bb3: +; OPT-2-NEXT:   %[[C4:const[0-9]?]] = bitcast i16 -5 to i16 +; OPT-2-NEXT:   store i16 %[[C4]], i16* @global.4, align 1 +; OPT-2-NEXT:   store i16 %[[C4]], i16* @global.3, align 1 +; OPT-2-NOT: add + +; -consthoist-min-num-to-rebase=3, check that dual uses of 65531 in bb3 are +; not rebase +; OPT-3: bb1: +; OPT-3-NEXT: store i16 -4, i16* @global.3, align 1 +; OPT-3: bb2: +; OPT-3-NEXT: store i16 -5, i16* @global.3, align 1 +; OPT-3: bb3: +; OPT-3-NEXT:   store i16 -5, i16* @global.4, align 1 +; OPT-3-NEXT:   store i16 -5, i16* @global.3, align 1 +; OPT-3-NOT: add +; OPT-3-NOT: bitcast + +; LLC-LABEL: carla +; LLC-DAG: ldr r{{[0-9]+}}, .LCPI2_1 +; LLC-DAG: ldr r{{[0-9]+}}, .LCPI2_3 +; LLC-NOT: mvn +; LLC-NOT: add + +@global.3 = local_unnamed_addr global i16 undef, align 2 +@global.4 = local_unnamed_addr global i16 undef, align 2 + +define void @carla() { +bb: +  switch i8 undef, label %bb5 [ +    i8 0, label %bb1 +    i8 -1, label %bb2 +    i8 1, label %bb3 +  ] + +bb1:                                              ; preds = %bb +  store i16 65532, i16* @global.3, align 1 +  unreachable + +bb2:                                              ; preds = %bb +  store i16 65531, i16* @global.3, align 1 +  unreachable + +bb3:                                              ; preds = %bb +  store i16 65531, i16* @global.4, align 1 +  store i16 65531, i16* @global.3, align 1 +  unreachable + +bb5:                                              ; preds = %bb +  ret void +}  | 

