Author: Kohei Asano Date: 2023-09-18T08:45:43+02:00 New Revision: d0eb9b83e8d604ac66befadc5551eee07f9d0bbf
URL: https://github.com/llvm/llvm-project/commit/d0eb9b83e8d604ac66befadc5551eee07f9d0bbf DIFF: https://github.com/llvm/llvm-project/commit/d0eb9b83e8d604ac66befadc5551eee07f9d0bbf.diff LOG: [SimplifyCFG] handle monotonic wrapped case for D150943 (#65882) (cherry picked from commit fef82492209b24fd0b36a199657f3ed822e601a6) Added: Modified: llvm/lib/Transforms/Utils/SimplifyCFG.cpp llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll Removed: ################################################################################ diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index d3a9a41aef1533d..bd7ab7c9878179c 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -6051,8 +6051,9 @@ SwitchLookupTable::SwitchLookupTable( bool LinearMappingPossible = true; APInt PrevVal; APInt DistToPrev; - // When linear map is monotonic, we can attach nsw. - bool Wrapped = false; + // When linear map is monotonic and signed overflow doesn't happen on + // maximum index, we can attach nsw on Add and Mul. + bool NonMonotonic = false; assert(TableSize >= 2 && "Should be a SingleValue table."); // Check if there is the same distance between two consecutive values. for (uint64_t I = 0; I < TableSize; ++I) { @@ -6072,7 +6073,7 @@ SwitchLookupTable::SwitchLookupTable( LinearMappingPossible = false; break; } - Wrapped |= + NonMonotonic |= Dist.isStrictlyPositive() ? Val.sle(PrevVal) : Val.sgt(PrevVal); } PrevVal = Val; @@ -6080,7 +6081,10 @@ SwitchLookupTable::SwitchLookupTable( if (LinearMappingPossible) { LinearOffset = cast<ConstantInt>(TableContents[0]); LinearMultiplier = ConstantInt::get(M.getContext(), DistToPrev); - LinearMapValWrapped = Wrapped; + bool MayWrap = false; + APInt M = LinearMultiplier->getValue(); + (void)M.smul_ov(APInt(M.getBitWidth(), TableSize - 1), MayWrap); + LinearMapValWrapped = NonMonotonic || MayWrap; Kind = LinearMapKind; ++NumLinearMaps; return; diff --git a/llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll b/llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll index 962757f03eff228..731ca4644044c54 100644 --- a/llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll +++ b/llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll @@ -2039,3 +2039,32 @@ return: %x = phi i8 [ 3, %sw.default ], [ 124, %sw.bb3 ], [ -99, %sw.bb2 ], [ -66, %sw.bb1 ], [ -33, %entry ] ret i8 %x } + +define i8 @linearmap_dec_wrapped_mon(i3 %0) { +; CHECK-LABEL: @linearmap_dec_wrapped_mon( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[SWITCH_TABLEIDX:%.*]] = sub i3 [[TMP0:%.*]], -2 +; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i3 [[SWITCH_TABLEIDX]], -4 +; CHECK-NEXT: [[SWITCH_IDX_MULT:%.*]] = mul i3 [[SWITCH_TABLEIDX]], 2 +; CHECK-NEXT: [[SWITCH_OFFSET:%.*]] = add i3 [[SWITCH_IDX_MULT]], -4 +; CHECK-NEXT: [[COND:%.*]] = select i1 [[TMP1]], i3 [[SWITCH_OFFSET]], i3 2 +; CHECK-NEXT: [[CONV:%.*]] = sext i3 [[COND]] to i8 +; CHECK-NEXT: ret i8 [[CONV]] +; +entry: + switch i3 %0, label %cond.end [ + i3 -1, label %cond.false + i3 -2, label %cond.false + i3 1, label %cond.false + i3 0, label %cond.false + ] + +cond.false: ; preds = %entry, %entry, %entry, %entry + %mul = shl nsw i3 %0, 1 + br label %cond.end + +cond.end: ; preds = %entry, %cond.false + %cond = phi i3 [ %mul, %cond.false ], [ 2, %entry ] + %conv = sext i3 %cond to i8 + ret i8 %conv +} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits