Why doesn't g++ optimize local constexpr array access?
I have following c++ code:
inline int choose(int i){
static constexpr int arr={1,3,3,2,4,1,4};
return arr[i];
}
void f(int);
int main(){
for(int i=0;i<5;i++){
f(choose(i));
}
}
When I compile this with g++ 8.2 with option -O3, it produces well-optimized asm code. However, when I change the second line from static constexpr
to constexpr
, which should be semantically the same, it no longer optimizes array access, and produces somewhat inefficient asm code.
Does anyone have any idea why this happens?
c++ g++ compiler-optimization
add a comment |
I have following c++ code:
inline int choose(int i){
static constexpr int arr={1,3,3,2,4,1,4};
return arr[i];
}
void f(int);
int main(){
for(int i=0;i<5;i++){
f(choose(i));
}
}
When I compile this with g++ 8.2 with option -O3, it produces well-optimized asm code. However, when I change the second line from static constexpr
to constexpr
, which should be semantically the same, it no longer optimizes array access, and produces somewhat inefficient asm code.
Does anyone have any idea why this happens?
c++ g++ compiler-optimization
My guess, when the array is static the compiler knows where it will be whenever the function is called so it can unroll the loop and optimize away the function call and array access. When it is not static to location of the array can change so it can't/wont provide the optimization.
– NathanOliver
Nov 26 '18 at 13:48
@NathanOliver But when we writeconstexpr
variable we don't expect it to be "real variable" (hence have memory address in stack or anywhere), so the compiler should be able to put it wherever it likes...
– eivour
Nov 26 '18 at 13:57
constexpr
is there mostly to express intent, so that the compiler can stop you when you try something that can't be done compile-time. It's more for the programmer than the compiler, which can (should) already see what can and cannot be optimized. As to the question - would "it's an improvement opportunity in GCC" be a sufficient answer?
– rustyx
Nov 26 '18 at 14:07
add a comment |
I have following c++ code:
inline int choose(int i){
static constexpr int arr={1,3,3,2,4,1,4};
return arr[i];
}
void f(int);
int main(){
for(int i=0;i<5;i++){
f(choose(i));
}
}
When I compile this with g++ 8.2 with option -O3, it produces well-optimized asm code. However, when I change the second line from static constexpr
to constexpr
, which should be semantically the same, it no longer optimizes array access, and produces somewhat inefficient asm code.
Does anyone have any idea why this happens?
c++ g++ compiler-optimization
I have following c++ code:
inline int choose(int i){
static constexpr int arr={1,3,3,2,4,1,4};
return arr[i];
}
void f(int);
int main(){
for(int i=0;i<5;i++){
f(choose(i));
}
}
When I compile this with g++ 8.2 with option -O3, it produces well-optimized asm code. However, when I change the second line from static constexpr
to constexpr
, which should be semantically the same, it no longer optimizes array access, and produces somewhat inefficient asm code.
Does anyone have any idea why this happens?
c++ g++ compiler-optimization
c++ g++ compiler-optimization
asked Nov 26 '18 at 13:45
eivoureivour
726616
726616
My guess, when the array is static the compiler knows where it will be whenever the function is called so it can unroll the loop and optimize away the function call and array access. When it is not static to location of the array can change so it can't/wont provide the optimization.
– NathanOliver
Nov 26 '18 at 13:48
@NathanOliver But when we writeconstexpr
variable we don't expect it to be "real variable" (hence have memory address in stack or anywhere), so the compiler should be able to put it wherever it likes...
– eivour
Nov 26 '18 at 13:57
constexpr
is there mostly to express intent, so that the compiler can stop you when you try something that can't be done compile-time. It's more for the programmer than the compiler, which can (should) already see what can and cannot be optimized. As to the question - would "it's an improvement opportunity in GCC" be a sufficient answer?
– rustyx
Nov 26 '18 at 14:07
add a comment |
My guess, when the array is static the compiler knows where it will be whenever the function is called so it can unroll the loop and optimize away the function call and array access. When it is not static to location of the array can change so it can't/wont provide the optimization.
– NathanOliver
Nov 26 '18 at 13:48
@NathanOliver But when we writeconstexpr
variable we don't expect it to be "real variable" (hence have memory address in stack or anywhere), so the compiler should be able to put it wherever it likes...
– eivour
Nov 26 '18 at 13:57
constexpr
is there mostly to express intent, so that the compiler can stop you when you try something that can't be done compile-time. It's more for the programmer than the compiler, which can (should) already see what can and cannot be optimized. As to the question - would "it's an improvement opportunity in GCC" be a sufficient answer?
– rustyx
Nov 26 '18 at 14:07
My guess, when the array is static the compiler knows where it will be whenever the function is called so it can unroll the loop and optimize away the function call and array access. When it is not static to location of the array can change so it can't/wont provide the optimization.
– NathanOliver
Nov 26 '18 at 13:48
My guess, when the array is static the compiler knows where it will be whenever the function is called so it can unroll the loop and optimize away the function call and array access. When it is not static to location of the array can change so it can't/wont provide the optimization.
– NathanOliver
Nov 26 '18 at 13:48
@NathanOliver But when we write
constexpr
variable we don't expect it to be "real variable" (hence have memory address in stack or anywhere), so the compiler should be able to put it wherever it likes...– eivour
Nov 26 '18 at 13:57
@NathanOliver But when we write
constexpr
variable we don't expect it to be "real variable" (hence have memory address in stack or anywhere), so the compiler should be able to put it wherever it likes...– eivour
Nov 26 '18 at 13:57
constexpr
is there mostly to express intent, so that the compiler can stop you when you try something that can't be done compile-time. It's more for the programmer than the compiler, which can (should) already see what can and cannot be optimized. As to the question - would "it's an improvement opportunity in GCC" be a sufficient answer?– rustyx
Nov 26 '18 at 14:07
constexpr
is there mostly to express intent, so that the compiler can stop you when you try something that can't be done compile-time. It's more for the programmer than the compiler, which can (should) already see what can and cannot be optimized. As to the question - would "it's an improvement opportunity in GCC" be a sufficient answer?– rustyx
Nov 26 '18 at 14:07
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53482467%2fwhy-doesnt-g-optimize-local-constexpr-array-access%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53482467%2fwhy-doesnt-g-optimize-local-constexpr-array-access%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
My guess, when the array is static the compiler knows where it will be whenever the function is called so it can unroll the loop and optimize away the function call and array access. When it is not static to location of the array can change so it can't/wont provide the optimization.
– NathanOliver
Nov 26 '18 at 13:48
@NathanOliver But when we write
constexpr
variable we don't expect it to be "real variable" (hence have memory address in stack or anywhere), so the compiler should be able to put it wherever it likes...– eivour
Nov 26 '18 at 13:57
constexpr
is there mostly to express intent, so that the compiler can stop you when you try something that can't be done compile-time. It's more for the programmer than the compiler, which can (should) already see what can and cannot be optimized. As to the question - would "it's an improvement opportunity in GCC" be a sufficient answer?– rustyx
Nov 26 '18 at 14:07