diff --git a/llvm/test/Transforms/SimplifyCFG/common-code-hoisting.ll b/llvm/test/Transforms/SimplifyCFG/common-code-hoisting.ll index ff42d1b3e27117..c8bdba512ee222 100644 --- a/llvm/test/Transforms/SimplifyCFG/common-code-hoisting.ll +++ b/llvm/test/Transforms/SimplifyCFG/common-code-hoisting.ll @@ -108,3 +108,50 @@ for.end: return: ret void } + +; A example where only the branch instructions from %if.then2 and %if.end3 need +; to be hoisted, which effectively replaces the original branch in %if.end. As +; this does not add any new instructions to the hoist location, it should always be profitable. +define float @clamp_float_value(float %value, float %minimum_value, float %maximum_value) { +; HOIST-LABEL: @clamp_float_value( +; HOIST-NEXT: entry: +; HOIST-NEXT: [[CMP:%.*]] = fcmp ogt float [[VALUE:%.*]], [[MAXIMUM_VALUE:%.*]] +; HOIST-NEXT: [[CMP1:%.*]] = fcmp olt float [[VALUE]], [[MINIMUM_VALUE:%.*]] +; HOIST-NEXT: [[MINIMUM_VALUE_VALUE:%.*]] = select i1 [[CMP1]], float [[MINIMUM_VALUE]], float [[VALUE]] +; HOIST-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], float [[MAXIMUM_VALUE]], float [[MINIMUM_VALUE_VALUE]] +; HOIST-NEXT: ret float [[RETVAL_0]] +; +; NOHOIST-LABEL: @clamp_float_value( +; NOHOIST-NEXT: entry: +; NOHOIST-NEXT: [[CMP:%.*]] = fcmp ogt float [[VALUE:%.*]], [[MAXIMUM_VALUE:%.*]] +; NOHOIST-NEXT: br i1 [[CMP]], label [[RETURN:%.*]], label [[IF_END:%.*]] +; NOHOIST: if.end: +; NOHOIST-NEXT: [[CMP1:%.*]] = fcmp olt float [[VALUE]], [[MINIMUM_VALUE:%.*]] +; NOHOIST-NEXT: br i1 [[CMP1]], label [[RETURN]], label [[IF_END3:%.*]] +; NOHOIST: if.end3: +; NOHOIST-NEXT: br label [[RETURN]] +; NOHOIST: return: +; NOHOIST-NEXT: [[RETVAL_0:%.*]] = phi float [ [[VALUE]], [[IF_END3]] ], [ [[MAXIMUM_VALUE]], [[ENTRY:%.*]] ], [ [[MINIMUM_VALUE]], [[IF_END]] ] +; NOHOIST-NEXT: ret float [[RETVAL_0]] +; +entry: + %cmp = fcmp ogt float %value, %maximum_value + br i1 %cmp, label %if.then, label %if.end + +if.then: ; preds = %entry + br label %return + +if.end: ; preds = %entry + %cmp1 = fcmp olt float %value, %minimum_value + br i1 %cmp1, label %if.then2, label %if.end3 + +if.then2: ; preds = %if.end + br label %return + +if.end3: ; preds = %if.end + br label %return + +return: ; preds = %if.end3, %if.then2, %if.then + %retval.0 = phi float [ %maximum_value, %if.then ], [ %minimum_value, %if.then2 ], [ %value, %if.end3 ] + ret float %retval.0 +}