[flang] Fix invalid branch optimization
Branch optimization in function rewriteIfGotos attempts to rewrite code such as <<IfConstruct>> 1 If[Then]Stmt: if(cond) goto L 2 GotoStmt: goto L 3 EndIfStmt <<End IfConstruct>> 4 Statement: ... 5 Statement: ... 6 Statement: L ... to eliminate a branch and a trivial basic block to get: <<IfConstruct>> 1 If[Then]Stmt [negate]: if(cond) goto L 4 Statement: ... 5 Statement: ... 3 EndIfStmt <<End IfConstruct>> 6 Statement: L ... Among other requirements, this is invalid if any statement between the GOTO and its target is an intermediate construct statement such as a CASE or ELSE IF statement, like the CASE DEFAULT statement in: select case(i) case (:2) n = i * 10 case (5:) n = i * 1000 if (i <= 6) goto 9 ! exit over 'case default'; may not be rewritten n = i * 10000 case default n = i * 100 9 end select
Loading
Please sign in to comment